diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1fd58a251379..2197f21e8b78 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,27 @@
+
+
+# 19.2.9 (2025-04-23)
+
+### @angular-devkit/build-angular
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | -------------------------------------- |
+| [de52cc2c8](https://github.com/angular/angular-cli/commit/de52cc2c813e49a06828ff9e9ef0543fa63a9929) | fix | update http-proxy-middleware to v3.0.5 |
+
+### @angular/build
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------- |
+| [cc5229a45](https://github.com/angular/angular-cli/commit/cc5229a4507848d4d2bcf7409ffa56a7c4b2a136) | fix | pass `preserveSymlinks` option to Karma esbuild builder |
+
+### @angular/ssr
+
+| Commit | Type | Description |
+| --------------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------ |
+| [a4e415ea6](https://github.com/angular/angular-cli/commit/a4e415ea6ab204b6d5f5974c6f0a073d66c40faf) | fix | support `getPrerenderParams` for wildcard routes |
+
+
+
# 19.2.8 (2025-04-16)
diff --git a/WORKSPACE b/WORKSPACE
index ae3c80b53c7c..429e255ad806 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -288,3 +288,24 @@ esbuild_register_toolchains(
name = "esbuild",
esbuild_version = LATEST_ESBUILD_VERSION,
)
+
+git_repository(
+ name = "rules_angular",
+ commit = "bc8e690770319b8780761f797773bfd47f47dfdc",
+ remote = "https://github.com/devversion/rules_angular.git",
+)
+
+load("@rules_angular//setup:step_1.bzl", "rules_angular_step1")
+
+rules_angular_step1()
+
+load("@rules_angular//setup:step_2.bzl", "rules_angular_step2")
+
+rules_angular_step2()
+
+load("@rules_angular//setup:step_3.bzl", "rules_angular_step3")
+
+rules_angular_step3(
+ angular_compiler_cli = "//:node_modules/@angular/compiler-cli",
+ typescript = "//:node_modules/typescript",
+)
diff --git a/goldens/public-api/angular/ssr/node/index.api.md b/goldens/public-api/angular/ssr/node/index.api.md
index 0bbeb8ae145a..e406fb592349 100644
--- a/goldens/public-api/angular/ssr/node/index.api.md
+++ b/goldens/public-api/angular/ssr/node/index.api.md
@@ -5,10 +5,10 @@
```ts
import { ApplicationRef } from '@angular/core';
-import type { Http2ServerRequest } from 'node:http2';
-import type { Http2ServerResponse } from 'node:http2';
-import type { IncomingMessage } from 'node:http';
-import type { ServerResponse } from 'node:http';
+import { Http2ServerRequest } from 'node:http2';
+import { Http2ServerResponse } from 'node:http2';
+import { IncomingMessage } from 'node:http';
+import { ServerResponse } from 'node:http';
import { StaticProvider } from '@angular/core';
import { Type } from '@angular/core';
diff --git a/package.json b/package.json
index fda39dc6b2e9..966eca5a8123 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@angular/devkit-repo",
- "version": "19.2.8",
+ "version": "19.2.9",
"private": true,
"description": "Software Development Kit for Angular",
"keywords": [
@@ -134,7 +134,7 @@
"express": "4.21.2",
"fast-glob": "3.3.3",
"http-proxy": "^1.18.1",
- "http-proxy-middleware": "3.0.3",
+ "http-proxy-middleware": "3.0.5",
"https-proxy-agent": "7.0.6",
"husky": "9.1.7",
"ini": "5.0.0",
@@ -179,7 +179,9 @@
"resolve-url-loader": "5.0.0",
"rollup": "4.34.8",
"rollup-license-plugin": "~3.0.1",
+ "rollup-plugin-dts": "6.2.1",
"rollup-plugin-sourcemaps": "^0.6.0",
+ "rollup-plugin-sourcemaps2": "0.5.0",
"rxjs": "7.8.1",
"sass": "1.85.0",
"sass-loader": "16.0.5",
diff --git a/packages/angular/build/src/builders/karma/application_builder.ts b/packages/angular/build/src/builders/karma/application_builder.ts
index d311eee0e4a3..40f66a9c6773 100644
--- a/packages/angular/build/src/builders/karma/application_builder.ts
+++ b/packages/angular/build/src/builders/karma/application_builder.ts
@@ -408,6 +408,7 @@ async function initializeApplication(
entryPoints,
tsConfig: options.tsConfig,
outputPath,
+ preserveSymlinks: options.preserveSymlinks,
aot: options.aot,
index: false,
outputHashing: OutputHashing.None,
diff --git a/packages/angular/ssr/BUILD.bazel b/packages/angular/ssr/BUILD.bazel
index fbe46237d063..5daa61839675 100644
--- a/packages/angular/ssr/BUILD.bazel
+++ b/packages/angular/ssr/BUILD.bazel
@@ -1,4 +1,3 @@
-load("@aspect_rules_js//npm:defs.bzl", "npm_package")
load("@devinfra//bazel/api-golden:index_rjs.bzl", "api_golden_test_npm_package")
load("@npm2//:defs.bzl", "npm_link_all_packages")
load("@rules_pkg//:pkg.bzl", "pkg_tar")
@@ -40,8 +39,7 @@ ts_project(
)
ng_package(
- name = "angular_package",
- package_name = "@angular/ssr",
+ name = "npm_package",
srcs = [
":package.json",
"//packages/angular/ssr/third_party/beasties:beasties_bundled",
@@ -53,10 +51,21 @@ ng_package(
],
nested_packages = [
"//packages/angular/ssr/schematics:pkg",
+ # Included directly as the generated types reference the types file in this location.
+ "//packages/angular/ssr/third_party/beasties:beasties_dts",
],
+ package = "@angular/ssr",
+ rollup_runtime_deps = [
+ "//:node_modules/@rollup/plugin-commonjs",
+ "//:node_modules/@rollup/plugin-node-resolve",
+ "//:node_modules/magic-string",
+ "//:node_modules/rollup-plugin-dts",
+ "//:node_modules/rollup-plugin-sourcemaps2",
+ ],
+ tags = ["release-package"],
deps = [
- ":ssr_legacy",
- "//packages/angular/ssr/node:node_legacy",
+ ":ssr",
+ "//packages/angular/ssr/node",
],
)
@@ -69,16 +78,6 @@ pkg_tar(
tags = ["manual"],
)
-# TODO: Replace when `ng_package` creates a valid `rules_js`-compliant npm package.
-npm_package(
- name = "npm_package",
- srcs = [":angular_package"],
- replace_prefixes = {
- "angular_package/": "",
- },
- tags = ["release-package"],
-)
-
alias(
name = "pkg",
actual = ":npm_package",
diff --git a/packages/angular/ssr/schematics/BUILD.bazel b/packages/angular/ssr/schematics/BUILD.bazel
index 67164e942e43..e64c760942d4 100644
--- a/packages/angular/ssr/schematics/BUILD.bazel
+++ b/packages/angular/ssr/schematics/BUILD.bazel
@@ -3,7 +3,7 @@
# Use of this source code is governed by an MIT-style license that can be
# found in the LICENSE file at https://angular.dev/license
-load("@aspect_rules_js//npm:defs.bzl", "npm_package")
+load("@aspect_rules_js//js:defs.bzl", "js_library")
load("//tools:defaults2.bzl", "jasmine_test", "ts_project")
load("//tools:ts_json_schema.bzl", "ts_json_schema")
@@ -91,8 +91,8 @@ jasmine_test(
],
)
-# This package is intended to be combined into the main @angular/ssr package as a dep.
-npm_package(
+# This target is used as nested_package in the main @angular/ssr package as a dep.
+js_library(
name = "pkg",
srcs = [
"package.json",
diff --git a/packages/angular/ssr/src/routes/ng-routes.ts b/packages/angular/ssr/src/routes/ng-routes.ts
index 41e4f62f84f0..b40002eb93ba 100644
--- a/packages/angular/ssr/src/routes/ng-routes.ts
+++ b/packages/angular/ssr/src/routes/ng-routes.ts
@@ -46,6 +46,12 @@ interface Route extends AngularRoute {
*/
const MODULE_PRELOAD_MAX = 10;
+/**
+ * Regular expression to match a catch-all route pattern in a URL path,
+ * specifically one that ends with '/**'.
+ */
+const CATCH_ALL_REGEXP = /\/(\*\*)$/;
+
/**
* Regular expression to match segments preceded by a colon in a string.
*/
@@ -391,7 +397,11 @@ async function* handleSSGRoute(
meta.redirectTo = resolveRedirectTo(currentRoutePath, redirectTo);
}
- if (!URL_PARAMETER_REGEXP.test(currentRoutePath)) {
+ const isCatchAllRoute = CATCH_ALL_REGEXP.test(currentRoutePath);
+ if (
+ (isCatchAllRoute && !getPrerenderParams) ||
+ (!isCatchAllRoute && !URL_PARAMETER_REGEXP.test(currentRoutePath))
+ ) {
// Route has no parameters
yield {
...meta,
@@ -415,7 +425,9 @@ async function* handleSSGRoute(
if (serverConfigRouteTree) {
// Automatically resolve dynamic parameters for nested routes.
- const catchAllRoutePath = joinUrlParts(currentRoutePath, '**');
+ const catchAllRoutePath = isCatchAllRoute
+ ? currentRoutePath
+ : joinUrlParts(currentRoutePath, '**');
const match = serverConfigRouteTree.match(catchAllRoutePath);
if (match && match.renderMode === RenderMode.Prerender && !('getPrerenderParams' in match)) {
serverConfigRouteTree.insert(catchAllRoutePath, {
@@ -429,20 +441,10 @@ async function* handleSSGRoute(
const parameters = await runInInjectionContext(parentInjector, () => getPrerenderParams());
try {
for (const params of parameters) {
- const routeWithResolvedParams = currentRoutePath.replace(URL_PARAMETER_REGEXP, (match) => {
- const parameterName = match.slice(1);
- const value = params[parameterName];
- if (typeof value !== 'string') {
- throw new Error(
- `The 'getPrerenderParams' function defined for the '${stripLeadingSlash(currentRoutePath)}' route ` +
- `returned a non-string value for parameter '${parameterName}'. ` +
- `Please make sure the 'getPrerenderParams' function returns values for all parameters ` +
- 'specified in this route.',
- );
- }
-
- return value;
- });
+ const replacer = handlePrerenderParamsReplacement(params, currentRoutePath);
+ const routeWithResolvedParams = currentRoutePath
+ .replace(URL_PARAMETER_REGEXP, replacer)
+ .replace(CATCH_ALL_REGEXP, replacer);
yield {
...meta,
@@ -473,6 +475,34 @@ async function* handleSSGRoute(
}
}
+/**
+ * Creates a replacer function used for substituting parameter placeholders in a route path
+ * with their corresponding values provided in the `params` object.
+ *
+ * @param params - An object mapping parameter names to their string values.
+ * @param currentRoutePath - The current route path, used for constructing error messages.
+ * @returns A function that replaces a matched parameter placeholder (e.g., ':id') with its corresponding value.
+ */
+function handlePrerenderParamsReplacement(
+ params: Record,
+ currentRoutePath: string,
+): (substring: string, ...args: unknown[]) => string {
+ return (match) => {
+ const parameterName = match.slice(1);
+ const value = params[parameterName];
+ if (typeof value !== 'string') {
+ throw new Error(
+ `The 'getPrerenderParams' function defined for the '${stripLeadingSlash(currentRoutePath)}' route ` +
+ `returned a non-string value for parameter '${parameterName}'. ` +
+ `Please make sure the 'getPrerenderParams' function returns values for all parameters ` +
+ 'specified in this route.',
+ );
+ }
+
+ return parameterName === '**' ? `/${value}` : value;
+ };
+}
+
/**
* Resolves the `redirectTo` property for a given route.
*
@@ -530,9 +560,9 @@ function buildServerConfigRouteTree({ routes, appShellRoute }: ServerRoutesConfi
continue;
}
- if (path.includes('*') && 'getPrerenderParams' in metadata) {
+ if ('getPrerenderParams' in metadata && (path.includes('/*/') || path.endsWith('/*'))) {
errors.push(
- `Invalid '${path}' route configuration: 'getPrerenderParams' cannot be used with a '*' or '**' route.`,
+ `Invalid '${path}' route configuration: 'getPrerenderParams' cannot be used with a '*' route.`,
);
continue;
}
diff --git a/packages/angular/ssr/src/routes/route-config.ts b/packages/angular/ssr/src/routes/route-config.ts
index d72602a6d990..05cd96d28495 100644
--- a/packages/angular/ssr/src/routes/route-config.ts
+++ b/packages/angular/ssr/src/routes/route-config.ts
@@ -146,6 +146,10 @@ export interface ServerRoutePrerenderWithParams extends Omit ({ id })); // Generates paths like: [{ id: '1' }, { id: '2' }, { id: '3' }]
+ * return ids.map(id => ({ id })); // Generates paths like: ['product/1', 'product/2', 'product/3']
+ * },
+ * },
+ * {
+ * path: '/product/:id/**',
+ * renderMode: RenderMode.Prerender,
+ * async getPrerenderParams() {
+ * return [
+ * { id: '1', '**': 'laptop/3' },
+ * { id: '2', '**': 'laptop/4' }
+ * ]; // Generates paths like: ['product/1/laptop/3', 'product/2/laptop/4']
* },
* },
* ];
diff --git a/packages/angular/ssr/test/routes/ng-routes_spec.ts b/packages/angular/ssr/test/routes/ng-routes_spec.ts
index 291ce74708ab..0f797fc14e24 100644
--- a/packages/angular/ssr/test/routes/ng-routes_spec.ts
+++ b/packages/angular/ssr/test/routes/ng-routes_spec.ts
@@ -68,26 +68,6 @@ describe('extractRoutesAndCreateRouteTree', () => {
);
});
- it("should error when 'getPrerenderParams' is used with a '**' route", async () => {
- setAngularAppTestingManifest(
- [{ path: 'home', component: DummyComponent }],
- [
- {
- path: '**',
- renderMode: RenderMode.Prerender,
- getPrerenderParams() {
- return Promise.resolve([]);
- },
- },
- ],
- );
-
- const { errors } = await extractRoutesAndCreateRouteTree({ url });
- expect(errors[0]).toContain(
- "Invalid '**' route configuration: 'getPrerenderParams' cannot be used with a '*' or '**' route.",
- );
- });
-
it("should error when 'getPrerenderParams' is used with a '*' route", async () => {
setAngularAppTestingManifest(
[{ path: 'invalid/:id', component: DummyComponent }],
@@ -104,7 +84,7 @@ describe('extractRoutesAndCreateRouteTree', () => {
const { errors } = await extractRoutesAndCreateRouteTree({ url });
expect(errors[0]).toContain(
- "Invalid 'invalid/*' route configuration: 'getPrerenderParams' cannot be used with a '*' or '**' route.",
+ "Invalid 'invalid/*' route configuration: 'getPrerenderParams' cannot be used with a '*' route.",
);
});
@@ -259,7 +239,7 @@ describe('extractRoutesAndCreateRouteTree', () => {
]);
});
- it('should resolve parameterized routes for SSG and not add a fallback route if fallback is None', async () => {
+ it('should resolve parameterized routes for SSG add a fallback route if fallback is Server', async () => {
setAngularAppTestingManifest(
[
{ path: 'home', component: DummyComponent },
@@ -296,6 +276,44 @@ describe('extractRoutesAndCreateRouteTree', () => {
]);
});
+ it('should resolve catch all routes for SSG and add a fallback route if fallback is Server', async () => {
+ setAngularAppTestingManifest(
+ [
+ { path: 'home', component: DummyComponent },
+ { path: 'user/:name/**', component: DummyComponent },
+ ],
+ [
+ {
+ path: 'user/:name/**',
+ renderMode: RenderMode.Prerender,
+ fallback: PrerenderFallback.Server,
+ async getPrerenderParams() {
+ return [
+ { name: 'joe', '**': 'role/admin' },
+ { name: 'jane', '**': 'role/writer' },
+ ];
+ },
+ },
+ { path: '**', renderMode: RenderMode.Server },
+ ],
+ );
+
+ const { routeTree, errors } = await extractRoutesAndCreateRouteTree({
+ url,
+ invokeGetPrerenderParams: true,
+ });
+ expect(errors).toHaveSize(0);
+ expect(routeTree.toObject()).toEqual([
+ { route: '/home', renderMode: RenderMode.Server },
+ { route: '/user/joe/role/admin', renderMode: RenderMode.Prerender },
+ {
+ route: '/user/jane/role/writer',
+ renderMode: RenderMode.Prerender,
+ },
+ { route: '/user/*/**', renderMode: RenderMode.Server },
+ ]);
+ });
+
it('should extract nested redirects that are not explicitly defined.', async () => {
setAngularAppTestingManifest(
[
diff --git a/packages/angular_devkit/build_angular/package.json b/packages/angular_devkit/build_angular/package.json
index 08d00860a29e..488ec62e6468 100644
--- a/packages/angular_devkit/build_angular/package.json
+++ b/packages/angular_devkit/build_angular/package.json
@@ -31,7 +31,7 @@
"css-loader": "7.1.2",
"esbuild-wasm": "0.25.1",
"fast-glob": "3.3.3",
- "http-proxy-middleware": "3.0.3",
+ "http-proxy-middleware": "3.0.5",
"istanbul-lib-instrument": "6.0.3",
"jsonc-parser": "3.3.1",
"karma-source-map-support": "1.4.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 560ea33937e4..9446bebf6e5f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -279,8 +279,8 @@ importers:
specifier: ^1.18.1
version: 1.18.1(debug@4.4.0)
http-proxy-middleware:
- specifier: 3.0.3
- version: 3.0.3
+ specifier: 3.0.5
+ version: 3.0.5
https-proxy-agent:
specifier: 7.0.6
version: 7.0.6(supports-color@10.0.0)
@@ -413,9 +413,15 @@ importers:
rollup-license-plugin:
specifier: ~3.0.1
version: 3.0.2
+ rollup-plugin-dts:
+ specifier: 6.2.1
+ version: 6.2.1(rollup@4.34.8)(typescript@5.8.1-rc)
rollup-plugin-sourcemaps:
specifier: ^0.6.0
version: 0.6.3(@types/node@18.19.76)(rollup@4.34.8)
+ rollup-plugin-sourcemaps2:
+ specifier: 0.5.0
+ version: 0.5.0(@types/node@18.19.76)(rollup@4.34.8)
rxjs:
specifier: 7.8.1
version: 7.8.1
@@ -825,8 +831,8 @@ importers:
specifier: 3.3.3
version: 3.3.3
http-proxy-middleware:
- specifier: 3.0.3
- version: 3.0.3
+ specifier: 3.0.5
+ version: 3.0.5
istanbul-lib-instrument:
specifier: 6.0.3
version: 6.0.3
@@ -5203,8 +5209,8 @@ packages:
'@types/express':
optional: true
- http-proxy-middleware@3.0.3:
- resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==}
+ http-proxy-middleware@3.0.5:
+ resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
http-proxy@1.18.1:
@@ -7139,6 +7145,23 @@ packages:
resolution: {integrity: sha512-68LWDlUKxqLO4Si3Extca4X7P99tU7s0KLnVUzN6h6SDihGAWYMQ0q73XLnHbUmG0IFgvC0AzuYvbogceQ9Hcw==}
engines: {node: '>=18.0.0'}
+ rollup-plugin-dts@6.2.1:
+ resolution: {integrity: sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ rollup: ^3.29.4 || ^4
+ typescript: 5.8.1-rc
+
+ rollup-plugin-sourcemaps2@0.5.0:
+ resolution: {integrity: sha512-ozRq2fRuJYkA2cRT1CxaWNovtdBbrlXMK/vKIm5Q7rLUHx4jF21jZu1plO+VNOWPDAn+q1CaIAWKQL5QGej6Bw==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ '@types/node': '>=18.0.0'
+ rollup: '>=4'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
rollup-plugin-sourcemaps@0.6.3:
resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==}
engines: {node: '>=10.0.0'}
@@ -13514,7 +13537,7 @@ snapshots:
transitivePeerDependencies:
- debug
- http-proxy-middleware@3.0.3:
+ http-proxy-middleware@3.0.5:
dependencies:
'@types/http-proxy': 1.17.16
debug: 4.4.0(supports-color@10.0.0)
@@ -15572,6 +15595,21 @@ snapshots:
node-fetch: 3.3.2
spdx-expression-validate: 2.0.0
+ rollup-plugin-dts@6.2.1(rollup@4.34.8)(typescript@5.8.1-rc):
+ dependencies:
+ magic-string: 0.30.17
+ rollup: 4.34.8
+ typescript: 5.8.1-rc
+ optionalDependencies:
+ '@babel/code-frame': 7.26.2
+
+ rollup-plugin-sourcemaps2@0.5.0(@types/node@18.19.76)(rollup@4.34.8):
+ dependencies:
+ '@rollup/pluginutils': 5.1.4(rollup@4.34.8)
+ rollup: 4.34.8
+ optionalDependencies:
+ '@types/node': 18.19.76
+
rollup-plugin-sourcemaps@0.6.3(@types/node@18.19.76)(rollup@4.34.8):
dependencies:
'@rollup/pluginutils': 3.1.0(rollup@4.34.8)
diff --git a/tools/bazel/npm_package.bzl b/tools/bazel/npm_package.bzl
index fc912f3d125d..0a76bfe1bb73 100644
--- a/tools/bazel/npm_package.bzl
+++ b/tools/bazel/npm_package.bzl
@@ -63,8 +63,8 @@ def npm_package(
out = "substituted_with_snapshot_repos/package.json",
)
- nostamp_subs = dict(substitutions["rjs"]["nostamp"], **extra_substitutions)
- stamp_subs = dict(substitutions["rjs"]["stamp"], **extra_substitutions)
+ nostamp_subs = dict(substitutions["nostamp"], **extra_substitutions)
+ stamp_subs = dict(substitutions["stamp"], **extra_substitutions)
expand_template(
name = "final_package_json",
diff --git a/tools/defaults2.bzl b/tools/defaults2.bzl
index 31af54a7644a..ecd71071d42b 100644
--- a/tools/defaults2.bzl
+++ b/tools/defaults2.bzl
@@ -1,7 +1,7 @@
load("@aspect_bazel_lib//lib:copy_to_bin.bzl", _copy_to_bin = "copy_to_bin")
load("@aspect_rules_jasmine//jasmine:defs.bzl", _jasmine_test = "jasmine_test")
load("@aspect_rules_js//js:defs.bzl", _js_binary = "js_binary")
-load("@npm//@angular/bazel:index.bzl", _ng_package = "ng_package")
+load("@rules_angular//src/ng_package:index.bzl", _ng_package = "ng_package")
load("//tools:interop.bzl", _ts_project = "ts_project")
load("//tools:substitutions.bzl", "substitutions")
load("//tools/bazel:npm_package.bzl", _npm_package = "npm_package")
@@ -23,8 +23,8 @@ def ng_package(deps = [], **kwargs):
deps = deps,
license = "//:LICENSE",
substitutions = select({
- "//:stamp": substitutions["legacy"]["stamp"],
- "//conditions:default": substitutions["legacy"]["nostamp"],
+ "//:stamp": substitutions["stamp"],
+ "//conditions:default": substitutions["nostamp"],
}),
**kwargs
)
diff --git a/tools/substitutions.bzl b/tools/substitutions.bzl
index ab0dfb46e0a9..098b511b1d6e 100644
--- a/tools/substitutions.bzl
+++ b/tools/substitutions.bzl
@@ -2,8 +2,8 @@ load("//:constants.bzl", "ANGULAR_FW_PEER_DEP", "ANGULAR_FW_VERSION", "NG_PACKAG
_stamp_substitutions = {
# Version of the local package being built, generated via the `--workspace_status_command` flag.
- "0.0.0-PLACEHOLDER": "{STABLE_PROJECT_VERSION}",
- "0.0.0-EXPERIMENTAL-PLACEHOLDER": "{STABLE_PROJECT_EXPERIMENTAL_VERSION}",
+ "0.0.0-PLACEHOLDER": "{{STABLE_PROJECT_VERSION}}",
+ "0.0.0-EXPERIMENTAL-PLACEHOLDER": "{{STABLE_PROJECT_EXPERIMENTAL_VERSION}}",
# ---
"BUILD_SCM_HASH-PLACEHOLDER": "{BUILD_SCM_ABBREV_HASH}",
"0.0.0-ENGINES-NODE": RELEASE_ENGINES_NODE,
@@ -22,21 +22,7 @@ _no_stamp_substitutions = dict(_stamp_substitutions, **{
"0.0.0-EXPERIMENTAL-PLACEHOLDER": "0.0.0",
})
-def _adjust_substitutions_for_rules_js(subs):
- result = {}
- for key, value in subs.items():
- # in `rules_js`, or `expand_template` from `bazel-lib`, stamp variables
- # can only be retrieved via `{{X}}` syntax.
- result[key] = value.replace("{", "{{").replace("}", "}}")
- return result
-
substitutions = {
- "legacy": {
- "stamp": _stamp_substitutions,
- "nostamp": _no_stamp_substitutions,
- },
- "rjs": {
- "stamp": _adjust_substitutions_for_rules_js(_stamp_substitutions),
- "nostamp": _adjust_substitutions_for_rules_js(_no_stamp_substitutions),
- },
+ "stamp": _stamp_substitutions,
+ "nostamp": _no_stamp_substitutions,
}