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, }