From 14834522e0cd5af05f34d50c006b5a4f8b36fec7 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sun, 14 Sep 2025 00:18:12 +0200 Subject: [PATCH 1/3] GLSP-1363 Refactor CLI application Remove dependency to shelljs for CLI application, refactor release/releng commands and introduce bundling with esbuild ## Remove dependency to shelljs Shelljs has some issues in its core architecture which prevent it from proper bundling. We only use a very small subset of shelljs features. Therefore I opted for removing the dependency alltogether and introduce replacement functions in our utility library that directly use node builtins under the hood ## Refactor release/releng commands - Remove the existing release commands and introduce a new set of releng commands that can also be used in CI and enable (partly) automated releases - These commands have already been used for the 2.5.0 release (i.e. have been tested and work) - Introduce helpers for working with (reading, updating etc.) workspace package jsons ## Bundle application with es build - Introduce bundling with es build for the CLI package - Package is now dependency free and ships the CLI app in one bundle (+ source maps) - Update package scripts accordingly - Introduce proper watch mode for CLI package - Introduce vs code lauch config for debugin the CLI application. When starting the config the desired arguments/commands can be passed via input box ## Add workflows - Add dispatch workflow to trigger a new release preparation PR for a repository Fixes eclipse-glsp/glsp/issues/1363 --- .eslintignore | 11 + .eslintrc.js | 1 - .github/PULL_REQUEST_TEMPLATE.md | 4 +- .github/workflows/prepare-release.yml | 92 ++ .gitignore | 1 + .prettierignore | 17 + .vscode/launch.json | 24 + CODE_OF_CONDUCT.md | 1 + dev-packages/README.md | 1 + dev-packages/cli/README.md | 181 ++- dev-packages/cli/esbuild.js | 89 ++ dev-packages/cli/package.json | 45 +- dev-packages/cli/src/{app.ts => cli.ts} | 18 +- dev-packages/cli/src/commands/check-header.ts | 50 +- .../cli/src/commands/coverage-report.ts | 74 +- .../cli/src/commands/generate-index.ts | 16 +- .../cli/src/commands/release/common.ts | 306 ----- .../src/commands/release/release-client.ts | 55 - .../release/release-eclipse-integration.ts | 113 -- .../commands/release/release-java-server.ts | 73 -- .../commands/release/release-server-node.ts | 61 - .../release/release-theia-integration.ts | 65 -- .../release/release-vscode-integration.ts | 67 -- .../cli/src/commands/release/release.ts | 215 ---- .../cli/src/commands/releng/common.ts | 258 ++++ .../cli/src/commands/releng/prepare.ts | 247 ++++ .../cli/src/commands/releng/publish.ts | 125 ++ .../cli/src/commands/releng/releng.ts | 27 + .../cli/src/commands/releng/version.ts | 300 +++++ dev-packages/cli/src/commands/update-next.ts | 104 +- dev-packages/cli/src/util/command-util.ts | 54 - dev-packages/cli/src/util/file-util.ts | 227 ++++ dev-packages/cli/src/util/git-util.ts | 98 +- dev-packages/cli/src/util/index.ts | 22 + dev-packages/cli/src/util/package-util.ts | 154 +++ dev-packages/cli/src/util/process-util.ts | 219 ++++ dev-packages/cli/src/util/validation-util.ts | 22 +- dev-packages/cli/tsconfig.json | 2 +- .../eslint-config/configs/errors.eslintrc.js | 4 +- package.json | 16 +- tsconfig.eslint.json | 3 +- yarn.lock | 1035 +++++------------ 42 files changed, 2476 insertions(+), 2021 deletions(-) create mode 100644 .eslintignore create mode 100644 .github/workflows/prepare-release.yml create mode 100644 .prettierignore create mode 100644 .vscode/launch.json create mode 100644 dev-packages/cli/esbuild.js rename dev-packages/cli/src/{app.ts => cli.ts} (78%) delete mode 100644 dev-packages/cli/src/commands/release/common.ts delete mode 100644 dev-packages/cli/src/commands/release/release-client.ts delete mode 100644 dev-packages/cli/src/commands/release/release-eclipse-integration.ts delete mode 100644 dev-packages/cli/src/commands/release/release-java-server.ts delete mode 100644 dev-packages/cli/src/commands/release/release-server-node.ts delete mode 100644 dev-packages/cli/src/commands/release/release-theia-integration.ts delete mode 100644 dev-packages/cli/src/commands/release/release-vscode-integration.ts delete mode 100644 dev-packages/cli/src/commands/release/release.ts create mode 100644 dev-packages/cli/src/commands/releng/common.ts create mode 100644 dev-packages/cli/src/commands/releng/prepare.ts create mode 100644 dev-packages/cli/src/commands/releng/publish.ts create mode 100644 dev-packages/cli/src/commands/releng/releng.ts create mode 100644 dev-packages/cli/src/commands/releng/version.ts delete mode 100644 dev-packages/cli/src/util/command-util.ts create mode 100644 dev-packages/cli/src/util/file-util.ts create mode 100644 dev-packages/cli/src/util/index.ts create mode 100644 dev-packages/cli/src/util/package-util.ts create mode 100644 dev-packages/cli/src/util/process-util.ts diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..bc0daab --- /dev/null +++ b/.eslintignore @@ -0,0 +1,11 @@ +# Compiled output +**/dist/ +**/lib/ +**/node_modules/ + +# Build files +**/.eslintrc.js +**/esbuild.js + +# Other generated files +**/*.map \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index dcde970..0149f8c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,7 +2,6 @@ module.exports = { root: true, extends: '@eclipse-glsp', - ignorePatterns: ['**/{node_modules,lib}', '**/.eslintrc.js'], parserOptions: { tsconfigRootDir: __dirname, diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1d326d0..2eebb49 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,5 +25,5 @@ to learn how to report vulnerabilities. -- [ ] This PR should be mentioned in the changelog -- [ ] This PR introduces a breaking change (if yes, provide more details below for the changelog and the migration guide) +- [ ] This PR should be mentioned in the changelog +- [ ] This PR introduces a breaking change (if yes, provide more details below for the changelog and the migration guide) diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 0000000..878a14d --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,92 @@ +name: Prepare Release + +on: + workflow_dispatch: + inputs: + release_type: + description: 'Release type (major, minor, patch, next, or custom)' + required: true + type: choice + options: + - major + - minor + - patch + - next + - custom + custom_version: + description: 'Custom version (required if release_type is custom)' + required: false + type: string + release_repo: + description: 'GLSP repository to release' + required: true + type: choice + options: + - glsp + - glsp-client + - glsp-theia-integration + - glsp-server + - glsp-server-node + - glsp-eclipse-integration + - glsp-vscode-integration + - glsp-playwright + branch: + description: 'Branch to use for the release repo (default: default branch)' + required: false + type: string + draft: + description: 'Create PR as draft' + required: false + type: boolean + default: false + +jobs: + release: + runs-on: ubuntu-latest + steps: + - name: Checkout release helper repo (@eclipse-glsp/glsp) + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: eclipse-glsp/glsp + path: glsp-release-helper + + - name: Checkout release repo (${{ github.event.inputs.release_repo }}) + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: eclipse-glsp/${{ github.event.inputs.release_repo }} + path: release-repo + ref: ${{ github.event.inputs.branch }} + + - name: Set up Node.js + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 + with: + node-version: 20 + + - name: Install Yarn + run: npm install -g yarn + + - name: Install dependencies in glsp-release-helper + working-directory: ./glsp-release-helper + run: yarn install + + - name: Configure Git + run: | + git config --global user.name "eclipse-glsp-bot" + git config --global user.email "57175764+eclipse-glsp-bot@users.noreply.github.com" + + - name: Prepare release + id: prepare_release + working-directory: ./glsp-release-helper + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + DRAFT_FLAG="" + if [[ "${{ github.event.inputs.draft }}" == "true" ]]; then + DRAFT_FLAG="-d" + fi + + if [[ "${{ github.event.inputs.release_type }}" == "custom" ]]; then + yarn glsp releng prepare custom "${{ github.event.inputs.custom_version }}" -r ${{ github.workspace }}/release-repo $DRAFT_FLAG + else + yarn glsp releng prepare "${{ github.event.inputs.release_type }}" -r ${{ github.workspace }}/release-repo $DRAFT_FLAG + fi diff --git a/.gitignore b/.gitignore index a61f277..49cc49f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ node_modules/ *.log lib +dist tsconfig.tsbuildinfo eslint.xml diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..b50995a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,17 @@ +# Dependencies +node_modules/ + +# Build outputs +lib/ +dist/ + +# Generated files +*.min.js +*.min.css + +# Lock files +package-lock.json +yarn.lock + +# Logs +*.log \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f554902 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug GLSP CLI", + "type": "node", + "request": "launch", + "program": "${workspaceFolder}/dev-packages/cli/dist/cli.js", + "args": "${input:cliArgs}", + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "sourceMaps": true, + "outFiles": ["${workspaceFolder}/dev-packages/cli/dist/*.js"] + } + ], + "inputs": [ + { + "id": "cliArgs", + "description": "CLI arguments (space-separated, e.g., 'checkHeaders ./')", + "default": "", + "type": "promptString" + } + ] +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d0174bf..9210738 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -5,6 +5,7 @@ Version 1.2 August 19, 2020 ## Our Pledge + In the interest of fostering an open and welcoming environment, we as community members, contributors, committers, and project leaders pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. diff --git a/dev-packages/README.md b/dev-packages/README.md index e331619..fed630d 100644 --- a/dev-packages/README.md +++ b/dev-packages/README.md @@ -1,4 +1,5 @@ # Eclipse GLSP - Dev Packages [![build-status](https://img.shields.io/jenkins/build?jobUrl=https://ci.eclipse.org/glsp/job/eclipse-glsp/job/glsp/job/master)](https://ci.eclipse.org/glsp/job/eclipse-glsp/job/glsp-client/job/master) + Common shared development packages for Eclipse GLSP components that are implemented with Typescript. ## Components diff --git a/dev-packages/cli/README.md b/dev-packages/cli/README.md index 6ca2665..ae895c0 100644 --- a/dev-packages/cli/README.md +++ b/dev-packages/cli/README.md @@ -11,6 +11,24 @@ Install `@eclipse-glsp/cli` as a dev dependency in your application. yarn add @eclipse-glsp/cli --dev ``` +## Usage + +```console +Usage: glsp [options] [command] + +Options: + -V, --version output the version number + -h, --help display help for command + +Commands: + coverageReport [options] Generate a test coverage report for a glsp component + checkHeaders [options] Validates the copyright year range (end year) of license header files + updateNext|u [options] [rootDir] Updates all `next` dependencies in GLSP project to the latest version + generateIndex [options] Generate index files in a given source directory. + releng Commands for GLSP release engineering (Linux only, intended for CI/Maintainer use). + help [command] display help for command +``` + ## checkHeaders The `checkHeaders` command can be used to validate the copyright year (range) of license headers. @@ -23,19 +41,21 @@ $ glsp checkHeaders -h Usage: glsp checkHeaders [options] -Validates the copyright year range of license header files +Validates the copyright year range (end year) of license header files Arguments: rootDir The starting directory for the check Options: - -t, --type The scope of the check. In addition to a full recursive check, is also possible to only consider pending changes or the last commit (choices: "full", "changes", "lastCommit", default: - "full") + -t, --type The scope of the check. In addition to a full recursive check, is also possible to only + consider pending changes or the last commit (choices: "full", "changes", "lastCommit", + default: "full") -f, --fileExtensions File extensions that should be checked (default: ["ts","tsx"]) - -e, --exclude File patterns that should be excluded from the check. New exclude patterns are added to the default patterns (default: [**/@(node_modules|lib|dist|bundle)/**]) - --no-exclude-defaults Disables the default excludes patterns. Only explicitly passed exclude patterns (-e, --exclude) are considered + -e, --exclude File patterns that should be excluded from the check. New exclude patterns are added to + the default patterns (default: [**/@(node_modules|lib|dist|bundle)/**]) + --no-exclude-defaults Disables the default excludes patterns. Only explicitly passed exclude patterns (-e, + --exclude) are considered -j, --json Also persist validation results as json file (default: false) - -s, --severity The severity of validation results that should be printed. (choices: "error", "warn", "ok", default: "error" (only)) -a, --autoFix Auto apply & commit fixes without prompting the user (default: false) -h, --help display help for command ``` @@ -52,37 +72,12 @@ Usage: glsp coverageReport [options] Generate a test coverage report for a glsp component Options: - -p, --projectRoot The root directory of the GLSP component (default: "") + -p, --projectRoot The root directory of the GLSP component (default: + "") -c, --coverageScript