diff --git a/goldens/public-api/angular/ssr/index.api.md b/goldens/public-api/angular/ssr/index.api.md index 95b8ec8dd7aa..62ccb05b6021 100644 --- a/goldens/public-api/angular/ssr/index.api.md +++ b/goldens/public-api/angular/ssr/index.api.md @@ -5,6 +5,7 @@ ```ts import { ApplicationRef } from '@angular/core'; +import { BootstrapContext } from '@angular/platform-browser'; import { StaticProvider } from '@angular/core'; import { Type } from '@angular/core'; @@ -16,14 +17,14 @@ export class CommonEngine { // @public (undocumented) export interface CommonEngineOptions { - bootstrap?: Type<{}> | (() => Promise); + bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); enablePerformanceProfiler?: boolean; providers?: StaticProvider[]; } // @public (undocumented) export interface CommonEngineRenderOptions { - bootstrap?: Type<{}> | (() => Promise); + bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); // (undocumented) document?: string; // (undocumented) diff --git a/package.json b/package.json index e599d4b05318..f80e9c0a161a 100644 --- a/package.json +++ b/package.json @@ -52,23 +52,23 @@ }, "devDependencies": { "@ampproject/remapping": "2.3.0", - "@angular/animations": "18.2.0", + "@angular/animations": "18.2.14", "@angular/bazel": "patch:@angular/bazel@https%3A//github.com/angular/bazel-builds.git%23commit=71bd2e043e076365effdb6076f33b2d8d6bd6d02#~/.yarn/patches/@angular-bazel-https-9848736cf4.patch", "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#8128c8cc982b49ca12490da8d97692143aefd026", "@angular/cdk": "18.1.3", - "@angular/common": "18.2.0", - "@angular/compiler": "18.2.0", - "@angular/compiler-cli": "18.2.0", - "@angular/core": "18.2.0", - "@angular/forms": "18.2.0", - "@angular/localize": "18.2.0", + "@angular/common": "18.2.14", + "@angular/compiler": "18.2.14", + "@angular/compiler-cli": "18.2.14", + "@angular/core": "18.2.14", + "@angular/forms": "18.2.14", + "@angular/localize": "18.2.14", "@angular/material": "18.1.3", "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#871fbcb75819dba4dfc6c8971c7aec1c57a8de0c", - "@angular/platform-browser": "18.2.0", - "@angular/platform-browser-dynamic": "18.2.0", - "@angular/platform-server": "18.2.0", - "@angular/router": "18.2.0", - "@angular/service-worker": "18.2.0", + "@angular/platform-browser": "18.2.14", + "@angular/platform-browser-dynamic": "18.2.14", + "@angular/platform-server": "18.2.14", + "@angular/router": "18.2.14", + "@angular/service-worker": "18.2.14", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -164,7 +164,7 @@ "magic-string": "0.30.11", "mini-css-extract-plugin": "2.9.0", "mrmime": "2.0.0", - "ng-packagr": "18.2.0-next.0", + "ng-packagr": "^18.2.0", "npm": "^10.8.1", "npm-package-arg": "11.0.3", "npm-pick-manifest": "9.1.0", diff --git a/packages/angular/build/BUILD.bazel b/packages/angular/build/BUILD.bazel index 3db3261f7fb4..c3ffe3746ed1 100644 --- a/packages/angular/build/BUILD.bazel +++ b/packages/angular/build/BUILD.bazel @@ -62,6 +62,7 @@ ts_library( "@npm//@angular/compiler-cli", "@npm//@angular/core", "@npm//@angular/localize", + "@npm//@angular/platform-browser", "@npm//@angular/platform-server", "@npm//@angular/service-worker", "@npm//@babel/core", diff --git a/packages/angular/build/src/builders/dev-server/vite-server.ts b/packages/angular/build/src/builders/dev-server/vite-server.ts index b005deee8dce..fefcfd7e9f72 100644 --- a/packages/angular/build/src/builders/dev-server/vite-server.ts +++ b/packages/angular/build/src/builders/dev-server/vite-server.ts @@ -320,6 +320,7 @@ export async function* serveWithVite( extensions?.middleware, transformers?.indexHtml, thirdPartySourcemaps, + !!browserOptions.aot, ); server = await createServer(serverConfiguration); @@ -503,6 +504,7 @@ export async function setupServer( extensionMiddleware?: Connect.NextHandleFunction[], indexHtmlTransformer?: (content: string) => Promise, thirdPartySourcemaps = false, + aot = false, ): Promise { const proxy = await loadProxyConfiguration( serverOptions.workspaceRoot, @@ -589,6 +591,7 @@ export async function setupServer( // Include all implict dependencies from the external packages internal option include: externalMetadata.implicitServer, ssr: true, + aot, prebundleTransformer, zoneless, target, @@ -625,6 +628,7 @@ export async function setupServer( zoneless, loader: prebundleLoaderExtensions, thirdPartySourcemaps, + aot, }), }; @@ -663,6 +667,7 @@ function getDepOptimizationConfig({ ssr, loader, thirdPartySourcemaps, + aot, }: { disabled: boolean; exclude: string[]; @@ -673,6 +678,7 @@ function getDepOptimizationConfig({ zoneless: boolean; loader?: EsbuildLoaderOption; thirdPartySourcemaps: boolean; + aot: boolean; }): DepOptimizationConfig { const plugins: ViteEsBuildPlugin[] = [ { @@ -704,6 +710,9 @@ function getDepOptimizationConfig({ supported: getFeatureSupport(target, zoneless), plugins, loader, + define: { + 'ngJitMode': aot ? 'false' : 'true', + }, resolveExtensions: ['.mjs', '.js', '.cjs'], }, }; diff --git a/packages/angular/build/src/utils/routes-extractor/BUILD.bazel b/packages/angular/build/src/utils/routes-extractor/BUILD.bazel index f9c6f8827f1f..2b07078c99b6 100644 --- a/packages/angular/build/src/utils/routes-extractor/BUILD.bazel +++ b/packages/angular/build/src/utils/routes-extractor/BUILD.bazel @@ -19,6 +19,7 @@ ts_library( prodmode_module = "es2015", deps = [ "@npm//@angular/core", + "@npm//@angular/platform-browser", "@npm//@angular/platform-server", "@npm//@angular/router", "@npm//@types/node", diff --git a/packages/angular/build/src/utils/routes-extractor/extractor.ts b/packages/angular/build/src/utils/routes-extractor/extractor.ts index 14708c05f705..f9fea998f2fa 100644 --- a/packages/angular/build/src/utils/routes-extractor/extractor.ts +++ b/packages/angular/build/src/utils/routes-extractor/extractor.ts @@ -16,6 +16,7 @@ import { ɵwhenStable as whenStable, ɵConsole, } from '@angular/core'; +import { BootstrapContext } from '@angular/platform-browser'; import { INITIAL_CONFIG, ɵINTERNAL_SERVER_PLATFORM_PROVIDERS as INTERNAL_SERVER_PLATFORM_PROVIDERS, @@ -76,7 +77,7 @@ async function* getRoutesFromRouterConfig( } export async function* extractRoutes( - bootstrapAppFnOrModule: (() => Promise) | Type, + bootstrapAppFnOrModule: ((context: BootstrapContext) => Promise) | Type, document: string, ): AsyncIterableIterator { const platformRef = createPlatformFactory(platformCore, 'server', [ @@ -106,7 +107,7 @@ export async function* extractRoutes( try { let applicationRef: ApplicationRef; if (isBootstrapFn(bootstrapAppFnOrModule)) { - applicationRef = await bootstrapAppFnOrModule(); + applicationRef = await bootstrapAppFnOrModule({ platformRef }); } else { const moduleRef = await platformRef.bootstrapModule(bootstrapAppFnOrModule); applicationRef = moduleRef.injector.get(ApplicationRef); @@ -131,7 +132,9 @@ export async function* extractRoutes( } } -function isBootstrapFn(value: unknown): value is () => Promise { +function isBootstrapFn( + value: unknown, +): value is (context: BootstrapContext) => Promise { // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property: return typeof value === 'function' && !('ɵmod' in value); } diff --git a/packages/angular/build/src/utils/server-rendering/main-bundle-exports.ts b/packages/angular/build/src/utils/server-rendering/main-bundle-exports.ts index eb6f0f0dfb8c..310aa1df125e 100644 --- a/packages/angular/build/src/utils/server-rendering/main-bundle-exports.ts +++ b/packages/angular/build/src/utils/server-rendering/main-bundle-exports.ts @@ -8,11 +8,12 @@ import type { ApplicationRef, Type, ɵConsole } from '@angular/core'; import type { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server'; +import type { BootstrapContext } from '@angular/platform-browser'; import type { extractRoutes } from '../routes-extractor/extractor'; export interface MainServerBundleExports { /** Standalone application bootstrapping function. */ - default: (() => Promise) | Type; + default: ((context: BootstrapContext) => Promise) | Type; } export interface RenderUtilsServerBundleExports { diff --git a/packages/angular/build/src/utils/server-rendering/render-page.ts b/packages/angular/build/src/utils/server-rendering/render-page.ts index aaf4509c35a2..f4f67e8f77d7 100644 --- a/packages/angular/build/src/utils/server-rendering/render-page.ts +++ b/packages/angular/build/src/utils/server-rendering/render-page.ts @@ -7,6 +7,7 @@ */ import type { ApplicationRef, StaticProvider } from '@angular/core'; +import type { BootstrapContext } from '@angular/platform-browser'; import assert from 'node:assert'; import { basename } from 'node:path'; import { loadEsmModuleFromMemory } from './load-esm-from-memory'; @@ -139,7 +140,9 @@ export async function renderPage({ }; } -function isBootstrapFn(value: unknown): value is () => Promise { +function isBootstrapFn( + value: unknown, +): value is (context: BootstrapContext) => Promise { // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property: return typeof value === 'function' && !('ɵmod' in value); } diff --git a/packages/angular/ssr/BUILD.bazel b/packages/angular/ssr/BUILD.bazel index 0ed44cfb2080..e46bea0d89c7 100644 --- a/packages/angular/ssr/BUILD.bazel +++ b/packages/angular/ssr/BUILD.bazel @@ -1,6 +1,6 @@ +load("@npm//@angular/build-tooling/bazel/api-golden:index.bzl", "api_golden_test_npm_package") load("@rules_pkg//:pkg.bzl", "pkg_tar") load("//tools:defaults.bzl", "ng_package", "ts_library") -load("@npm//@angular/build-tooling/bazel/api-golden:index.bzl", "api_golden_test_npm_package") package(default_visibility = ["//visibility:public"]) @@ -14,6 +14,7 @@ ts_library( module_name = "@angular/ssr", deps = [ "@npm//@angular/core", + "@npm//@angular/platform-browser", "@npm//@angular/platform-server", "@npm//@types/node", "@npm//critters", diff --git a/packages/angular/ssr/node/src/common-engine/common-engine.ts b/packages/angular/ssr/node/src/common-engine/common-engine.ts new file mode 100644 index 000000000000..95c3fa933bff --- /dev/null +++ b/packages/angular/ssr/node/src/common-engine/common-engine.ts @@ -0,0 +1,203 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * 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 + */ + +import { ApplicationRef, StaticProvider, Type } from '@angular/core'; +import { BootstrapContext } from '@angular/platform-browser'; +import { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server'; +import * as fs from 'node:fs'; +import { dirname, join, normalize, resolve } from 'node:path'; +import { URL } from 'node:url'; +import { CommonEngineInlineCriticalCssProcessor } from './inline-css-processor'; +import { + noopRunMethodAndMeasurePerf, + printPerformanceLogs, + runMethodAndMeasurePerf, +} from './peformance-profiler'; + +const SSG_MARKER_REGEXP = /ng-server-context=["']\w*\|?ssg\|?\w*["']/; + +export interface CommonEngineOptions { + /** A method that when invoked returns a promise that returns an `ApplicationRef` instance once resolved or an NgModule. */ + bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); + + /** A set of platform level providers for all requests. */ + providers?: StaticProvider[]; + + /** Enable request performance profiling data collection and printing the results in the server console. */ + enablePerformanceProfiler?: boolean; +} + +export interface CommonEngineRenderOptions { + /** A method that when invoked returns a promise that returns an `ApplicationRef` instance once resolved or an NgModule. */ + bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); + + /** A set of platform level providers for the current request. */ + providers?: StaticProvider[]; + url?: string; + document?: string; + documentFilePath?: string; + + /** + * Reduce render blocking requests by inlining critical CSS. + * Defaults to true. + */ + inlineCriticalCss?: boolean; + + /** + * Base path location of index file. + * Defaults to the 'documentFilePath' dirname when not provided. + */ + publicPath?: string; +} + +/** + * A common engine to use to server render an application. + */ + +export class CommonEngine { + private readonly templateCache = new Map(); + private readonly inlineCriticalCssProcessor = new CommonEngineInlineCriticalCssProcessor(); + private readonly pageIsSSG = new Map(); + + constructor(private options?: CommonEngineOptions) {} + + /** + * Render an HTML document for a specific URL with specified + * render options + */ + async render(opts: CommonEngineRenderOptions): Promise { + const enablePerformanceProfiler = this.options?.enablePerformanceProfiler; + + const runMethod = enablePerformanceProfiler + ? runMethodAndMeasurePerf + : noopRunMethodAndMeasurePerf; + + let html = await runMethod('Retrieve SSG Page', () => this.retrieveSSGPage(opts)); + + if (html === undefined) { + html = await runMethod('Render Page', () => this.renderApplication(opts)); + + if (opts.inlineCriticalCss !== false) { + const content = await runMethod('Inline Critical CSS', () => + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.inlineCriticalCss(html!, opts), + ); + + html = content; + } + } + + if (enablePerformanceProfiler) { + printPerformanceLogs(); + } + + return html; + } + + private inlineCriticalCss(html: string, opts: CommonEngineRenderOptions): Promise { + const outputPath = + opts.publicPath ?? (opts.documentFilePath ? dirname(opts.documentFilePath) : ''); + + return this.inlineCriticalCssProcessor.process(html, outputPath); + } + + private async retrieveSSGPage(opts: CommonEngineRenderOptions): Promise { + const { publicPath, documentFilePath, url } = opts; + if (!publicPath || !documentFilePath || url === undefined) { + return undefined; + } + + const { pathname } = new URL(url, 'resolve://'); + // Do not use `resolve` here as otherwise it can lead to path traversal vulnerability. + // See: https://portswigger.net/web-security/file-path-traversal + const pagePath = join(publicPath, pathname, 'index.html'); + + if (this.pageIsSSG.get(pagePath)) { + // Serve pre-rendered page. + return fs.promises.readFile(pagePath, 'utf-8'); + } + + if (!pagePath.startsWith(normalize(publicPath))) { + // Potential path traversal detected. + return undefined; + } + + if (pagePath === resolve(documentFilePath) || !(await exists(pagePath))) { + // View matches with prerender path or file does not exist. + this.pageIsSSG.set(pagePath, false); + + return undefined; + } + + // Static file exists. + const content = await fs.promises.readFile(pagePath, 'utf-8'); + const isSSG = SSG_MARKER_REGEXP.test(content); + this.pageIsSSG.set(pagePath, isSSG); + + return isSSG ? content : undefined; + } + + private async renderApplication(opts: CommonEngineRenderOptions): Promise { + const moduleOrFactory = this.options?.bootstrap ?? opts.bootstrap; + if (!moduleOrFactory) { + throw new Error('A module or bootstrap option must be provided.'); + } + + const extraProviders: StaticProvider[] = [ + { provide: ɵSERVER_CONTEXT, useValue: 'ssr' }, + ...(opts.providers ?? []), + ...(this.options?.providers ?? []), + ]; + + let document = opts.document; + if (!document && opts.documentFilePath) { + document = await this.getDocument(opts.documentFilePath); + } + + const commonRenderingOptions = { + url: opts.url, + document, + }; + + return isBootstrapFn(moduleOrFactory) + ? renderApplication(moduleOrFactory, { + platformProviders: extraProviders, + ...commonRenderingOptions, + }) + : renderModule(moduleOrFactory, { extraProviders, ...commonRenderingOptions }); + } + + /** Retrieve the document from the cache or the filesystem */ + private async getDocument(filePath: string): Promise { + let doc = this.templateCache.get(filePath); + + if (!doc) { + doc = await fs.promises.readFile(filePath, 'utf-8'); + this.templateCache.set(filePath, doc); + } + + return doc; + } +} + +async function exists(path: fs.PathLike): Promise { + try { + await fs.promises.access(path, fs.constants.F_OK); + + return true; + } catch { + return false; + } +} + +function isBootstrapFn( + value: unknown, +): value is (context: BootstrapContext) => Promise { + // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property: + return typeof value === 'function' && !('ɵmod' in value); +} diff --git a/packages/angular/ssr/src/common-engine.ts b/packages/angular/ssr/src/common-engine.ts index 02a7ba6c55a6..beaca9de3e3a 100644 --- a/packages/angular/ssr/src/common-engine.ts +++ b/packages/angular/ssr/src/common-engine.ts @@ -7,6 +7,7 @@ */ import { ApplicationRef, StaticProvider, Type } from '@angular/core'; +import { BootstrapContext } from '@angular/platform-browser'; import { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server'; import * as fs from 'node:fs'; import { dirname, join, normalize, resolve } from 'node:path'; @@ -22,7 +23,8 @@ const SSG_MARKER_REGEXP = /ng-server-context=["']\w*\|?ssg\|?\w*["']/; export interface CommonEngineOptions { /** A method that when invoked returns a promise that returns an `ApplicationRef` instance once resolved or an NgModule. */ - bootstrap?: Type<{}> | (() => Promise); + bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); + /** A set of platform level providers for all requests. */ providers?: StaticProvider[]; /** Enable request performance profiling data collection and printing the results in the server console. */ @@ -31,7 +33,7 @@ export interface CommonEngineOptions { export interface CommonEngineRenderOptions { /** A method that when invoked returns a promise that returns an `ApplicationRef` instance once resolved or an NgModule. */ - bootstrap?: Type<{}> | (() => Promise); + bootstrap?: Type<{}> | ((context: BootstrapContext) => Promise); /** A set of platform level providers for the current request. */ providers?: StaticProvider[]; url?: string; @@ -200,7 +202,9 @@ async function exists(path: fs.PathLike): Promise { } } -function isBootstrapFn(value: unknown): value is () => Promise { +function isBootstrapFn( + value: unknown, +): value is (context: BootstrapContext) => Promise { // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property: return typeof value === 'function' && !('ɵmod' in value); } diff --git a/packages/angular_devkit/build_angular/BUILD.bazel b/packages/angular_devkit/build_angular/BUILD.bazel index fc6a0f43ad91..80f21acead6a 100644 --- a/packages/angular_devkit/build_angular/BUILD.bazel +++ b/packages/angular_devkit/build_angular/BUILD.bazel @@ -133,6 +133,7 @@ ts_library( "@npm//@angular/compiler-cli", "@npm//@angular/core", "@npm//@angular/localize", + "@npm//@angular/platform-browser", "@npm//@angular/platform-server", "@npm//@angular/service-worker", "@npm//@babel/core", diff --git a/packages/angular_devkit/build_angular/src/builders/app-shell/render-worker.ts b/packages/angular_devkit/build_angular/src/builders/app-shell/render-worker.ts index 33b3e63a9f91..0d61a9a1d59a 100644 --- a/packages/angular_devkit/build_angular/src/builders/app-shell/render-worker.ts +++ b/packages/angular_devkit/build_angular/src/builders/app-shell/render-worker.ts @@ -7,6 +7,7 @@ */ import type { ApplicationRef, StaticProvider, Type } from '@angular/core'; +import type { BootstrapContext } from '@angular/platform-browser'; import type { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server'; import assert from 'node:assert'; import { workerData } from 'node:worker_threads'; @@ -33,7 +34,7 @@ interface ServerBundleExports { renderApplication?: typeof renderApplication; /** Standalone application bootstrapping function. */ - default?: () => Promise; + default?: (context: BootstrapContext) => Promise; } /** @@ -119,7 +120,9 @@ async function render({ serverBundlePath, document, url }: RenderRequest): Promi return Promise.race([renderAppPromise, renderingTimeout]).finally(() => clearTimeout(timer)); } -function isBootstrapFn(value: unknown): value is () => Promise { +function isBootstrapFn( + value: unknown, +): value is (context: BootstrapContext) => Promise { // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property: return typeof value === 'function' && !('ɵmod' in value); } diff --git a/packages/angular_devkit/build_angular/src/builders/prerender/render-worker.ts b/packages/angular_devkit/build_angular/src/builders/prerender/render-worker.ts index afa255378b84..d38c4b8d2cb6 100644 --- a/packages/angular_devkit/build_angular/src/builders/prerender/render-worker.ts +++ b/packages/angular_devkit/build_angular/src/builders/prerender/render-worker.ts @@ -7,6 +7,7 @@ */ import type { ApplicationRef, StaticProvider, Type } from '@angular/core'; +import type { BootstrapContext } from '@angular/platform-browser'; import type { renderApplication, renderModule, ɵSERVER_CONTEXT } from '@angular/platform-server'; import assert from 'node:assert'; import * as fs from 'node:fs'; @@ -42,7 +43,7 @@ interface ServerBundleExports { renderApplication?: typeof renderApplication; /** Standalone application bootstrapping function. */ - default?: (() => Promise) | Type; + default?: ((context: BootstrapContext) => Promise) | Type; } /** @@ -148,11 +149,12 @@ async function render({ return result; } -function isBootstrapFn(value: unknown): value is () => Promise { +function isBootstrapFn( + value: unknown, +): value is (context: BootstrapContext) => Promise { // We can differentiate between a module and a bootstrap function by reading compiler-generated `ɵmod` static property: return typeof value === 'function' && !('ɵmod' in value); } - /** * Initializes the worker when it is first created by loading the Zone.js package * into the worker instance. diff --git a/packages/angular_devkit/build_angular/src/builders/prerender/routes-extractor-worker.ts b/packages/angular_devkit/build_angular/src/builders/prerender/routes-extractor-worker.ts index d7bec749875c..c465cc0cc669 100644 --- a/packages/angular_devkit/build_angular/src/builders/prerender/routes-extractor-worker.ts +++ b/packages/angular_devkit/build_angular/src/builders/prerender/routes-extractor-worker.ts @@ -7,6 +7,7 @@ */ import type { ApplicationRef, Type } from '@angular/core'; +import type { BootstrapContext } from '@angular/platform-browser'; import assert from 'node:assert'; import * as fs from 'node:fs'; import * as path from 'node:path'; @@ -24,11 +25,13 @@ interface ServerBundleExports { AppServerModule?: Type; /** Standalone application bootstrapping function. */ - default?: (() => Promise) | Type; + default?: ((context: BootstrapContext) => Promise) | Type; /** Method to extract routes from the router config. */ extractRoutes( - bootstrapFunctionOrModule: (() => Promise) | Type, + bootstrapFunctionOrModule: + | ((context: BootstrapContext) => Promise) + | Type, document: string, ): AsyncIterable<{ success: boolean; route: string }>; } diff --git a/packages/angular_devkit/build_angular/src/builders/server/index.ts b/packages/angular_devkit/build_angular/src/builders/server/index.ts index be15cef9090f..562a917f5374 100644 --- a/packages/angular_devkit/build_angular/src/builders/server/index.ts +++ b/packages/angular_devkit/build_angular/src/builders/server/index.ts @@ -212,7 +212,18 @@ async function initialize( wco.buildOptions.supportedBrowsers ??= []; wco.buildOptions.supportedBrowsers.push(...browserslist('maintained node versions')); - return [getPlatformServerExportsConfig(wco), getCommonConfig(wco), getStylesConfig(wco)]; + return [ + getPlatformServerExportsConfig(wco), + getCommonConfig(wco), + getStylesConfig(wco), + { + plugins: [ + new webpack.DefinePlugin({ + 'ngJitMode': false, + }), + ], + }, + ]; }, ); diff --git a/packages/ngtools/webpack/package.json b/packages/ngtools/webpack/package.json index 136f7c996a0a..4be51f6ef821 100644 --- a/packages/ngtools/webpack/package.json +++ b/packages/ngtools/webpack/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@angular-devkit/core": "0.0.0-PLACEHOLDER", - "@angular/compiler": "18.2.0-rc.0", - "@angular/compiler-cli": "18.2.0-rc.0", + "@angular/compiler": "18.2.14", + "@angular/compiler-cli": "18.2.14", "typescript": "5.5.4", "webpack": "5.93.0" } diff --git a/packages/schematics/angular/server/files/standalone-src/main.server.ts.template b/packages/schematics/angular/server/files/standalone-src/main.server.ts.template index 4b9d4d1545c1..f678724860de 100644 --- a/packages/schematics/angular/server/files/standalone-src/main.server.ts.template +++ b/packages/schematics/angular/server/files/standalone-src/main.server.ts.template @@ -1,7 +1,8 @@ -import { bootstrapApplication } from '@angular/platform-browser'; +import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { config } from './app/app.config.server'; -const bootstrap = () => bootstrapApplication(AppComponent, config); +const bootstrap = (context: BootstrapContext) => + bootstrapApplication(AppComponent, config, context); export default bootstrap; diff --git a/packages/schematics/angular/server/index_spec.ts b/packages/schematics/angular/server/index_spec.ts index dd81f4996825..6dc49cb2f876 100644 --- a/packages/schematics/angular/server/index_spec.ts +++ b/packages/schematics/angular/server/index_spec.ts @@ -124,7 +124,7 @@ describe('Server Schematic', () => { const filePath = '/projects/bar/src/main.server.ts'; expect(tree.exists(filePath)).toBeTrue(); const contents = tree.readContent(filePath); - expect(contents).toContain(`bootstrapApplication(AppComponent, config)`); + expect(contents).toContain(`bootstrapApplication(AppComponent, config, context)`); }); it('should create server app config file', async () => { diff --git a/yarn.lock b/yarn.lock index 8a1a43d9e5ef..9d1d0739dd2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -247,14 +247,14 @@ __metadata: languageName: unknown linkType: soft -"@angular/animations@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/animations@npm:18.2.0" +"@angular/animations@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/animations@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 18.2.0 - checksum: 10c0/8ad61102c4862a8e78a6d373f4f8c944a75268767f09050a086cd0e05f06a5e8adb99388b7fbc44923f4cc28bd13445ebb3098f60c3a3addfc53d4a70102c99a + "@angular/core": 18.2.14 + checksum: 10c0/7c59d9cbf13f513ee8c086e8f18a7af9b8c27bd52765883bbb3a2b883db192b487bf40fa03c4179c4d29f7d57c8464692ab7ef862987d5ad1ea2dd2e1563d3cd languageName: node linkType: hard @@ -529,101 +529,64 @@ __metadata: languageName: unknown linkType: soft -"@angular/common@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/common@npm:18.2.0" +"@angular/common@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/common@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 18.2.0 + "@angular/core": 18.2.14 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/c6ded4739979d5e62d45eaa504031c163bee1f2ef4f1c7d4382494e69379da0855c43ddbdd74450247239468d26f9306b61a585a9401b04ce97fd5e4933af4ea + checksum: 10c0/d8c92608ff839cb1d4a7db560f37173b1ee3ae3ba45f6e0620bad168338a361b82762fd63dc347b29f3e985ce93e4c6e90022db0e47ca921a400b63efdaa9a31 languageName: node linkType: hard -"@angular/compiler-cli@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/compiler-cli@npm:18.2.0" +"@angular/compiler-cli@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/compiler-cli@npm:18.2.14" dependencies: "@babel/core": "npm:7.25.2" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - chokidar: "npm:^3.0.0" - convert-source-map: "npm:^1.5.1" - reflect-metadata: "npm:^0.2.0" - semver: "npm:^7.0.0" - tslib: "npm:^2.3.0" - yargs: "npm:^17.2.1" - peerDependencies: - "@angular/compiler": 18.2.0 - typescript: ">=5.4 <5.6" - bin: - ng-xi18n: bundles/src/bin/ng_xi18n.js - ngc: bundles/src/bin/ngc.js - ngcc: bundles/ngcc/index.js - checksum: 10c0/d9922a5a4b5ac5b8d82bac0bb766d6d1645f0a7f3ac2c4bb863efc4fcc0d36bf9442ba842a0f594cf3d32103c221db3340195646f8341df8dcbed7a08eaebaac - languageName: node - linkType: hard - -"@angular/compiler-cli@npm:18.2.0-rc.0": - version: 18.2.0-rc.0 - resolution: "@angular/compiler-cli@npm:18.2.0-rc.0" - dependencies: - "@babel/core": "npm:7.24.9" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - chokidar: "npm:^3.0.0" + chokidar: "npm:^4.0.0" convert-source-map: "npm:^1.5.1" reflect-metadata: "npm:^0.2.0" semver: "npm:^7.0.0" tslib: "npm:^2.3.0" yargs: "npm:^17.2.1" peerDependencies: - "@angular/compiler": 18.2.0-rc.0 + "@angular/compiler": 18.2.14 typescript: ">=5.4 <5.6" bin: ng-xi18n: bundles/src/bin/ng_xi18n.js ngc: bundles/src/bin/ngc.js ngcc: bundles/ngcc/index.js - checksum: 10c0/001ff0d0a351b623405d39291c622ddc8e063911d0a0941c629390ebb73f5552367a9bf623f04009c62eec59d140c5e829c65338674f2190f7a1bcf46b1a2e4f - languageName: node - linkType: hard - -"@angular/compiler@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/compiler@npm:18.2.0" - dependencies: - tslib: "npm:^2.3.0" - peerDependencies: - "@angular/core": 18.2.0 - peerDependenciesMeta: - "@angular/core": - optional: true - checksum: 10c0/db1510d33a6caaef27aa7eb94423be9c6e652707cea37166a774f90d2ff1e36ef9d60b38076abaf829666c1256aa0c3c8daa8e662fd0dd112c7c8135b003ad0c + checksum: 10c0/8c5026d7c39ac1787b4d8b91fb6cdf336ce5c120396967726bf708fad79b1c0606883bbb6030f4adfbf89c767f82dab77def74f4bf2413ea8dccdff244e3cc8b languageName: node linkType: hard -"@angular/compiler@npm:18.2.0-rc.0": - version: 18.2.0-rc.0 - resolution: "@angular/compiler@npm:18.2.0-rc.0" +"@angular/compiler@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/compiler@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/core": 18.2.0-rc.0 + "@angular/core": 18.2.14 peerDependenciesMeta: "@angular/core": optional: true - checksum: 10c0/601742ad57e1593c092bbc3991593fe5ad9449c9a9914ecf3e7fc7fc9542c8db959cc002e82b50e413b3ddcd5c2439a9b98f7620c23bc9afa59e6ffff0929566 + checksum: 10c0/8e4988f0eab7907610edde6288e94a62765bfd4de0102023429ea028b0e48bea95e3bc89204aa69a83377be320dc008c4ba4cd58a4cc834aa4f2491f675ba6b3 languageName: node linkType: hard -"@angular/core@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/core@npm:18.2.0" +"@angular/core@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/core@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.14.10 - checksum: 10c0/a66b9c474bf3b32dc3e678353bd79c2c9c0a8e9531500828d51e3c4a1998bcfaa9834ad5910646dfbd5d7fc9d8f37b55f024f6d5f08407a405c94f0c44f50683 + checksum: 10c0/99a3656d0eb60797d2eea5077c9ff7a05a21fca31c143c11cb27720ed1633a2ab6c2acb0f357c9c1f4ca1e8d2482ef9192216cbfc73c705f73eab6f50b289e6c languageName: node linkType: hard @@ -654,23 +617,23 @@ __metadata: resolution: "@angular/devkit-repo@workspace:." dependencies: "@ampproject/remapping": "npm:2.3.0" - "@angular/animations": "npm:18.2.0" + "@angular/animations": "npm:18.2.14" "@angular/bazel": "patch:@angular/bazel@https%3A//github.com/angular/bazel-builds.git%23commit=71bd2e043e076365effdb6076f33b2d8d6bd6d02#~/.yarn/patches/@angular-bazel-https-9848736cf4.patch" "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#8128c8cc982b49ca12490da8d97692143aefd026" "@angular/cdk": "npm:18.1.3" - "@angular/common": "npm:18.2.0" - "@angular/compiler": "npm:18.2.0" - "@angular/compiler-cli": "npm:18.2.0" - "@angular/core": "npm:18.2.0" - "@angular/forms": "npm:18.2.0" - "@angular/localize": "npm:18.2.0" + "@angular/common": "npm:18.2.14" + "@angular/compiler": "npm:18.2.14" + "@angular/compiler-cli": "npm:18.2.14" + "@angular/core": "npm:18.2.14" + "@angular/forms": "npm:18.2.14" + "@angular/localize": "npm:18.2.14" "@angular/material": "npm:18.1.3" "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#871fbcb75819dba4dfc6c8971c7aec1c57a8de0c" - "@angular/platform-browser": "npm:18.2.0" - "@angular/platform-browser-dynamic": "npm:18.2.0" - "@angular/platform-server": "npm:18.2.0" - "@angular/router": "npm:18.2.0" - "@angular/service-worker": "npm:18.2.0" + "@angular/platform-browser": "npm:18.2.14" + "@angular/platform-browser-dynamic": "npm:18.2.14" + "@angular/platform-server": "npm:18.2.14" + "@angular/router": "npm:18.2.14" + "@angular/service-worker": "npm:18.2.14" "@babel/core": "npm:7.26.10" "@babel/generator": "npm:7.26.10" "@babel/helper-annotate-as-pure": "npm:7.25.9" @@ -766,7 +729,7 @@ __metadata: magic-string: "npm:0.30.11" mini-css-extract-plugin: "npm:2.9.0" mrmime: "npm:2.0.0" - ng-packagr: "npm:18.2.0-next.0" + ng-packagr: "npm:^18.2.0" npm: "npm:^10.8.1" npm-package-arg: "npm:11.0.3" npm-pick-manifest: "npm:9.1.0" @@ -821,36 +784,36 @@ __metadata: languageName: unknown linkType: soft -"@angular/forms@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/forms@npm:18.2.0" +"@angular/forms@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/forms@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 18.2.0 - "@angular/core": 18.2.0 - "@angular/platform-browser": 18.2.0 + "@angular/common": 18.2.14 + "@angular/core": 18.2.14 + "@angular/platform-browser": 18.2.14 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/5a71b10a7d54b102cf69a79c60e2eb1dc515d11fa8c827c56e3738ee3fbe256f5ca63b46314bb0a3adba7675465919546142785a64dc9f931d7600f295e97e96 + checksum: 10c0/be38a905667724002eddefe713e2ac35291f429e32d1cf4d73cdfde5b886e6ae321a6a34e0f7a283e1c28fb87f69e8977321ec5fa7b93e19bfb7dbc0bde30dc2 languageName: node linkType: hard -"@angular/localize@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/localize@npm:18.2.0" +"@angular/localize@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/localize@npm:18.2.14" dependencies: "@babel/core": "npm:7.25.2" "@types/babel__core": "npm:7.20.5" fast-glob: "npm:3.3.2" yargs: "npm:^17.2.1" peerDependencies: - "@angular/compiler": 18.2.0 - "@angular/compiler-cli": 18.2.0 + "@angular/compiler": 18.2.14 + "@angular/compiler-cli": 18.2.14 bin: localize-extract: tools/bundles/src/extract/cli.js localize-migrate: tools/bundles/src/migrate/cli.js localize-translate: tools/bundles/src/translate/cli.js - checksum: 10c0/c278f43533656fd1de9fa78e4ad563048ee8814e4562f356f1ae39f6eb0f3186aa854592d44c570e02803a264e5ceca08cbaf1e49446c2448f1263f840e07775 + checksum: 10c0/08d17795512619825be71aff3cbbd709093fb433552cb3b69a971fb972124b149a7e5ef214a964fd4b9a2422523d35c84379050c3a2c43c1bd8c25bab87dc507 languageName: node linkType: hard @@ -891,49 +854,49 @@ __metadata: languageName: node linkType: hard -"@angular/platform-browser-dynamic@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/platform-browser-dynamic@npm:18.2.0" +"@angular/platform-browser-dynamic@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/platform-browser-dynamic@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 18.2.0 - "@angular/compiler": 18.2.0 - "@angular/core": 18.2.0 - "@angular/platform-browser": 18.2.0 - checksum: 10c0/874f2c97e948f05b14c20b2da22e4633f277ca3b41c6cfb8b388b4428e6302d8c79bbbdb7262d539c177453824cff1a046f39d0fb754a0ae502d36595b39c44c + "@angular/common": 18.2.14 + "@angular/compiler": 18.2.14 + "@angular/core": 18.2.14 + "@angular/platform-browser": 18.2.14 + checksum: 10c0/98d8cdfde6e6dcddefe5b2205e0c4050c6842bdd2e9e918db8cb23f6b1f5236a3bcfe4caa2a98c7ca29d4fbd975ea5b215b724c7de7fff15dcaca8eb3e6c1cfb languageName: node linkType: hard -"@angular/platform-browser@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/platform-browser@npm:18.2.0" +"@angular/platform-browser@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/platform-browser@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/animations": 18.2.0 - "@angular/common": 18.2.0 - "@angular/core": 18.2.0 + "@angular/animations": 18.2.14 + "@angular/common": 18.2.14 + "@angular/core": 18.2.14 peerDependenciesMeta: "@angular/animations": optional: true - checksum: 10c0/270bed2ec0fa1df62a4172762debee8f25e6de4eddb0610db82bfdb44a6c61b6cd33c479f740a43550a7eccbacebe961cd5ecdbed91afe119f3b5cfbfc455acf + checksum: 10c0/2ff9d8bd73d4b11c4609aa91ab5f9f25f014779f0765b26c4e87deb4011d090502f63276f0fedf03ac86a5cdb3be6ae2a700144d7b607a9e28c4dfd798cc7a56 languageName: node linkType: hard -"@angular/platform-server@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/platform-server@npm:18.2.0" +"@angular/platform-server@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/platform-server@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" xhr2: "npm:^0.2.0" peerDependencies: - "@angular/animations": 18.2.0 - "@angular/common": 18.2.0 - "@angular/compiler": 18.2.0 - "@angular/core": 18.2.0 - "@angular/platform-browser": 18.2.0 - checksum: 10c0/e03481b765bb429e75ed0e3305183647204519f5a01117460af25bc489880b90a60e438f76990a1de5cf1035f8de4f09331023168d6bb4c3eb38d254bd157398 + "@angular/animations": 18.2.14 + "@angular/common": 18.2.14 + "@angular/compiler": 18.2.14 + "@angular/core": 18.2.14 + "@angular/platform-browser": 18.2.14 + checksum: 10c0/a8f5ccb8c3982d90c576a780b2a77729daf5c5fd4e7f274d627f25946492160060586c55b788f97da5847ef6fe4dce715e9948864b629b2960de62161325a65d languageName: node linkType: hard @@ -952,31 +915,31 @@ __metadata: languageName: unknown linkType: soft -"@angular/router@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/router@npm:18.2.0" +"@angular/router@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/router@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 18.2.0 - "@angular/core": 18.2.0 - "@angular/platform-browser": 18.2.0 + "@angular/common": 18.2.14 + "@angular/core": 18.2.14 + "@angular/platform-browser": 18.2.14 rxjs: ^6.5.3 || ^7.4.0 - checksum: 10c0/c15189eb083c1ee358b9715d269d33d6b160157d02c54c3eec3e8afade389e12f700af8a3103b6cb91d9a53f11fae73ed9a9620fc95239b2399a10b90b4494ba + checksum: 10c0/37695aea505eee5817b0a25c021bd1bd87bcbed7a29f08db4244685b91beb096aae17086da1d8825d40f66e518e65810249e45ad54ee0d7a1a8238347872b975 languageName: node linkType: hard -"@angular/service-worker@npm:18.2.0": - version: 18.2.0 - resolution: "@angular/service-worker@npm:18.2.0" +"@angular/service-worker@npm:18.2.14": + version: 18.2.14 + resolution: "@angular/service-worker@npm:18.2.14" dependencies: tslib: "npm:^2.3.0" peerDependencies: - "@angular/common": 18.2.0 - "@angular/core": 18.2.0 + "@angular/common": 18.2.14 + "@angular/core": 18.2.14 bin: ngsw-config: ngsw-config.js - checksum: 10c0/561614d54bbfe24501113d628d4b212485e1205d8bc2f0525caaf9342d4e2725c7604f85cd4c4c990a738fb772715c6cc2b30c3160f89e4c32ed39cae1293ab2 + checksum: 10c0/ea3d49acc4b917ecb57c94a641aeca6e3f53dac4f004bbff8da2f2691d98ceda338275537a14e9d16b3a24ed737804f126905785d08495473a0c6026fc6b7fbc languageName: node linkType: hard @@ -1027,29 +990,6 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.24.9": - version: 7.24.9 - resolution: "@babel/core@npm:7.24.9" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.9" - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-module-transforms": "npm:^7.24.9" - "@babel/helpers": "npm:^7.24.8" - "@babel/parser": "npm:^7.24.8" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.8" - "@babel/types": "npm:^7.24.9" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/e104ec6efbf099f55184933e9ab078eb5821c792ddfef3e9c6561986ec4ff103f5c11e3d7d6e5e8929e50e2c58db1cc80e5b6f14b530335b6622095ec4b4124c - languageName: node - linkType: hard - "@babel/core@npm:7.25.2, @babel/core@npm:^7.12.3, @babel/core@npm:^7.16.0, @babel/core@npm:^7.23.9": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" @@ -1109,7 +1049,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.24.9, @babel/generator@npm:^7.25.0": +"@babel/generator@npm:^7.25.0": version: 7.25.0 resolution: "@babel/generator@npm:7.25.0" dependencies: @@ -1139,7 +1079,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.2": version: 7.25.2 resolution: "@babel/helper-compilation-targets@npm:7.25.2" dependencies: @@ -1277,7 +1217,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.9, @babel/helper-module-transforms@npm:^7.25.2": +"@babel/helper-module-transforms@npm:^7.25.2": version: 7.25.2 resolution: "@babel/helper-module-transforms@npm:7.25.2" dependencies: @@ -1459,7 +1399,7 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.24.8, @babel/helpers@npm:^7.25.0": +"@babel/helpers@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helpers@npm:7.25.0" dependencies: @@ -1491,7 +1431,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.8, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.3": version: 7.25.3 resolution: "@babel/parser@npm:7.25.3" dependencies: @@ -2371,7 +2311,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0": +"@babel/template@npm:^7.25.0": version: 7.25.0 resolution: "@babel/template@npm:7.25.0" dependencies: @@ -2393,7 +2333,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.2": +"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.2": version: 7.25.3 resolution: "@babel/traverse@npm:7.25.3" dependencies: @@ -2423,7 +2363,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.9, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.4.4": version: 7.25.2 resolution: "@babel/types@npm:7.25.2" dependencies: @@ -3591,8 +3531,8 @@ __metadata: resolution: "@ngtools/webpack@workspace:packages/ngtools/webpack" dependencies: "@angular-devkit/core": "npm:0.0.0-PLACEHOLDER" - "@angular/compiler": "npm:18.2.0-rc.0" - "@angular/compiler-cli": "npm:18.2.0-rc.0" + "@angular/compiler": "npm:18.2.14" + "@angular/compiler-cli": "npm:18.2.14" typescript: "npm:5.5.4" webpack: "npm:5.93.0" peerDependencies: @@ -7717,6 +7657,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.0": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/a58b9df05bb452f7d105d9e7229ac82fa873741c0c40ddcc7bb82f8a909fbe3f7814c9ebe9bc9a2bef9b737c0ec6e2d699d179048ef06ad3ec46315df0ebe6ad + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -13601,9 +13550,9 @@ __metadata: languageName: node linkType: hard -"ng-packagr@npm:18.2.0-next.0": - version: 18.2.0-next.0 - resolution: "ng-packagr@npm:18.2.0-next.0" +"ng-packagr@npm:^18.2.0": + version: 18.2.1 + resolution: "ng-packagr@npm:18.2.1" dependencies: "@rollup/plugin-json": "npm:^6.1.0" "@rollup/plugin-node-resolve": "npm:^15.2.3" @@ -13641,7 +13590,7 @@ __metadata: optional: true bin: ng-packagr: cli/main.js - checksum: 10c0/7536ef7cdb4767c1b8080bc8f96c1ef653d86da54ce61e696f6b9378b7793d033f208dc6029b6d795418551c7d1d886894787dd333b5760002e16fff688eb6f7 + checksum: 10c0/230417542cf5ded0695ae431eb0c61618f1f2596bb3aa1bb3cac579b8c7d1ffe1762ada24d8a315a0c547358134ba64370aad2ac56dd6caab480f261866993ea languageName: node linkType: hard @@ -15452,6 +15401,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10c0/60a14f7619dec48c9c850255cd523e2717001b0e179dc7037cfa0895da7b9e9ab07532d324bfb118d73a710887d1e35f79c495fa91582784493e085d18c72c62 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0"