From ad279efd90c7e01cdcae32a36f729a8299c2467c Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Thu, 9 Oct 2025 07:42:13 +0000 Subject: [PATCH] build: use @angular/language-service from source (#64306) This commit updates the VSCode Angular Language Service extension to use the `@angular/language-service` package built from source within the workspace, rather than a version downloaded from npm. This change simplifies development and testing by ensuring the extension always uses the latest code from the local repository. The Bazel build configuration, VSCode launch settings, and e2e tests have been updated to reflect this change. PR Close #64306 --- .vscode/launch.json | 2 +- pnpm-lock.yaml | 28 +++++++------------ vscode-ng-language-service/BUILD.bazel | 21 +++++++------- vscode-ng-language-service/common/resolver.ts | 3 +- .../integration/e2e/BUILD.bazel | 2 +- .../integration/e2e/index.ts | 2 +- vscode-ng-language-service/package.json | 8 +++--- vscode-ng-language-service/server/BUILD.bazel | 13 +++++++-- .../server/package.json | 2 +- 9 files changed, 40 insertions(+), 41 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 97ad8d08213..49d3780bb4e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -20,7 +20,7 @@ "runtimeExecutable": "${execPath}", "args": [ "--disable-extensions", - "--extensionDevelopmentPath=${workspaceFolder}/dist/bin/vscode-ng-language-service/npm/vscode-ng-language-service/vsix_sandbox" + "--extensionDevelopmentPath=${workspaceFolder}/dist/bin/vscode-ng-language-service/development_package" ], "preLaunchTask": "VSCE: package" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81f30a583c9..60a294f9d2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1305,12 +1305,9 @@ importers: vscode-ng-language-service: dependencies: '@angular/language-service': - specifier: 21.0.0-next.7 - version: 21.0.0-next.7 + specifier: workspace:* + version: link:../packages/language-service devDependencies: - '@angular/core': - specifier: 21.0.0-next.7 - version: 21.0.0-next.7(@angular/compiler@21.0.0-next.7) '@types/jasmine': specifier: ~5.1.9 version: 5.1.9 @@ -1382,7 +1379,7 @@ importers: dependencies: '@angular/common': specifier: 21.0.0-next.7 - version: 21.0.0-next.7(@angular/core@21.0.0-next.7(@angular/compiler@21.0.0-next.7))(rxjs@7.8.2) + version: 21.0.0-next.7(@angular/core@21.0.0-next.7(@angular/compiler@21.0.0-next.7)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/compiler': specifier: 21.0.0-next.7 version: 21.0.0-next.7 @@ -1391,7 +1388,7 @@ importers: version: 21.0.0-next.7(@angular/compiler@21.0.0-next.7)(typescript@5.9.3) '@angular/core': specifier: 21.0.0-next.7 - version: 21.0.0-next.7(@angular/compiler@21.0.0-next.7) + version: 21.0.0-next.7(@angular/compiler@21.0.0-next.7)(rxjs@7.8.2) rxjs: specifier: 7.8.2 version: 7.8.2 @@ -1406,8 +1403,8 @@ importers: vscode-ng-language-service/server: dependencies: '@angular/language-service': - specifier: 21.0.0-next.7 - version: 21.0.0-next.7 + specifier: workspace:* + version: link:../../packages/language-service typescript: specifier: 5.9.3 version: 5.9.3 @@ -1753,6 +1750,7 @@ packages: engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@angular/compiler': 21.0.0-next.7 + rxjs: ^6.5.3 || ^7.4.0 peerDependenciesMeta: '@angular/compiler': optional: true @@ -1761,10 +1759,6 @@ packages: resolution: {tarball: https://codeload.github.com/angular/domino/tar.gz/93e720f143d0296dd2726ffbcf4fc12283363a7b} version: 2.1.6 - '@angular/language-service@21.0.0-next.7': - resolution: {integrity: sha512-aDX+5D+UX/qaakZQM32Z71Iks9TDWaqjYNlMiVePUQSFPh2UZvQ/1a6+iYdhW4rJ7mKOwICIVuIvHlVkGGQ8nw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@angular/material@21.0.0-next.8': resolution: {integrity: sha512-lTv37cioGdq9ko6jESvQ1LiKRX35ozg4cqF8XWs0CGwOt6s9gphntf4zypTEIR1kk/qlHM1Y/2KCew3VYkWUaQ==} peerDependencies: @@ -13583,9 +13577,9 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@angular/common@21.0.0-next.7(@angular/core@21.0.0-next.7(@angular/compiler@21.0.0-next.7))(rxjs@7.8.2)': + '@angular/common@21.0.0-next.7(@angular/core@21.0.0-next.7(@angular/compiler@21.0.0-next.7)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - '@angular/core': 21.0.0-next.7(@angular/compiler@21.0.0-next.7) + '@angular/core': 21.0.0-next.7(@angular/compiler@21.0.0-next.7)(rxjs@7.8.2) rxjs: 7.8.2 tslib: 2.8.1 @@ -13623,7 +13617,7 @@ snapshots: optionalDependencies: '@angular/compiler': link:packages/compiler - '@angular/core@21.0.0-next.7(@angular/compiler@21.0.0-next.7)': + '@angular/core@21.0.0-next.7(@angular/compiler@21.0.0-next.7)(rxjs@7.8.2)': dependencies: rxjs: 7.8.2 tslib: 2.8.1 @@ -13633,8 +13627,6 @@ snapshots: '@angular/domino@https://codeload.github.com/angular/domino/tar.gz/93e720f143d0296dd2726ffbcf4fc12283363a7b': {} - '@angular/language-service@21.0.0-next.7': {} - '@angular/material@21.0.0-next.8(@angular/cdk@21.0.0-next.8(@angular/common@packages+common)(@angular/core@packages+core)(rxjs@7.8.2))(@angular/common@packages+common)(@angular/core@packages+core)(@angular/forms@packages+forms)(@angular/platform-browser@packages+platform-browser)(rxjs@7.8.2)': dependencies: '@angular/cdk': 21.0.0-next.8(@angular/common@packages+common)(@angular/core@packages+core)(rxjs@7.8.2) diff --git a/vscode-ng-language-service/BUILD.bazel b/vscode-ng-language-service/BUILD.bazel index d3115048b80..82b2211635d 100644 --- a/vscode-ng-language-service/BUILD.bazel +++ b/vscode-ng-language-service/BUILD.bazel @@ -23,9 +23,10 @@ expand_template_rule( name = "package_json_expanded", out = "package_expanded.json", stamp_substitutions = { - "0.0.0-PLACEHOLDER": "{{BUILD_SCM_VERSION}}", + "workspace:*": "{{STABLE_PROJECT_VERSION}}", }, substitutions = { + "workspace:*": "0.0.0", "../dist/bin/vscode-ng-language-service/client/src/extension.js": "./index", }, template = "package.json", @@ -34,12 +35,12 @@ expand_template_rule( npm_package( name = "vsix_sandbox", srcs = [ - "package_expanded.json", - "angular.png", "CHANGELOG.md", "README.md", + "angular.png", + "package_expanded.json", "//vscode-ng-language-service/client:index.js", - "//vscode-ng-language-service/server:npm_files", + "//vscode-ng-language-service/server:npm_package", "//vscode-ng-language-service/syntaxes:npm_files", # Transitive closure of npm deps that are marked as "external" in esbuild needed for vsce; # this set was determined manually by running `bazel build //:vsix` and burning down missing packages. @@ -56,7 +57,7 @@ npm_package( ], replace_prefixes = { "package_expanded.json": "package.json", - "server/package_expanded.json": "server/package.json", + "server/npm_package/": "server/", "client/": "", "syntaxes/src/": "syntaxes/", }, @@ -82,16 +83,14 @@ vsce_bin.vsce( ) npm_package( - name = "npm", + name = "development_package", srcs = [ ":vsix", ":vsix_sandbox", ], - data = [ - "//vscode-ng-language-service:node_modules/@angular/language-service", - ], root_paths = [ - "vsix_sandbox", + "vscode-ng-language-service/vsix_sandbox", + "vscode-ng-language-service", ], - visibility = ["//vscode-ng-language-service/integration:__subpackages__"], + visibility = ["//vscode-ng-language-service/integration/e2e:__subpackages__"], ) diff --git a/vscode-ng-language-service/common/resolver.ts b/vscode-ng-language-service/common/resolver.ts index 8ab64515b4e..d04d9edb370 100644 --- a/vscode-ng-language-service/common/resolver.ts +++ b/vscode-ng-language-service/common/resolver.ts @@ -70,7 +70,8 @@ export class Version { } isVersionZero() { - return this.versionStr === '0.0.0'; + // Handle both `0.0.0`, `0.0.0-PLACEHOLDER` and similar + return this.major === 0 && this.minor === 0 && this.patch === 0; } toString(): string { diff --git a/vscode-ng-language-service/integration/e2e/BUILD.bazel b/vscode-ng-language-service/integration/e2e/BUILD.bazel index 29b7c515529..1bbb44c75d9 100644 --- a/vscode-ng-language-service/integration/e2e/BUILD.bazel +++ b/vscode-ng-language-service/integration/e2e/BUILD.bazel @@ -30,7 +30,7 @@ js_test( name = "test", data = [ ":e2e", - "//vscode-ng-language-service:npm", + "//vscode-ng-language-service:development_package", ], entry_point = ":index.js", env = { diff --git a/vscode-ng-language-service/integration/e2e/index.ts b/vscode-ng-language-service/integration/e2e/index.ts index 5416776b367..04cbd501447 100644 --- a/vscode-ng-language-service/integration/e2e/index.ts +++ b/vscode-ng-language-service/integration/e2e/index.ts @@ -9,7 +9,7 @@ import {mkdtemp} from 'node:fs/promises'; import Xvfb from 'xvfb'; async function main() { - const EXT_DEVELOPMENT_PATH = join(PACKAGE_ROOT, 'npm/vscode-ng-language-service/vsix_sandbox'); + const EXT_DEVELOPMENT_PATH = join(PACKAGE_ROOT, 'development_package'); const EXT_TESTS_PATH = join(PACKAGE_ROOT, 'integration', 'e2e', 'jasmine'); const xvfb = new Xvfb(); diff --git a/vscode-ng-language-service/package.json b/vscode-ng-language-service/package.json index d0bd6a2dccd..98ffe18d883 100644 --- a/vscode-ng-language-service/package.json +++ b/vscode-ng-language-service/package.json @@ -2,7 +2,8 @@ "name": "ng-template", "displayName": "Angular Language Service", "description": "Editor services for Angular templates", - "version": "20.2.2", + "version": "0.0.0", + "private": true, "publisher": "Angular", "icon": "angular.png", "license": "MIT", @@ -246,7 +247,7 @@ "scripts": { "build:syntaxes": "bazel run //vscode-ng-language-service/syntaxes:syntaxes", "watch": "ibazel build //vscode-ng-language-service/client/src //vscode-ng-language-service/server/src", - "package": "bazel build //vscode-ng-language-service:npm --config=release", + "package": "bazel build //vscode-ng-language-service:development_package --config=release", "test": "bazel test --test_tag_filters=unit_test //vscode-ng-language-service/...", "test:watch": "ibazel test --test_tag_filters=unit_test //vscode-ng-language-service/...", "test:lsp": "bazel test --test_output=streamed //vscode-ng-language-service/integration/lsp:test", @@ -257,10 +258,9 @@ "test:inspect-syntaxes": "bazel run --config=debug //vscode-ng-language-service/syntaxes/test:test" }, "dependencies": { - "@angular/language-service": "21.0.0-next.7" + "@angular/language-service": "workspace:*" }, "devDependencies": { - "@angular/core": "21.0.0-next.7", "@types/jasmine": "~5.1.9", "@types/jasmine-reporters": "~2.5.3", "@types/node": "^24.5.2", diff --git a/vscode-ng-language-service/server/BUILD.bazel b/vscode-ng-language-service/server/BUILD.bazel index e50910a5e8c..79fa4183303 100644 --- a/vscode-ng-language-service/server/BUILD.bazel +++ b/vscode-ng-language-service/server/BUILD.bazel @@ -1,5 +1,6 @@ load("@aspect_bazel_lib//lib:expand_template.bzl", "expand_template_rule") load("@aspect_rules_esbuild//esbuild:defs.bzl", "esbuild") +load("@aspect_rules_js//npm:defs.bzl", "npm_package") load("@aspect_rules_ts//ts:defs.bzl", "ts_config") load("@npm//:defs.bzl", "npm_link_all_packages") @@ -73,21 +74,27 @@ expand_template_rule( name = "package_json_expanded", out = "package_expanded.json", stamp_substitutions = { - "0.0.0-PLACEHOLDER": "{{BUILD_SCM_VERSION}}", + "0.0.0-PLACEHOLDER": "{{STABLE_PROJECT_VERSION}}", + "workspace:*": "{{STABLE_PROJECT_VERSION}}", }, substitutions = { + "0.0.0-PLACEHOLDER": "0.0.0", + "workspace:*": "0.0.0", "../../dist/bin/vscode-ng-language-service/server/src/server.js": "./index.js", }, template = "package.json", ) -filegroup( - name = "npm_files", +npm_package( + name = "npm_package", srcs = [ "README.md", "bin/ngserver", "index.js", "package_expanded.json", ], + replace_prefixes = { + "package_expanded.json": "package.json", + }, visibility = ["//vscode-ng-language-service:__pkg__"], ) diff --git a/vscode-ng-language-service/server/package.json b/vscode-ng-language-service/server/package.json index 620269c049c..1438d77b175 100644 --- a/vscode-ng-language-service/server/package.json +++ b/vscode-ng-language-service/server/package.json @@ -17,7 +17,7 @@ "ngserver": "./bin/ngserver" }, "dependencies": { - "@angular/language-service": "21.0.0-next.7", + "@angular/language-service": "workspace:*", "typescript": "5.9.3" }, "devDependencies": {