@angular/platform-server 22.0.0-rc.1 → 22.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/_server-chunk.mjs +47 -24
- package/fesm2022/_server-chunk.mjs.map +1 -1
- package/fesm2022/init.mjs +1 -1
- package/fesm2022/platform-server.mjs +21 -11
- package/fesm2022/platform-server.mjs.map +1 -1
- package/fesm2022/testing.mjs +5 -5
- package/package.json +6 -6
- package/third_party/domino/bundled-domino.mjs +13 -9
- package/third_party/domino/bundled-domino.mjs.map +1 -1
- package/types/init.d.ts +1 -1
- package/types/platform-server.d.ts +7 -2
- package/types/testing.d.ts +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v22.0.0-rc.
|
|
2
|
+
* @license Angular v22.0.0-rc.2
|
|
3
3
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
@@ -109,7 +109,7 @@ class PlatformState {
|
|
|
109
109
|
}
|
|
110
110
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
111
111
|
minVersion: "12.0.0",
|
|
112
|
-
version: "22.0.0-rc.
|
|
112
|
+
version: "22.0.0-rc.2",
|
|
113
113
|
ngImport: i0,
|
|
114
114
|
type: PlatformState,
|
|
115
115
|
deps: [{
|
|
@@ -119,14 +119,14 @@ class PlatformState {
|
|
|
119
119
|
});
|
|
120
120
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
121
121
|
minVersion: "12.0.0",
|
|
122
|
-
version: "22.0.0-rc.
|
|
122
|
+
version: "22.0.0-rc.2",
|
|
123
123
|
ngImport: i0,
|
|
124
124
|
type: PlatformState
|
|
125
125
|
});
|
|
126
126
|
}
|
|
127
127
|
i0.ɵɵngDeclareClassMetadata({
|
|
128
128
|
minVersion: "12.0.0",
|
|
129
|
-
version: "22.0.0-rc.
|
|
129
|
+
version: "22.0.0-rc.2",
|
|
130
130
|
ngImport: i0,
|
|
131
131
|
type: PlatformState,
|
|
132
132
|
decorators: [{
|
|
@@ -163,7 +163,7 @@ class ServerXhr {
|
|
|
163
163
|
}
|
|
164
164
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
165
165
|
minVersion: "12.0.0",
|
|
166
|
-
version: "22.0.0-rc.
|
|
166
|
+
version: "22.0.0-rc.2",
|
|
167
167
|
ngImport: i0,
|
|
168
168
|
type: ServerXhr,
|
|
169
169
|
deps: [],
|
|
@@ -171,21 +171,26 @@ class ServerXhr {
|
|
|
171
171
|
});
|
|
172
172
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
173
173
|
minVersion: "12.0.0",
|
|
174
|
-
version: "22.0.0-rc.
|
|
174
|
+
version: "22.0.0-rc.2",
|
|
175
175
|
ngImport: i0,
|
|
176
176
|
type: ServerXhr
|
|
177
177
|
});
|
|
178
178
|
}
|
|
179
179
|
i0.ɵɵngDeclareClassMetadata({
|
|
180
180
|
minVersion: "12.0.0",
|
|
181
|
-
version: "22.0.0-rc.
|
|
181
|
+
version: "22.0.0-rc.2",
|
|
182
182
|
ngImport: i0,
|
|
183
183
|
type: ServerXhr,
|
|
184
184
|
decorators: [{
|
|
185
185
|
type: Injectable
|
|
186
186
|
}]
|
|
187
187
|
});
|
|
188
|
+
const URL_SCHEMA_REGEXP = /^(?:[a-zA-Z][a-zA-Z0-9+\-.]*:)/;
|
|
188
189
|
function relativeUrlsTransformerInterceptorFn(request, next) {
|
|
190
|
+
const trimmedUrl = request.url.trim();
|
|
191
|
+
if (URL_SCHEMA_REGEXP.test(trimmedUrl)) {
|
|
192
|
+
return next(request);
|
|
193
|
+
}
|
|
189
194
|
const platformLocation = inject(PlatformLocation);
|
|
190
195
|
const {
|
|
191
196
|
href,
|
|
@@ -202,9 +207,15 @@ function relativeUrlsTransformerInterceptorFn(request, next) {
|
|
|
202
207
|
}
|
|
203
208
|
const baseHref = platformLocation.getBaseHrefFromDOM() || href;
|
|
204
209
|
const baseUrl = new URL(baseHref, urlPrefix);
|
|
205
|
-
|
|
210
|
+
let parsedUrl = new URL(request.url, baseUrl);
|
|
211
|
+
if (parsedUrl.origin !== baseUrl.origin) {
|
|
212
|
+
const isProtocolRelative = /^\/\/[^/\\]/.test(trimmedUrl);
|
|
213
|
+
if (!isProtocolRelative) {
|
|
214
|
+
parsedUrl = new URL(trimmedUrl.replace(/^[/\\]+/, '/'), baseUrl);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
206
217
|
return next(request.clone({
|
|
207
|
-
url:
|
|
218
|
+
url: parsedUrl.toString()
|
|
208
219
|
}));
|
|
209
220
|
}
|
|
210
221
|
const SERVER_HTTP_PROVIDERS = [{
|
|
@@ -216,15 +227,27 @@ const SERVER_HTTP_PROVIDERS = [{
|
|
|
216
227
|
multi: true
|
|
217
228
|
}];
|
|
218
229
|
|
|
230
|
+
const LEADING_SLASHES_REGEX = /^[/\\]+/;
|
|
219
231
|
function parseUrl(urlStr, origin) {
|
|
232
|
+
if (!urlStr) {
|
|
233
|
+
return origin !== undefined ? new URL('/', origin) : null;
|
|
234
|
+
}
|
|
220
235
|
if (URL.canParse(urlStr)) {
|
|
221
236
|
return new URL(urlStr);
|
|
222
237
|
}
|
|
223
|
-
if (
|
|
224
|
-
|
|
238
|
+
if (/^[a-zA-Z][a-zA-Z0-9+.-]*:(\/\/|\\\\)/.test(urlStr)) {
|
|
239
|
+
throw new Error(`Invalid URL: ${urlStr}`);
|
|
225
240
|
}
|
|
226
|
-
|
|
241
|
+
if (origin === undefined) {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
let normalizedPath = urlStr.replace(LEADING_SLASHES_REGEX, '/');
|
|
245
|
+
if (normalizedPath[0] !== '/') {
|
|
246
|
+
normalizedPath = `/${normalizedPath}`;
|
|
247
|
+
}
|
|
248
|
+
return new URL(normalizedPath, origin);
|
|
227
249
|
}
|
|
250
|
+
|
|
228
251
|
class ServerPlatformLocation {
|
|
229
252
|
href = '/';
|
|
230
253
|
hostname = '/';
|
|
@@ -317,7 +340,7 @@ class ServerPlatformLocation {
|
|
|
317
340
|
}
|
|
318
341
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
319
342
|
minVersion: "12.0.0",
|
|
320
|
-
version: "22.0.0-rc.
|
|
343
|
+
version: "22.0.0-rc.2",
|
|
321
344
|
ngImport: i0,
|
|
322
345
|
type: ServerPlatformLocation,
|
|
323
346
|
deps: [],
|
|
@@ -325,14 +348,14 @@ class ServerPlatformLocation {
|
|
|
325
348
|
});
|
|
326
349
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
327
350
|
minVersion: "12.0.0",
|
|
328
|
-
version: "22.0.0-rc.
|
|
351
|
+
version: "22.0.0-rc.2",
|
|
329
352
|
ngImport: i0,
|
|
330
353
|
type: ServerPlatformLocation
|
|
331
354
|
});
|
|
332
355
|
}
|
|
333
356
|
i0.ɵɵngDeclareClassMetadata({
|
|
334
357
|
minVersion: "12.0.0",
|
|
335
|
-
version: "22.0.0-rc.
|
|
358
|
+
version: "22.0.0-rc.2",
|
|
336
359
|
ngImport: i0,
|
|
337
360
|
type: ServerPlatformLocation,
|
|
338
361
|
decorators: [{
|
|
@@ -355,7 +378,7 @@ class ServerEventManagerPlugin extends EventManagerPlugin {
|
|
|
355
378
|
}
|
|
356
379
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
357
380
|
minVersion: "12.0.0",
|
|
358
|
-
version: "22.0.0-rc.
|
|
381
|
+
version: "22.0.0-rc.2",
|
|
359
382
|
ngImport: i0,
|
|
360
383
|
type: ServerEventManagerPlugin,
|
|
361
384
|
deps: [{
|
|
@@ -365,14 +388,14 @@ class ServerEventManagerPlugin extends EventManagerPlugin {
|
|
|
365
388
|
});
|
|
366
389
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
367
390
|
minVersion: "12.0.0",
|
|
368
|
-
version: "22.0.0-rc.
|
|
391
|
+
version: "22.0.0-rc.2",
|
|
369
392
|
ngImport: i0,
|
|
370
393
|
type: ServerEventManagerPlugin
|
|
371
394
|
});
|
|
372
395
|
}
|
|
373
396
|
i0.ɵɵngDeclareClassMetadata({
|
|
374
397
|
minVersion: "12.0.0",
|
|
375
|
-
version: "22.0.0-rc.
|
|
398
|
+
version: "22.0.0-rc.2",
|
|
376
399
|
ngImport: i0,
|
|
377
400
|
type: ServerEventManagerPlugin,
|
|
378
401
|
decorators: [{
|
|
@@ -482,7 +505,7 @@ const PLATFORM_SERVER_PROVIDERS = [TRANSFER_STATE_SERIALIZATION_PROVIDERS, SERVE
|
|
|
482
505
|
class ServerModule {
|
|
483
506
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
484
507
|
minVersion: "12.0.0",
|
|
485
|
-
version: "22.0.0-rc.
|
|
508
|
+
version: "22.0.0-rc.2",
|
|
486
509
|
ngImport: i0,
|
|
487
510
|
type: ServerModule,
|
|
488
511
|
deps: [],
|
|
@@ -490,14 +513,14 @@ class ServerModule {
|
|
|
490
513
|
});
|
|
491
514
|
static ɵmod = i0.ɵɵngDeclareNgModule({
|
|
492
515
|
minVersion: "14.0.0",
|
|
493
|
-
version: "22.0.0-rc.
|
|
516
|
+
version: "22.0.0-rc.2",
|
|
494
517
|
ngImport: i0,
|
|
495
518
|
type: ServerModule,
|
|
496
519
|
exports: [BrowserModule]
|
|
497
520
|
});
|
|
498
521
|
static ɵinj = i0.ɵɵngDeclareInjector({
|
|
499
522
|
minVersion: "12.0.0",
|
|
500
|
-
version: "22.0.0-rc.
|
|
523
|
+
version: "22.0.0-rc.2",
|
|
501
524
|
ngImport: i0,
|
|
502
525
|
type: ServerModule,
|
|
503
526
|
providers: PLATFORM_SERVER_PROVIDERS,
|
|
@@ -506,7 +529,7 @@ class ServerModule {
|
|
|
506
529
|
}
|
|
507
530
|
i0.ɵɵngDeclareClassMetadata({
|
|
508
531
|
minVersion: "12.0.0",
|
|
509
|
-
version: "22.0.0-rc.
|
|
532
|
+
version: "22.0.0-rc.2",
|
|
510
533
|
ngImport: i0,
|
|
511
534
|
type: ServerModule,
|
|
512
535
|
decorators: [{
|
|
@@ -523,7 +546,7 @@ function _document() {
|
|
|
523
546
|
const _enableDomEmulation = enableDomEmulation(injector);
|
|
524
547
|
let document;
|
|
525
548
|
if (config && config.document) {
|
|
526
|
-
document = typeof config.document === 'string' ? _enableDomEmulation ? parseDocument(config.document, config.url) : window.document : config.document;
|
|
549
|
+
document = typeof config.document === 'string' ? _enableDomEmulation ? parseDocument(config.document, config.url !== undefined ? parseUrl(config.url, 'http://localhost').href : undefined) : window.document : config.document;
|
|
527
550
|
} else {
|
|
528
551
|
document = _getDOM().createHtmlDocument();
|
|
529
552
|
}
|
|
@@ -544,5 +567,5 @@ function platformServer(extraProviders) {
|
|
|
544
567
|
return platform;
|
|
545
568
|
}
|
|
546
569
|
|
|
547
|
-
export { BEFORE_APP_SERIALIZED, DominoAdapter, ENABLE_DOM_EMULATION, INITIAL_CONFIG, INTERNAL_SERVER_PLATFORM_PROVIDERS, PLATFORM_SERVER_PROVIDERS, PlatformState, SERVER_RENDER_PROVIDERS, ServerModule, createScript, platformServer };
|
|
570
|
+
export { BEFORE_APP_SERIALIZED, DominoAdapter, ENABLE_DOM_EMULATION, INITIAL_CONFIG, INTERNAL_SERVER_PLATFORM_PROVIDERS, PLATFORM_SERVER_PROVIDERS, PlatformState, SERVER_RENDER_PROVIDERS, ServerModule, createScript, parseUrl, platformServer };
|
|
548
571
|
//# sourceMappingURL=_server-chunk.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_server-chunk.mjs","sources":[".../third_party/domino/bundled-domino.mjs';\n\nexport function setDomTypes() {\n // Make all Domino types available in the global env.\n // NB: Any changes here should also be done in `packages/platform-server/init/src/shims.ts`.\n Object.assign(globalThis, domino.impl);\n (globalThis as any)['KeyboardEvent'] = domino.impl.Event;\n}\n\n/**\n * Parses a document string to a Document object.\n */\nexport function parseDocument(html: string, url = '/') {\n let window = domino.createWindow(html, url);\n let doc = window.document;\n return doc;\n}\n\n/**\n * Serializes a document to string.\n */\nexport function serializeDocument(doc: Document): string {\n return (doc as any).serialize();\n}\n\n/**\n * DOM Adapter for the server platform based on https://github.com/fgnass/domino.\n */\nexport class DominoAdapter extends BrowserDomAdapter {\n static override makeCurrent() {\n setDomTypes();\n setRootDomAdapter(new DominoAdapter());\n }\n\n override readonly supportsDOMEvents = false;\n private static defaultDoc: Document;\n\n override createHtmlDocument(): Document {\n return parseDocument('<html><head><title>fakeTitle</title></head><body></body></html>');\n }\n\n override getDefaultDocument(): Document {\n if (!DominoAdapter.defaultDoc) {\n DominoAdapter.defaultDoc = domino.createDocument();\n }\n return DominoAdapter.defaultDoc;\n }\n\n override isElementNode(node: any): boolean {\n return node ? node.nodeType === DominoAdapter.defaultDoc.ELEMENT_NODE : false;\n }\n override isShadowRoot(node: any): boolean {\n return node.shadowRoot == node;\n }\n\n /** @deprecated No longer being used in Ivy code. To be removed in version 14. */\n override getGlobalEventTarget(doc: Document, target: string): EventTarget | null {\n if (target === 'window') {\n return doc.defaultView;\n }\n if (target === 'document') {\n return doc;\n }\n if (target === 'body') {\n return doc.body;\n }\n return null;\n }\n\n override getBaseHref(doc: Document): string {\n const length = doc.head.children.length;\n\n // The `<base>` can only be a direct child of `<head>` so we can save some\n // execution time by looking through them directly instead of querying for it.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/base\n // Note that we can't cache the `href` value itself, because this method gets called with a\n // different document every time which means that in theory the value can be different too.\n for (let i = 0; i < length; i++) {\n const child = doc.head.children[i];\n\n // Tag names are always uppercase for HTML nodes.\n if (child.tagName === 'BASE') {\n // TODO(alxhub): Need relative path logic from BrowserDomAdapter here?\n return child.getAttribute('href') || '';\n }\n }\n\n return '';\n }\n\n override dispatchEvent(el: Node, evt: any) {\n el.dispatchEvent(evt);\n\n // Dispatch the event to the window also.\n const doc = el.ownerDocument || el;\n const win = (doc as any).defaultView;\n if (win) {\n win.dispatchEvent(evt);\n }\n }\n\n override getUserAgent(): string {\n return 'Fake user agent';\n }\n\n override getCookie(name: string): string {\n throw new Error('getCookie has not been implemented');\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/**\n * Config object passed to initialize the platform.\n *\n * @publicApi\n */\nexport interface PlatformConfig {\n /**\n * The initial DOM to use to bootstrap the server application.\n * @default create a new DOM using Domino\n */\n document?: string;\n /**\n * The URL for the current application state. This is used for initializing\n * the platform's location. `protocol`, `hostname`, and `port`.\n */\n url?: string;\n}\n\n/**\n * The DI token for setting the initial config for the platform.\n *\n * @publicApi\n */\nexport const INITIAL_CONFIG = new InjectionToken<PlatformConfig>('Server.INITIAL_CONFIG');\n\n/**\n * A function that will be executed when calling `renderApplication` or\n * `renderModule` just before current platform state is rendered to string.\n *\n * @publicApi\n */\nexport const BEFORE_APP_SERIALIZED = new InjectionToken<ReadonlyArray<() => void | Promise<void>>>(\n 'Server.RENDER_MODULE_HOOK',\n);\n\nexport const ENABLE_DOM_EMULATION = new InjectionToken<boolean>('ENABLE_DOM_EMULATION');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {\n inject,\n Inject,\n Injectable,\n Injector,\n ɵstartMeasuring as startMeasuring,\n ɵstopMeasuring as stopMeasuring,\n} from '@angular/core';\n\nimport {serializeDocument} from './domino_adapter';\nimport {ENABLE_DOM_EMULATION} from './tokens';\n\n/**\n * Representation of the current platform state.\n *\n * @publicApi\n */\n@Injectable()\nexport class PlatformState {\n /* @internal */\n _enableDomEmulation = enableDomEmulation(inject(Injector));\n\n constructor(@Inject(DOCUMENT) private _doc: any) {}\n\n /**\n * Renders the current state of the platform to string.\n */\n renderToString(): string {\n if (ngDevMode && !this._enableDomEmulation && !window?.document) {\n throw new Error('Disabled DOM emulation should only run in browser environments');\n }\n\n const measuringLabel = 'renderToString';\n startMeasuring(measuringLabel);\n const rendered = this._enableDomEmulation\n ? serializeDocument(this._doc)\n : // In the case we run/test the platform-server in a browser environment\n this._doc.documentElement.outerHTML;\n stopMeasuring(measuringLabel);\n return rendered;\n }\n\n /**\n * Returns the current DOM state.\n */\n getDocument(): any {\n return this._doc;\n }\n}\n\nexport function enableDomEmulation(injector: Injector): boolean {\n return injector.get(ENABLE_DOM_EMULATION, true);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {PlatformLocation, XhrFactory} from '@angular/common';\nimport {\n HttpEvent,\n HttpHandlerFn,\n HttpRequest,\n ɵHTTP_ROOT_INTERCEPTOR_FNS as HTTP_ROOT_INTERCEPTOR_FNS,\n} from '@angular/common/http';\nimport {inject, Injectable, Provider} from '@angular/core';\nimport {Observable} from 'rxjs';\n\n@Injectable()\nexport class ServerXhr implements XhrFactory {\n private xhrImpl: typeof import('xhr2') | undefined;\n\n // The `xhr2` dependency has a side-effect of accessing and modifying a\n // global scope. Loading `xhr2` dynamically allows us to delay the loading\n // and start the process once the global scope is established by the underlying\n // server platform (via shims, etc).\n private async ɵloadImpl(): Promise<void> {\n if (!this.xhrImpl) {\n const {default: xhr} = await import('xhr2');\n this.xhrImpl = xhr;\n }\n }\n\n build(): XMLHttpRequest {\n const impl = this.xhrImpl;\n if (!impl) {\n throw new Error('Unexpected state in ServerXhr: XHR implementation is not loaded.');\n }\n\n return new impl.XMLHttpRequest();\n }\n}\n\nfunction relativeUrlsTransformerInterceptorFn(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const platformLocation = inject(PlatformLocation);\n const {href, protocol, hostname, port} = platformLocation;\n if (!protocol.startsWith('http')) {\n return next(request);\n }\n\n let urlPrefix = `${protocol}//${hostname}`;\n if (port) {\n urlPrefix += `:${port}`;\n }\n\n const baseHref = platformLocation.getBaseHrefFromDOM() || href;\n const baseUrl = new URL(baseHref, urlPrefix);\n const newUrl = new URL(request.url, baseUrl).toString();\n\n return next(request.clone({url: newUrl}));\n}\n\nexport const SERVER_HTTP_PROVIDERS: Provider[] = [\n {provide: XhrFactory, useClass: ServerXhr},\n {\n provide: HTTP_ROOT_INTERCEPTOR_FNS,\n useValue: relativeUrlsTransformerInterceptorFn,\n multi: true,\n },\n];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n DOCUMENT,\n LocationChangeEvent,\n LocationChangeListener,\n PlatformLocation,\n ɵgetDOM as getDOM,\n} from '@angular/common';\nimport {inject, Injectable, ɵWritable as Writable} from '@angular/core';\nimport {Subject} from 'rxjs';\n\nimport {INITIAL_CONFIG} from './tokens';\n\n/**\n * Parses a URL string and returns a URL object.\n * @param urlStr The string to parse.\n * @param origin The origin to use for resolving the URL.\n * @returns The parsed URL.\n */\nexport function parseUrl(urlStr: string, origin: string): URL {\n if (URL.canParse(urlStr)) {\n return new URL(urlStr);\n }\n\n if (urlStr && urlStr[0] !== '/') {\n urlStr = `/${urlStr}`;\n }\n\n return new URL(origin + urlStr);\n}\n\n/**\n * Server-side implementation of URL state. Implements `pathname`, `search`, and `hash`\n * but not the state stack.\n */\n@Injectable()\nexport class ServerPlatformLocation implements PlatformLocation {\n public readonly href: string = '/';\n public readonly hostname: string = '/';\n public readonly protocol: string = '/';\n public readonly port: string = '/';\n public readonly pathname: string = '/';\n public readonly search: string = '';\n public readonly hash: string = '';\n private _hashUpdate = new Subject<LocationChangeEvent>();\n private _doc = inject(DOCUMENT);\n\n constructor() {\n const config = inject(INITIAL_CONFIG, {optional: true});\n if (!config) {\n return;\n }\n if (config.url) {\n const {protocol, hostname, port, pathname, search, hash, href} = parseUrl(\n config.url,\n this._doc.location.origin,\n );\n this.protocol = protocol;\n this.hostname = hostname;\n this.port = port;\n this.pathname = pathname;\n this.search = search;\n this.hash = hash;\n this.href = href;\n }\n }\n\n getBaseHrefFromDOM(): string {\n return getDOM().getBaseHref(this._doc)!;\n }\n\n onPopState(fn: LocationChangeListener): VoidFunction {\n // No-op: a state stack is not implemented, so\n // no events will ever come.\n return () => {};\n }\n\n onHashChange(fn: LocationChangeListener): VoidFunction {\n const subscription = this._hashUpdate.subscribe(fn);\n return () => subscription.unsubscribe();\n }\n\n get url(): string {\n return `${this.pathname}${this.search}${this.hash}`;\n }\n\n private setHash(value: string, oldUrl: string) {\n if (this.hash === value) {\n // Don't fire events if the hash has not changed.\n return;\n }\n (this as Writable<this>).hash = value;\n const newUrl = this.url;\n queueMicrotask(() =>\n this._hashUpdate.next({\n type: 'hashchange',\n state: null,\n oldUrl,\n newUrl,\n } as LocationChangeEvent),\n );\n }\n\n replaceState(state: any, title: string, newUrl: string): void {\n const oldUrl = this.url;\n const {pathname, search, hash, href, protocol} = parseUrl(newUrl, this._doc.location.origin);\n const writableThis = this as Writable<this>;\n writableThis.pathname = pathname;\n writableThis.search = search;\n writableThis.href = href;\n writableThis.protocol = protocol;\n this.setHash(hash, oldUrl);\n }\n\n pushState(state: any, title: string, newUrl: string): void {\n this.replaceState(state, title, newUrl);\n }\n\n forward(): void {\n throw new Error('Not implemented');\n }\n\n back(): void {\n throw new Error('Not implemented');\n }\n\n // History API isn't available on server, therefore return undefined\n getState(): unknown {\n return undefined;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT, ɵgetDOM as getDOM} from '@angular/common';\nimport {Inject, Injectable, type ListenerOptions} from '@angular/core';\nimport {EventManagerPlugin} from '@angular/platform-browser';\n\n@Injectable()\nexport class ServerEventManagerPlugin extends EventManagerPlugin {\n constructor(@Inject(DOCUMENT) private doc: any) {\n super(doc);\n }\n\n // Handle all events on the server.\n override supports(eventName: string) {\n return true;\n }\n\n override addEventListener(\n element: HTMLElement,\n eventName: string,\n handler: Function,\n options?: ListenerOptions,\n ): Function {\n return getDOM().onAndCancel(element, eventName, handler, options);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {\n APP_ID,\n inject,\n InjectionToken,\n Injector,\n Provider,\n TransferState,\n ɵstartMeasuring as startMeasuring,\n ɵstopMeasuring as stopMeasuring,\n} from '@angular/core';\n\nimport {BEFORE_APP_SERIALIZED} from './tokens';\n\n/** Tracks whether the server-side application transfer state has already been serialized. */\nconst TRANSFER_STATE_STATUS = new InjectionToken<{serialized: boolean}>(\n typeof ngDevMode === 'undefined' || ngDevMode ? 'TRANSFER_STATE_STATUS' : '',\n {\n factory: () => ({serialized: false}),\n },\n);\n\nexport const TRANSFER_STATE_SERIALIZATION_PROVIDERS: Provider[] = [\n {\n provide: BEFORE_APP_SERIALIZED,\n useFactory: serializeTransferStateFactory,\n multi: true,\n },\n];\n\n/** TODO: Move this to a utils folder and convert to use SafeValues. */\nexport function createScript(\n doc: Document,\n textContent: string,\n nonce: string | null,\n): HTMLScriptElement {\n const script = doc.createElement('script');\n script.textContent = textContent;\n if (nonce) {\n script.setAttribute('nonce', nonce);\n }\n\n return script;\n}\n\nfunction warnIfStateTransferHappened(injector: Injector): void {\n const transferStateStatus = injector.get(TRANSFER_STATE_STATUS);\n\n if (transferStateStatus.serialized) {\n console.warn(\n `Angular detected an incompatible configuration, which causes duplicate serialization of the server-side application state.\\n\\n` +\n `This can happen if the server providers have been provided more than once using different mechanisms. For example:\\n\\n` +\n ` imports: [ServerModule], // Registers server providers\\n` +\n ` providers: [provideServerRendering()] // Also registers server providers\\n\\n` +\n `To fix this, ensure that the \\`provideServerRendering()\\` function is the only provider used and remove the other(s).`,\n );\n }\n\n transferStateStatus.serialized = true;\n}\n\nfunction serializeTransferStateFactory() {\n const doc = inject(DOCUMENT);\n const appId = inject(APP_ID);\n const transferStore = inject(TransferState);\n const injector = inject(Injector);\n\n return () => {\n const measuringLabel = 'serializeTransferStateFactory';\n startMeasuring(measuringLabel);\n // The `.toJSON` here causes the `onSerialize` callbacks to be called.\n // These callbacks can be used to provide the value for a given key.\n const content = transferStore.toJson();\n\n if (transferStore.isEmpty) {\n // The state is empty, nothing to transfer,\n // avoid creating an extra `<script>` tag in this case.\n return;\n }\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n warnIfStateTransferHappened(injector);\n }\n\n const script = createScript(\n doc,\n content,\n /**\n * `nonce` is not required for 'application/json'\n * See: https://html.spec.whatwg.org/multipage/scripting.html#attr-script-type\n */\n null,\n );\n script.id = appId + '-state';\n script.setAttribute('type', 'application/json');\n\n // It is intentional that we add the script at the very bottom. Angular CLI script tags for\n // bundles are always `type=\"module\"`. These are deferred by default and cause the\n // transfer data to be queried only after the browser has finished parsing the DOM.\n doc.body.appendChild(script);\n stopMeasuring(measuringLabel);\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n DOCUMENT,\n PlatformLocation,\n ViewportScroller,\n ɵgetDOM as getDOM,\n ɵNullViewportScroller as NullViewportScroller,\n ɵPLATFORM_SERVER_ID as PLATFORM_SERVER_ID,\n} from '@angular/common';\nimport {\n createPlatformFactory,\n Injector,\n NgModule,\n PLATFORM_ID,\n PLATFORM_INITIALIZER,\n platformCore,\n PlatformRef,\n Provider,\n Testability,\n ɵsetDocument,\n ɵTESTABILITY as TESTABILITY,\n inject,\n StaticProvider,\n} from '@angular/core';\nimport {\n BrowserModule,\n EVENT_MANAGER_PLUGINS,\n ɵBrowserDomAdapter as BrowserDomAdapter,\n} from '@angular/platform-browser';\n\nimport {DominoAdapter, parseDocument} from './domino_adapter';\nimport {SERVER_HTTP_PROVIDERS} from './http';\nimport {ServerPlatformLocation} from './location';\nimport {enableDomEmulation, PlatformState} from './platform_state';\nimport {ServerEventManagerPlugin} from './server_events';\nimport {INITIAL_CONFIG, PlatformConfig} from './tokens';\nimport {TRANSFER_STATE_SERIALIZATION_PROVIDERS} from './transfer_state';\n\nexport const INTERNAL_SERVER_PLATFORM_PROVIDERS: StaticProvider[] = [\n {provide: DOCUMENT, useFactory: _document},\n {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID},\n {provide: PLATFORM_INITIALIZER, useFactory: initDominoAdapter, multi: true},\n {\n provide: PlatformLocation,\n useClass: ServerPlatformLocation,\n deps: [],\n },\n {provide: PlatformState, deps: [DOCUMENT]},\n];\n\nfunction initDominoAdapter() {\n const injector = inject(Injector);\n const _enableDomEmulation = enableDomEmulation(injector);\n return () => {\n if (_enableDomEmulation) {\n DominoAdapter.makeCurrent();\n } else {\n BrowserDomAdapter.makeCurrent();\n }\n };\n}\n\nexport const SERVER_RENDER_PROVIDERS: Provider[] = [\n {provide: EVENT_MANAGER_PLUGINS, multi: true, useClass: ServerEventManagerPlugin},\n];\n\nexport const PLATFORM_SERVER_PROVIDERS: Provider[] = [\n TRANSFER_STATE_SERIALIZATION_PROVIDERS,\n SERVER_RENDER_PROVIDERS,\n SERVER_HTTP_PROVIDERS,\n {provide: Testability, useValue: null}, // Keep for backwards-compatibility.\n {provide: TESTABILITY, useValue: null},\n {provide: ViewportScroller, useClass: NullViewportScroller},\n];\n\n/**\n * The ng module for the server.\n *\n * @publicApi\n */\n@NgModule({\n exports: [BrowserModule],\n providers: PLATFORM_SERVER_PROVIDERS,\n})\nexport class ServerModule {}\n\nfunction _document() {\n const injector = inject(Injector);\n const config: PlatformConfig | null = injector.get(INITIAL_CONFIG, null);\n const _enableDomEmulation = enableDomEmulation(injector);\n let document: Document;\n if (config && config.document) {\n document =\n typeof config.document === 'string'\n ? _enableDomEmulation\n ? parseDocument(config.document, config.url)\n : window.document\n : config.document;\n } else {\n document = getDOM().createHtmlDocument();\n }\n // Tell ivy about the global document\n ɵsetDocument(document);\n return document;\n}\n\n/**\n * Creates a server-side instance of an Angular platform.\n *\n * This platform should be used when performing server-side rendering of an Angular application.\n * Standalone applications can be bootstrapped on the server using the `bootstrapApplication`\n * function from `@angular/platform-browser`. When using `bootstrapApplication`, the `platformServer`\n * should be created first and passed to the bootstrap function using the `BootstrapContext`.\n *\n * @publicApi\n */\nexport function platformServer(extraProviders?: StaticProvider[] | undefined): PlatformRef {\n const noServerModeSet = typeof ngServerMode === 'undefined';\n if (noServerModeSet) {\n globalThis['ngServerMode'] = true;\n }\n\n const platform = createPlatformFactory(\n platformCore,\n 'server',\n INTERNAL_SERVER_PLATFORM_PROVIDERS,\n )(extraProviders);\n\n if (noServerModeSet) {\n platform.onDestroy(() => {\n globalThis['ngServerMode'] = undefined;\n });\n }\n\n return platform;\n}\n"],"names":["setDomTypes","Object","assign","globalThis","domino","impl","Event","parseDocument","html","url","window","createWindow","doc","document","serializeDocument","serialize","DominoAdapter","BrowserDomAdapter","makeCurrent","setRootDomAdapter","supportsDOMEvents","defaultDoc","createHtmlDocument","getDefaultDocument","createDocument","isElementNode","node","nodeType","ELEMENT_NODE","isShadowRoot","shadowRoot","getGlobalEventTarget","target","defaultView","body","getBaseHref","length","head","children","i","child","tagName","getAttribute","dispatchEvent","el","evt","ownerDocument","win","getUserAgent","getCookie","name","Error","INITIAL_CONFIG","InjectionToken","BEFORE_APP_SERIALIZED","ENABLE_DOM_EMULATION","PlatformState","_doc","_enableDomEmulation","enableDomEmulation","inject","Injector","constructor","renderToString","ngDevMode","measuringLabel","startMeasuring","rendered","documentElement","outerHTML","stopMeasuring","getDocument","ɵfac","i0","ɵɵngDeclareFactory","minVersion","version","ngImport","type","DOCUMENT","ɵɵFactoryTarget","Injectable","decorators","Inject","injector","get","ServerXhr","xhrImpl","ɵloadImpl","default","xhr","build","XMLHttpRequest","deps","relativeUrlsTransformerInterceptorFn","request","next","platformLocation","PlatformLocation","href","protocol","hostname","port","startsWith","urlPrefix","baseHref","getBaseHrefFromDOM","baseUrl","URL","newUrl","toString","clone","SERVER_HTTP_PROVIDERS","provide","XhrFactory","useClass","HTTP_ROOT_INTERCEPTOR_FNS","useValue","multi","parseUrl","urlStr","origin","canParse","ServerPlatformLocation","pathname","search","hash","_hashUpdate","Subject","config","optional","location","getDOM","onPopState","fn","onHashChange","subscription","subscribe","unsubscribe","setHash","value","oldUrl","queueMicrotask","state","replaceState","title","writableThis","pushState","forward","back","getState","undefined","ServerEventManagerPlugin","EventManagerPlugin","supports","eventName","addEventListener","element","handler","options","onAndCancel","TRANSFER_STATE_STATUS","factory","serialized","TRANSFER_STATE_SERIALIZATION_PROVIDERS","useFactory","serializeTransferStateFactory","createScript","textContent","nonce","script","createElement","setAttribute","warnIfStateTransferHappened","transferStateStatus","console","warn","appId","APP_ID","transferStore","TransferState","content","toJson","isEmpty","id","appendChild","INTERNAL_SERVER_PLATFORM_PROVIDERS","_document","PLATFORM_ID","PLATFORM_SERVER_ID","PLATFORM_INITIALIZER","initDominoAdapter","SERVER_RENDER_PROVIDERS","EVENT_MANAGER_PLUGINS","PLATFORM_SERVER_PROVIDERS","Testability","TESTABILITY","ViewportScroller","NullViewportScroller","ServerModule","NgModule","ɵmod","ɵɵngDeclareNgModule","BrowserModule","providers","imports","args","exports","ɵsetDocument","platformServer","extraProviders","noServerModeSet","ngServerMode","platform","createPlatformFactory","platformCore","onDestroy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_server-chunk.mjs","sources":[".../third_party/domino/bundled-domino.mjs';\n\nexport function setDomTypes() {\n // Make all Domino types available in the global env.\n // NB: Any changes here should also be done in `packages/platform-server/init/src/shims.ts`.\n Object.assign(globalThis, domino.impl);\n (globalThis as any)['KeyboardEvent'] = domino.impl.Event;\n}\n\n/**\n * Parses a document string to a Document object.\n */\nexport function parseDocument(html: string, url = '/') {\n let window = domino.createWindow(html, url);\n let doc = window.document;\n return doc;\n}\n\n/**\n * Serializes a document to string.\n */\nexport function serializeDocument(doc: Document): string {\n return (doc as any).serialize();\n}\n\n/**\n * DOM Adapter for the server platform based on https://github.com/fgnass/domino.\n */\nexport class DominoAdapter extends BrowserDomAdapter {\n static override makeCurrent() {\n setDomTypes();\n setRootDomAdapter(new DominoAdapter());\n }\n\n override readonly supportsDOMEvents = false;\n private static defaultDoc: Document;\n\n override createHtmlDocument(): Document {\n return parseDocument('<html><head><title>fakeTitle</title></head><body></body></html>');\n }\n\n override getDefaultDocument(): Document {\n if (!DominoAdapter.defaultDoc) {\n DominoAdapter.defaultDoc = domino.createDocument();\n }\n return DominoAdapter.defaultDoc;\n }\n\n override isElementNode(node: any): boolean {\n return node ? node.nodeType === DominoAdapter.defaultDoc.ELEMENT_NODE : false;\n }\n override isShadowRoot(node: any): boolean {\n return node.shadowRoot == node;\n }\n\n /** @deprecated No longer being used in Ivy code. To be removed in version 14. */\n override getGlobalEventTarget(doc: Document, target: string): EventTarget | null {\n if (target === 'window') {\n return doc.defaultView;\n }\n if (target === 'document') {\n return doc;\n }\n if (target === 'body') {\n return doc.body;\n }\n return null;\n }\n\n override getBaseHref(doc: Document): string {\n const length = doc.head.children.length;\n\n // The `<base>` can only be a direct child of `<head>` so we can save some\n // execution time by looking through them directly instead of querying for it.\n // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/base\n // Note that we can't cache the `href` value itself, because this method gets called with a\n // different document every time which means that in theory the value can be different too.\n for (let i = 0; i < length; i++) {\n const child = doc.head.children[i];\n\n // Tag names are always uppercase for HTML nodes.\n if (child.tagName === 'BASE') {\n // TODO(alxhub): Need relative path logic from BrowserDomAdapter here?\n return child.getAttribute('href') || '';\n }\n }\n\n return '';\n }\n\n override dispatchEvent(el: Node, evt: any) {\n el.dispatchEvent(evt);\n\n // Dispatch the event to the window also.\n const doc = el.ownerDocument || el;\n const win = (doc as any).defaultView;\n if (win) {\n win.dispatchEvent(evt);\n }\n }\n\n override getUserAgent(): string {\n return 'Fake user agent';\n }\n\n override getCookie(name: string): string {\n throw new Error('getCookie has not been implemented');\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\n\n/**\n * Config object passed to initialize the platform.\n *\n * @publicApi\n */\nexport interface PlatformConfig {\n /**\n * The initial DOM to use to bootstrap the server application.\n * @default create a new DOM using Domino\n */\n document?: string;\n /**\n * The URL for the current application state. This is used for initializing\n * the platform's location. `protocol`, `hostname`, and `port`.\n */\n url?: string;\n}\n\n/**\n * The DI token for setting the initial config for the platform.\n *\n * @publicApi\n */\nexport const INITIAL_CONFIG = new InjectionToken<PlatformConfig>('Server.INITIAL_CONFIG');\n\n/**\n * A function that will be executed when calling `renderApplication` or\n * `renderModule` just before current platform state is rendered to string.\n *\n * @publicApi\n */\nexport const BEFORE_APP_SERIALIZED = new InjectionToken<ReadonlyArray<() => void | Promise<void>>>(\n 'Server.RENDER_MODULE_HOOK',\n);\n\nexport const ENABLE_DOM_EMULATION = new InjectionToken<boolean>('ENABLE_DOM_EMULATION');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {\n inject,\n Inject,\n Injectable,\n Injector,\n ɵstartMeasuring as startMeasuring,\n ɵstopMeasuring as stopMeasuring,\n} from '@angular/core';\n\nimport {serializeDocument} from './domino_adapter';\nimport {ENABLE_DOM_EMULATION} from './tokens';\n\n/**\n * Representation of the current platform state.\n *\n * @publicApi\n */\n@Injectable()\nexport class PlatformState {\n /* @internal */\n _enableDomEmulation = enableDomEmulation(inject(Injector));\n\n constructor(@Inject(DOCUMENT) private _doc: any) {}\n\n /**\n * Renders the current state of the platform to string.\n */\n renderToString(): string {\n if (ngDevMode && !this._enableDomEmulation && !window?.document) {\n throw new Error('Disabled DOM emulation should only run in browser environments');\n }\n\n const measuringLabel = 'renderToString';\n startMeasuring(measuringLabel);\n const rendered = this._enableDomEmulation\n ? serializeDocument(this._doc)\n : // In the case we run/test the platform-server in a browser environment\n this._doc.documentElement.outerHTML;\n stopMeasuring(measuringLabel);\n return rendered;\n }\n\n /**\n * Returns the current DOM state.\n */\n getDocument(): any {\n return this._doc;\n }\n}\n\nexport function enableDomEmulation(injector: Injector): boolean {\n return injector.get(ENABLE_DOM_EMULATION, true);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {PlatformLocation, XhrFactory} from '@angular/common';\nimport {\n ɵHTTP_ROOT_INTERCEPTOR_FNS as HTTP_ROOT_INTERCEPTOR_FNS,\n HttpEvent,\n HttpHandlerFn,\n HttpRequest,\n} from '@angular/common/http';\nimport {inject, Injectable, Provider} from '@angular/core';\nimport {Observable} from 'rxjs';\n\n@Injectable()\nexport class ServerXhr implements XhrFactory {\n private xhrImpl: typeof import('xhr2') | undefined;\n\n // The `xhr2` dependency has a side-effect of accessing and modifying a\n // global scope. Loading `xhr2` dynamically allows us to delay the loading\n // and start the process once the global scope is established by the underlying\n // server platform (via shims, etc).\n private async ɵloadImpl(): Promise<void> {\n if (!this.xhrImpl) {\n const {default: xhr} = await import('xhr2');\n this.xhrImpl = xhr;\n }\n }\n\n build(): XMLHttpRequest {\n const impl = this.xhrImpl;\n if (!impl) {\n throw new Error('Unexpected state in ServerXhr: XHR implementation is not loaded.');\n }\n\n return new impl.XMLHttpRequest();\n }\n}\n\n/**\n * Regex to match a URL schema.\n */\nconst URL_SCHEMA_REGEXP = /^(?:[a-zA-Z][a-zA-Z0-9+\\-.]*:)/;\n\nfunction relativeUrlsTransformerInterceptorFn(\n request: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const trimmedUrl = request.url.trim();\n if (URL_SCHEMA_REGEXP.test(trimmedUrl)) {\n // URLs with a schema should be left unchanged.\n return next(request);\n }\n\n const platformLocation = inject(PlatformLocation);\n const {href, protocol, hostname, port} = platformLocation;\n if (!protocol.startsWith('http')) {\n return next(request);\n }\n\n let urlPrefix = `${protocol}//${hostname}`;\n if (port) {\n urlPrefix += `:${port}`;\n }\n\n const baseHref = platformLocation.getBaseHrefFromDOM() || href;\n const baseUrl = new URL(baseHref, urlPrefix);\n\n let parsedUrl = new URL(request.url, baseUrl);\n\n if (parsedUrl.origin !== baseUrl.origin) {\n // If the request changed the origin, we check if it was authorized to do so.\n // Legitimate absolute URLs start with a scheme (e.g. http://) or are protocol-relative (//).\n // SSRF bypasses via backslashes (e.g. `/\\attacker.com`, `\\\\attacker.com`) evade naive checks.\n const isProtocolRelative = /^\\/\\/[^/\\\\]/.test(trimmedUrl);\n if (!isProtocolRelative) {\n // Unrecognized structure that changed origin. Force it to be a local path.\n parsedUrl = new URL(trimmedUrl.replace(/^[/\\\\]+/, '/'), baseUrl);\n }\n }\n\n return next(request.clone({url: parsedUrl.toString()}));\n}\n\nexport const SERVER_HTTP_PROVIDERS: Provider[] = [\n {provide: XhrFactory, useClass: ServerXhr},\n {\n provide: HTTP_ROOT_INTERCEPTOR_FNS,\n useValue: relativeUrlsTransformerInterceptorFn,\n multi: true,\n },\n];\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nconst LEADING_SLASHES_REGEX = /^[/\\\\]+/;\n\n/**\n * Parses a URL string and returns a resolved WHATWG URL object.\n * If no origin is provided, it parses and returns the URL only if it is a valid absolute URL;\n * otherwise it returns `null` (or throws if the URL is a malformed absolute URL).\n * If an origin is provided, relative URLs and protocol-relative URLs are normalized and resolved against it.\n */\nexport function parseUrl(urlStr: string | undefined): URL | null;\nexport function parseUrl(urlStr: string | undefined, origin: string): URL;\nexport function parseUrl(urlStr: string | undefined, origin?: string): URL | null {\n if (!urlStr) {\n return origin !== undefined ? new URL('/', origin) : null;\n }\n\n if (URL.canParse(urlStr)) {\n return new URL(urlStr);\n }\n\n if (/^[a-zA-Z][a-zA-Z0-9+.-]*:(\\/\\/|\\\\\\\\)/.test(urlStr)) {\n throw new Error(`Invalid URL: ${urlStr}`);\n }\n\n if (origin === undefined) {\n return null;\n }\n\n let normalizedPath = urlStr.replace(LEADING_SLASHES_REGEX, '/');\n if (normalizedPath[0] !== '/') {\n normalizedPath = `/${normalizedPath}`;\n }\n\n return new URL(normalizedPath, origin);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n DOCUMENT,\n LocationChangeEvent,\n LocationChangeListener,\n PlatformLocation,\n ɵgetDOM as getDOM,\n} from '@angular/common';\nimport {inject, Injectable, ɵWritable as Writable} from '@angular/core';\nimport {Subject} from 'rxjs';\n\nimport {INITIAL_CONFIG} from './tokens';\nimport {parseUrl} from './url';\n\n/**\n * Server-side implementation of URL state. Implements `pathname`, `search`, and `hash`\n * but not the state stack.\n */\n@Injectable()\nexport class ServerPlatformLocation implements PlatformLocation {\n public readonly href: string = '/';\n public readonly hostname: string = '/';\n public readonly protocol: string = '/';\n public readonly port: string = '/';\n public readonly pathname: string = '/';\n public readonly search: string = '';\n public readonly hash: string = '';\n private _hashUpdate = new Subject<LocationChangeEvent>();\n private _doc = inject(DOCUMENT);\n\n constructor() {\n const config = inject(INITIAL_CONFIG, {optional: true});\n if (!config) {\n return;\n }\n if (config.url) {\n const {protocol, hostname, port, pathname, search, hash, href} = parseUrl(\n config.url,\n this._doc.location.origin,\n );\n this.protocol = protocol;\n this.hostname = hostname;\n this.port = port;\n this.pathname = pathname;\n this.search = search;\n this.hash = hash;\n this.href = href;\n }\n }\n\n getBaseHrefFromDOM(): string {\n return getDOM().getBaseHref(this._doc)!;\n }\n\n onPopState(fn: LocationChangeListener): VoidFunction {\n // No-op: a state stack is not implemented, so\n // no events will ever come.\n return () => {};\n }\n\n onHashChange(fn: LocationChangeListener): VoidFunction {\n const subscription = this._hashUpdate.subscribe(fn);\n return () => subscription.unsubscribe();\n }\n\n get url(): string {\n return `${this.pathname}${this.search}${this.hash}`;\n }\n\n private setHash(value: string, oldUrl: string) {\n if (this.hash === value) {\n // Don't fire events if the hash has not changed.\n return;\n }\n (this as Writable<this>).hash = value;\n const newUrl = this.url;\n queueMicrotask(() =>\n this._hashUpdate.next({\n type: 'hashchange',\n state: null,\n oldUrl,\n newUrl,\n } as LocationChangeEvent),\n );\n }\n\n replaceState(state: any, title: string, newUrl: string): void {\n const oldUrl = this.url;\n const {pathname, search, hash, href, protocol} = parseUrl(newUrl, this._doc.location.origin);\n const writableThis = this as Writable<this>;\n writableThis.pathname = pathname;\n writableThis.search = search;\n writableThis.href = href;\n writableThis.protocol = protocol;\n this.setHash(hash, oldUrl);\n }\n\n pushState(state: any, title: string, newUrl: string): void {\n this.replaceState(state, title, newUrl);\n }\n\n forward(): void {\n throw new Error('Not implemented');\n }\n\n back(): void {\n throw new Error('Not implemented');\n }\n\n // History API isn't available on server, therefore return undefined\n getState(): unknown {\n return undefined;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT, ɵgetDOM as getDOM} from '@angular/common';\nimport {Inject, Injectable, type ListenerOptions} from '@angular/core';\nimport {EventManagerPlugin} from '@angular/platform-browser';\n\n@Injectable()\nexport class ServerEventManagerPlugin extends EventManagerPlugin {\n constructor(@Inject(DOCUMENT) private doc: any) {\n super(doc);\n }\n\n // Handle all events on the server.\n override supports(eventName: string) {\n return true;\n }\n\n override addEventListener(\n element: HTMLElement,\n eventName: string,\n handler: Function,\n options?: ListenerOptions,\n ): Function {\n return getDOM().onAndCancel(element, eventName, handler, options);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {DOCUMENT} from '@angular/common';\nimport {\n APP_ID,\n inject,\n InjectionToken,\n Injector,\n Provider,\n TransferState,\n ɵstartMeasuring as startMeasuring,\n ɵstopMeasuring as stopMeasuring,\n} from '@angular/core';\n\nimport {BEFORE_APP_SERIALIZED} from './tokens';\n\n/** Tracks whether the server-side application transfer state has already been serialized. */\nconst TRANSFER_STATE_STATUS = new InjectionToken<{serialized: boolean}>(\n typeof ngDevMode === 'undefined' || ngDevMode ? 'TRANSFER_STATE_STATUS' : '',\n {\n factory: () => ({serialized: false}),\n },\n);\n\nexport const TRANSFER_STATE_SERIALIZATION_PROVIDERS: Provider[] = [\n {\n provide: BEFORE_APP_SERIALIZED,\n useFactory: serializeTransferStateFactory,\n multi: true,\n },\n];\n\n/** TODO: Move this to a utils folder and convert to use SafeValues. */\nexport function createScript(\n doc: Document,\n textContent: string,\n nonce: string | null,\n): HTMLScriptElement {\n const script = doc.createElement('script');\n script.textContent = textContent;\n if (nonce) {\n script.setAttribute('nonce', nonce);\n }\n\n return script;\n}\n\nfunction warnIfStateTransferHappened(injector: Injector): void {\n const transferStateStatus = injector.get(TRANSFER_STATE_STATUS);\n\n if (transferStateStatus.serialized) {\n console.warn(\n `Angular detected an incompatible configuration, which causes duplicate serialization of the server-side application state.\\n\\n` +\n `This can happen if the server providers have been provided more than once using different mechanisms. For example:\\n\\n` +\n ` imports: [ServerModule], // Registers server providers\\n` +\n ` providers: [provideServerRendering()] // Also registers server providers\\n\\n` +\n `To fix this, ensure that the \\`provideServerRendering()\\` function is the only provider used and remove the other(s).`,\n );\n }\n\n transferStateStatus.serialized = true;\n}\n\nfunction serializeTransferStateFactory() {\n const doc = inject(DOCUMENT);\n const appId = inject(APP_ID);\n const transferStore = inject(TransferState);\n const injector = inject(Injector);\n\n return () => {\n const measuringLabel = 'serializeTransferStateFactory';\n startMeasuring(measuringLabel);\n // The `.toJSON` here causes the `onSerialize` callbacks to be called.\n // These callbacks can be used to provide the value for a given key.\n const content = transferStore.toJson();\n\n if (transferStore.isEmpty) {\n // The state is empty, nothing to transfer,\n // avoid creating an extra `<script>` tag in this case.\n return;\n }\n\n if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n warnIfStateTransferHappened(injector);\n }\n\n const script = createScript(\n doc,\n content,\n /**\n * `nonce` is not required for 'application/json'\n * See: https://html.spec.whatwg.org/multipage/scripting.html#attr-script-type\n */\n null,\n );\n script.id = appId + '-state';\n script.setAttribute('type', 'application/json');\n\n // It is intentional that we add the script at the very bottom. Angular CLI script tags for\n // bundles are always `type=\"module\"`. These are deferred by default and cause the\n // transfer data to be queried only after the browser has finished parsing the DOM.\n doc.body.appendChild(script);\n stopMeasuring(measuringLabel);\n };\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n DOCUMENT,\n PlatformLocation,\n ViewportScroller,\n ɵgetDOM as getDOM,\n ɵNullViewportScroller as NullViewportScroller,\n ɵPLATFORM_SERVER_ID as PLATFORM_SERVER_ID,\n} from '@angular/common';\nimport {\n createPlatformFactory,\n Injector,\n NgModule,\n PLATFORM_ID,\n PLATFORM_INITIALIZER,\n platformCore,\n PlatformRef,\n Provider,\n Testability,\n ɵsetDocument,\n ɵTESTABILITY as TESTABILITY,\n inject,\n StaticProvider,\n} from '@angular/core';\nimport {\n BrowserModule,\n EVENT_MANAGER_PLUGINS,\n ɵBrowserDomAdapter as BrowserDomAdapter,\n} from '@angular/platform-browser';\n\nimport {DominoAdapter, parseDocument} from './domino_adapter';\nimport {SERVER_HTTP_PROVIDERS} from './http';\nimport {parseUrl} from './url';\nimport {ServerPlatformLocation} from './location';\nimport {enableDomEmulation, PlatformState} from './platform_state';\nimport {ServerEventManagerPlugin} from './server_events';\nimport {INITIAL_CONFIG, PlatformConfig} from './tokens';\nimport {TRANSFER_STATE_SERIALIZATION_PROVIDERS} from './transfer_state';\n\nexport const INTERNAL_SERVER_PLATFORM_PROVIDERS: StaticProvider[] = [\n {provide: DOCUMENT, useFactory: _document},\n {provide: PLATFORM_ID, useValue: PLATFORM_SERVER_ID},\n {provide: PLATFORM_INITIALIZER, useFactory: initDominoAdapter, multi: true},\n {\n provide: PlatformLocation,\n useClass: ServerPlatformLocation,\n deps: [],\n },\n {provide: PlatformState, deps: [DOCUMENT]},\n];\n\nfunction initDominoAdapter() {\n const injector = inject(Injector);\n const _enableDomEmulation = enableDomEmulation(injector);\n return () => {\n if (_enableDomEmulation) {\n DominoAdapter.makeCurrent();\n } else {\n BrowserDomAdapter.makeCurrent();\n }\n };\n}\n\nexport const SERVER_RENDER_PROVIDERS: Provider[] = [\n {provide: EVENT_MANAGER_PLUGINS, multi: true, useClass: ServerEventManagerPlugin},\n];\n\nexport const PLATFORM_SERVER_PROVIDERS: Provider[] = [\n TRANSFER_STATE_SERIALIZATION_PROVIDERS,\n SERVER_RENDER_PROVIDERS,\n SERVER_HTTP_PROVIDERS,\n {provide: Testability, useValue: null}, // Keep for backwards-compatibility.\n {provide: TESTABILITY, useValue: null},\n {provide: ViewportScroller, useClass: NullViewportScroller},\n];\n\n/**\n * The ng module for the server.\n *\n * @publicApi\n */\n@NgModule({\n exports: [BrowserModule],\n providers: PLATFORM_SERVER_PROVIDERS,\n})\nexport class ServerModule {}\n\nfunction _document() {\n const injector = inject(Injector);\n const config: PlatformConfig | null = injector.get(INITIAL_CONFIG, null);\n const _enableDomEmulation = enableDomEmulation(injector);\n let document: Document;\n if (config && config.document) {\n document =\n typeof config.document === 'string'\n ? _enableDomEmulation\n ? parseDocument(\n config.document,\n config.url !== undefined ? parseUrl(config.url, 'http://localhost').href : undefined,\n )\n : window.document\n : config.document;\n } else {\n document = getDOM().createHtmlDocument();\n }\n // Tell ivy about the global document\n ɵsetDocument(document);\n return document;\n}\n\n/**\n * Creates a server-side instance of an Angular platform.\n *\n * This platform should be used when performing server-side rendering of an Angular application.\n * Standalone applications can be bootstrapped on the server using the `bootstrapApplication`\n * function from `@angular/platform-browser`. When using `bootstrapApplication`, the `platformServer`\n * should be created first and passed to the bootstrap function using the `BootstrapContext`.\n *\n * @publicApi\n */\nexport function platformServer(extraProviders?: StaticProvider[] | undefined): PlatformRef {\n const noServerModeSet = typeof ngServerMode === 'undefined';\n if (noServerModeSet) {\n globalThis['ngServerMode'] = true;\n }\n\n const platform = createPlatformFactory(\n platformCore,\n 'server',\n INTERNAL_SERVER_PLATFORM_PROVIDERS,\n )(extraProviders);\n\n if (noServerModeSet) {\n platform.onDestroy(() => {\n globalThis['ngServerMode'] = undefined;\n });\n }\n\n return platform;\n}\n"],"names":["setDomTypes","Object","assign","globalThis","domino","impl","Event","parseDocument","html","url","window","createWindow","doc","document","serializeDocument","serialize","DominoAdapter","BrowserDomAdapter","makeCurrent","setRootDomAdapter","supportsDOMEvents","defaultDoc","createHtmlDocument","getDefaultDocument","createDocument","isElementNode","node","nodeType","ELEMENT_NODE","isShadowRoot","shadowRoot","getGlobalEventTarget","target","defaultView","body","getBaseHref","length","head","children","i","child","tagName","getAttribute","dispatchEvent","el","evt","ownerDocument","win","getUserAgent","getCookie","name","Error","INITIAL_CONFIG","InjectionToken","BEFORE_APP_SERIALIZED","ENABLE_DOM_EMULATION","PlatformState","_doc","_enableDomEmulation","enableDomEmulation","inject","Injector","constructor","renderToString","ngDevMode","measuringLabel","startMeasuring","rendered","documentElement","outerHTML","stopMeasuring","getDocument","ɵfac","i0","ɵɵngDeclareFactory","minVersion","version","ngImport","type","DOCUMENT","ɵɵFactoryTarget","Injectable","decorators","Inject","injector","get","ServerXhr","xhrImpl","ɵloadImpl","default","xhr","build","XMLHttpRequest","deps","URL_SCHEMA_REGEXP","relativeUrlsTransformerInterceptorFn","request","next","trimmedUrl","trim","test","platformLocation","PlatformLocation","href","protocol","hostname","port","startsWith","urlPrefix","baseHref","getBaseHrefFromDOM","baseUrl","URL","parsedUrl","origin","isProtocolRelative","replace","clone","toString","SERVER_HTTP_PROVIDERS","provide","XhrFactory","useClass","HTTP_ROOT_INTERCEPTOR_FNS","useValue","multi","LEADING_SLASHES_REGEX","parseUrl","urlStr","undefined","canParse","normalizedPath","ServerPlatformLocation","pathname","search","hash","_hashUpdate","Subject","config","optional","location","getDOM","onPopState","fn","onHashChange","subscription","subscribe","unsubscribe","setHash","value","oldUrl","newUrl","queueMicrotask","state","replaceState","title","writableThis","pushState","forward","back","getState","ServerEventManagerPlugin","EventManagerPlugin","supports","eventName","addEventListener","element","handler","options","onAndCancel","TRANSFER_STATE_STATUS","factory","serialized","TRANSFER_STATE_SERIALIZATION_PROVIDERS","useFactory","serializeTransferStateFactory","createScript","textContent","nonce","script","createElement","setAttribute","warnIfStateTransferHappened","transferStateStatus","console","warn","appId","APP_ID","transferStore","TransferState","content","toJson","isEmpty","id","appendChild","INTERNAL_SERVER_PLATFORM_PROVIDERS","_document","PLATFORM_ID","PLATFORM_SERVER_ID","PLATFORM_INITIALIZER","initDominoAdapter","SERVER_RENDER_PROVIDERS","EVENT_MANAGER_PLUGINS","PLATFORM_SERVER_PROVIDERS","Testability","TESTABILITY","ViewportScroller","NullViewportScroller","ServerModule","NgModule","ɵmod","ɵɵngDeclareNgModule","BrowserModule","providers","imports","args","exports","ɵsetDocument","platformServer","extraProviders","noServerModeSet","ngServerMode","platform","createPlatformFactory","platformCore","onDestroy"],"mappings":";;;;;;;;;;;;;;SAagBA,WAAWA,GAAA;EAGzBC,MAAM,CAACC,MAAM,CAACC,UAAU,EAAEC,MAAM,CAACC,IAAI,CAAC;EACrCF,UAAkB,CAAC,eAAe,CAAC,GAAGC,MAAM,CAACC,IAAI,CAACC,KAAK;AAC1D;SAKgBC,aAAaA,CAACC,IAAY,EAAEC,GAAG,GAAG,GAAG,EAAA;EACnD,IAAIC,MAAM,GAAGN,MAAM,CAACO,YAAY,CAACH,IAAI,EAAEC,GAAG,CAAC;AAC3C,EAAA,IAAIG,GAAG,GAAGF,MAAM,CAACG,QAAQ;AACzB,EAAA,OAAOD,GAAG;AACZ;AAKM,SAAUE,iBAAiBA,CAACF,GAAa,EAAA;AAC7C,EAAA,OAAQA,GAAW,CAACG,SAAS,EAAE;AACjC;AAKM,MAAOC,aAAc,SAAQC,kBAAiB,CAAA;EAClD,OAAgBC,WAAWA,GAAA;AACzBlB,IAAAA,WAAW,EAAE;AACbmB,IAAAA,kBAAiB,CAAC,IAAIH,aAAa,EAAE,CAAC;AACxC,EAAA;AAEkBI,EAAAA,iBAAiB,GAAG,KAAK;AACnC,EAAA,OAAOC,UAAU;AAEhBC,EAAAA,kBAAkBA,GAAA;IACzB,OAAOf,aAAa,CAAC,iEAAiE,CAAC;AACzF,EAAA;AAESgB,EAAAA,kBAAkBA,GAAA;AACzB,IAAA,IAAI,CAACP,aAAa,CAACK,UAAU,EAAE;AAC7BL,MAAAA,aAAa,CAACK,UAAU,GAAGjB,MAAM,CAACoB,cAAc,EAAE;AACpD,IAAA;IACA,OAAOR,aAAa,CAACK,UAAU;AACjC,EAAA;EAESI,aAAaA,CAACC,IAAS,EAAA;AAC9B,IAAA,OAAOA,IAAI,GAAGA,IAAI,CAACC,QAAQ,KAAKX,aAAa,CAACK,UAAU,CAACO,YAAY,GAAG,KAAK;AAC/E,EAAA;EACSC,YAAYA,CAACH,IAAS,EAAA;AAC7B,IAAA,OAAOA,IAAI,CAACI,UAAU,IAAIJ,IAAI;AAChC,EAAA;AAGSK,EAAAA,oBAAoBA,CAACnB,GAAa,EAAEoB,MAAc,EAAA;IACzD,IAAIA,MAAM,KAAK,QAAQ,EAAE;MACvB,OAAOpB,GAAG,CAACqB,WAAW;AACxB,IAAA;IACA,IAAID,MAAM,KAAK,UAAU,EAAE;AACzB,MAAA,OAAOpB,GAAG;AACZ,IAAA;IACA,IAAIoB,MAAM,KAAK,MAAM,EAAE;MACrB,OAAOpB,GAAG,CAACsB,IAAI;AACjB,IAAA;AACA,IAAA,OAAO,IAAI;AACb,EAAA;EAESC,WAAWA,CAACvB,GAAa,EAAA;IAChC,MAAMwB,MAAM,GAAGxB,GAAG,CAACyB,IAAI,CAACC,QAAQ,CAACF,MAAM;IAOvC,KAAK,IAAIG,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,MAAM,EAAEG,CAAC,EAAE,EAAE;MAC/B,MAAMC,KAAK,GAAG5B,GAAG,CAACyB,IAAI,CAACC,QAAQ,CAACC,CAAC,CAAC;AAGlC,MAAA,IAAIC,KAAK,CAACC,OAAO,KAAK,MAAM,EAAE;AAE5B,QAAA,OAAOD,KAAK,CAACE,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE;AACzC,MAAA;AACF,IAAA;AAEA,IAAA,OAAO,EAAE;AACX,EAAA;AAESC,EAAAA,aAAaA,CAACC,EAAQ,EAAEC,GAAQ,EAAA;AACvCD,IAAAA,EAAE,CAACD,aAAa,CAACE,GAAG,CAAC;AAGrB,IAAA,MAAMjC,GAAG,GAAGgC,EAAE,CAACE,aAAa,IAAIF,EAAE;AAClC,IAAA,MAAMG,GAAG,GAAInC,GAAW,CAACqB,WAAW;AACpC,IAAA,IAAIc,GAAG,EAAE;AACPA,MAAAA,GAAG,CAACJ,aAAa,CAACE,GAAG,CAAC;AACxB,IAAA;AACF,EAAA;AAESG,EAAAA,YAAYA,GAAA;AACnB,IAAA,OAAO,iBAAiB;AAC1B,EAAA;EAESC,SAASA,CAACC,IAAY,EAAA;AAC7B,IAAA,MAAM,IAAIC,KAAK,CAAC,oCAAoC,CAAC;AACvD,EAAA;AACD;;MCtFYC,cAAc,GAAG,IAAIC,cAAc,CAAiB,uBAAuB;MAQ3EC,qBAAqB,GAAG,IAAID,cAAc,CACrD,2BAA2B;MAGhBE,oBAAoB,GAAG,IAAIF,cAAc,CAAU,sBAAsB;;MClBzEG,aAAa,CAAA;EAIcC,IAAA;AAFtCC,EAAAA,mBAAmB,GAAGC,kBAAkB,CAACC,MAAM,CAACC,QAAQ,CAAC,CAAC;EAE1DC,WAAAA,CAAsCL,IAAS,EAAA;IAAT,IAAA,CAAAA,IAAI,GAAJA,IAAI;AAAQ,EAAA;AAKlDM,EAAAA,cAAcA,GAAA;IACZ,IAAIC,SAAS,IAAI,CAAC,IAAI,CAACN,mBAAmB,IAAI,CAAChD,MAAM,EAAEG,QAAQ,EAAE;AAC/D,MAAA,MAAM,IAAIsC,KAAK,CAAC,gEAAgE,CAAC;AACnF,IAAA;IAEA,MAAMc,cAAc,GAAG,gBAAgB;IACvCC,eAAc,CAACD,cAAc,CAAC;AAC9B,IAAA,MAAME,QAAQ,GAAG,IAAI,CAACT,mBAAA,GAClB5C,iBAAiB,CAAC,IAAI,CAAC2C,IAAI,CAAA,GAE3B,IAAI,CAACA,IAAI,CAACW,eAAe,CAACC,SAAS;IACvCC,cAAa,CAACL,cAAc,CAAC;AAC7B,IAAA,OAAOE,QAAQ;AACjB,EAAA;AAKAI,EAAAA,WAAWA,GAAA;IACT,OAAO,IAAI,CAACd,IAAI;AAClB,EAAA;AA7BW,EAAA,OAAAe,IAAA,GAAAC,EAAA,CAAAC,kBAAA,CAAA;AAAAC,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,mBAAA;AAAAC,IAAAA,QAAA,EAAAJ,EAAA;AAAAK,IAAAA,IAAA,EAAAtB,aAAa;;aAIJuB;AAAQ,KAAA,CAAA;AAAA/C,IAAAA,MAAA,EAAAyC,EAAA,CAAAO,eAAA,CAAAC;AAAA,GAAA,CAAA;;;;;UAJjBzB;AAAa,GAAA,CAAA;;;;;;QAAbA,aAAa;AAAA0B,EAAAA,UAAA,EAAA,CAAA;UADzBD;;;;;YAKcE,MAAM;aAACJ,QAAQ;;;;AA4BxB,SAAUpB,kBAAkBA,CAACyB,QAAkB,EAAA;AACnD,EAAA,OAAOA,QAAQ,CAACC,GAAG,CAAC9B,oBAAoB,EAAE,IAAI,CAAC;AACjD;;MC1Ca+B,SAAS,CAAA;EACZC,OAAO;EAMP,MAAMC,SAASA,GAAA;AACrB,IAAA,IAAI,CAAC,IAAI,CAACD,OAAO,EAAE;MACjB,MAAM;AAACE,QAAAA,OAAO,EAAEC;AAAG,OAAC,GAAG,MAAM,OAAO,MAAM,CAAC;MAC3C,IAAI,CAACH,OAAO,GAAGG,GAAG;AACpB,IAAA;AACF,EAAA;AAEAC,EAAAA,KAAKA,GAAA;AACH,IAAA,MAAMtF,IAAI,GAAG,IAAI,CAACkF,OAAO;IACzB,IAAI,CAAClF,IAAI,EAAE;AACT,MAAA,MAAM,IAAI8C,KAAK,CAAC,kEAAkE,CAAC;AACrF,IAAA;AAEA,IAAA,OAAO,IAAI9C,IAAI,CAACuF,cAAc,EAAE;AAClC,EAAA;;;;;UArBWN,SAAS;AAAAO,IAAAA,IAAA,EAAA,EAAA;AAAA7D,IAAAA,MAAA,EAAAyC,EAAA,CAAAO,eAAA,CAAAC;AAAA,GAAA,CAAA;;;;;UAATK;AAAS,GAAA,CAAA;;;;;;QAATA,SAAS;AAAAJ,EAAAA,UAAA,EAAA,CAAA;UADrBD;;;AA4BD,MAAMa,iBAAiB,GAAG,gCAAgC;AAE1D,SAASC,oCAAoCA,CAC3CC,OAA6B,EAC7BC,IAAmB,EAAA;EAEnB,MAAMC,UAAU,GAAGF,OAAO,CAACvF,GAAG,CAAC0F,IAAI,EAAE;AACrC,EAAA,IAAIL,iBAAiB,CAACM,IAAI,CAACF,UAAU,CAAC,EAAE;IAEtC,OAAOD,IAAI,CAACD,OAAO,CAAC;AACtB,EAAA;AAEA,EAAA,MAAMK,gBAAgB,GAAGzC,MAAM,CAAC0C,gBAAgB,CAAC;EACjD,MAAM;IAACC,IAAI;IAAEC,QAAQ;IAAEC,QAAQ;AAAEC,IAAAA;AAAI,GAAC,GAAGL,gBAAgB;AACzD,EAAA,IAAI,CAACG,QAAQ,CAACG,UAAU,CAAC,MAAM,CAAC,EAAE;IAChC,OAAOV,IAAI,CAACD,OAAO,CAAC;AACtB,EAAA;AAEA,EAAA,IAAIY,SAAS,GAAG,CAAA,EAAGJ,QAAQ,CAAA,EAAA,EAAKC,QAAQ,CAAA,CAAE;AAC1C,EAAA,IAAIC,IAAI,EAAE;IACRE,SAAS,IAAI,CAAA,CAAA,EAAIF,IAAI,CAAA,CAAE;AACzB,EAAA;EAEA,MAAMG,QAAQ,GAAGR,gBAAgB,CAACS,kBAAkB,EAAE,IAAIP,IAAI;EAC9D,MAAMQ,OAAO,GAAG,IAAIC,GAAG,CAACH,QAAQ,EAAED,SAAS,CAAC;EAE5C,IAAIK,SAAS,GAAG,IAAID,GAAG,CAAChB,OAAO,CAACvF,GAAG,EAAEsG,OAAO,CAAC;AAE7C,EAAA,IAAIE,SAAS,CAACC,MAAM,KAAKH,OAAO,CAACG,MAAM,EAAE;AAIvC,IAAA,MAAMC,kBAAkB,GAAG,aAAa,CAACf,IAAI,CAACF,UAAU,CAAC;IACzD,IAAI,CAACiB,kBAAkB,EAAE;AAEvBF,MAAAA,SAAS,GAAG,IAAID,GAAG,CAACd,UAAU,CAACkB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAEL,OAAO,CAAC;AAClE,IAAA;AACF,EAAA;AAEA,EAAA,OAAOd,IAAI,CAACD,OAAO,CAACqB,KAAK,CAAC;AAAC5G,IAAAA,GAAG,EAAEwG,SAAS,CAACK,QAAQ;AAAE,GAAC,CAAC,CAAC;AACzD;AAEO,MAAMC,qBAAqB,GAAe,CAC/C;AAACC,EAAAA,OAAO,EAAEC,UAAU;AAAEC,EAAAA,QAAQ,EAAEpC;AAAS,CAAC,EAC1C;AACEkC,EAAAA,OAAO,EAAEG,0BAAyB;AAClCC,EAAAA,QAAQ,EAAE7B,oCAAoC;AAC9C8B,EAAAA,KAAK,EAAE;AACR,CAAA,CACF;;ACvFD,MAAMC,qBAAqB,GAAG,SAAS;AAUjC,SAAUC,QAAQA,CAACC,MAA0B,EAAEd,MAAe,EAAA;EAClE,IAAI,CAACc,MAAM,EAAE;AACX,IAAA,OAAOd,MAAM,KAAKe,SAAS,GAAG,IAAIjB,GAAG,CAAC,GAAG,EAAEE,MAAM,CAAC,GAAG,IAAI;AAC3D,EAAA;AAEA,EAAA,IAAIF,GAAG,CAACkB,QAAQ,CAACF,MAAM,CAAC,EAAE;AACxB,IAAA,OAAO,IAAIhB,GAAG,CAACgB,MAAM,CAAC;AACxB,EAAA;AAEA,EAAA,IAAI,sCAAsC,CAAC5B,IAAI,CAAC4B,MAAM,CAAC,EAAE;AACvD,IAAA,MAAM,IAAI7E,KAAK,CAAC,CAAA,aAAA,EAAgB6E,MAAM,EAAE,CAAC;AAC3C,EAAA;EAEA,IAAId,MAAM,KAAKe,SAAS,EAAE;AACxB,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,IAAIE,cAAc,GAAGH,MAAM,CAACZ,OAAO,CAACU,qBAAqB,EAAE,GAAG,CAAC;AAC/D,EAAA,IAAIK,cAAc,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;IAC7BA,cAAc,GAAG,CAAA,CAAA,EAAIA,cAAc,CAAA,CAAE;AACvC,EAAA;AAEA,EAAA,OAAO,IAAInB,GAAG,CAACmB,cAAc,EAAEjB,MAAM,CAAC;AACxC;;MCfakB,sBAAsB,CAAA;AACjB7B,EAAAA,IAAI,GAAW,GAAG;AAClBE,EAAAA,QAAQ,GAAW,GAAG;AACtBD,EAAAA,QAAQ,GAAW,GAAG;AACtBE,EAAAA,IAAI,GAAW,GAAG;AAClB2B,EAAAA,QAAQ,GAAW,GAAG;AACtBC,EAAAA,MAAM,GAAW,EAAE;AACnBC,EAAAA,IAAI,GAAW,EAAE;AACzBC,EAAAA,WAAW,GAAG,IAAIC,OAAO,EAAuB;AAChDhF,EAAAA,IAAI,GAAGG,MAAM,CAACmB,QAAQ,CAAC;AAE/BjB,EAAAA,WAAAA,GAAA;AACE,IAAA,MAAM4E,MAAM,GAAG9E,MAAM,CAACR,cAAc,EAAE;AAACuF,MAAAA,QAAQ,EAAE;AAAI,KAAC,CAAC;IACvD,IAAI,CAACD,MAAM,EAAE;AACX,MAAA;AACF,IAAA;IACA,IAAIA,MAAM,CAACjI,GAAG,EAAE;MACd,MAAM;QAAC+F,QAAQ;QAAEC,QAAQ;QAAEC,IAAI;QAAE2B,QAAQ;QAAEC,MAAM;QAAEC,IAAI;AAAEhC,QAAAA;AAAI,OAAC,GAAGwB,QAAQ,CACvEW,MAAM,CAACjI,GAAG,EACV,IAAI,CAACgD,IAAI,CAACmF,QAAQ,CAAC1B,MAAM,CAC1B;MACD,IAAI,CAACV,QAAQ,GAAGA,QAAQ;MACxB,IAAI,CAACC,QAAQ,GAAGA,QAAQ;MACxB,IAAI,CAACC,IAAI,GAAGA,IAAI;MAChB,IAAI,CAAC2B,QAAQ,GAAGA,QAAQ;MACxB,IAAI,CAACC,MAAM,GAAGA,MAAM;MACpB,IAAI,CAACC,IAAI,GAAGA,IAAI;MAChB,IAAI,CAAChC,IAAI,GAAGA,IAAI;AAClB,IAAA;AACF,EAAA;AAEAO,EAAAA,kBAAkBA,GAAA;IAChB,OAAO+B,OAAM,EAAE,CAAC1G,WAAW,CAAC,IAAI,CAACsB,IAAI,CAAE;AACzC,EAAA;EAEAqF,UAAUA,CAACC,EAA0B,EAAA;IAGnC,OAAO,MAAK,CAAE,CAAC;AACjB,EAAA;EAEAC,YAAYA,CAACD,EAA0B,EAAA;IACrC,MAAME,YAAY,GAAG,IAAI,CAACT,WAAW,CAACU,SAAS,CAACH,EAAE,CAAC;AACnD,IAAA,OAAO,MAAME,YAAY,CAACE,WAAW,EAAE;AACzC,EAAA;EAEA,IAAI1I,GAAGA,GAAA;AACL,IAAA,OAAO,CAAA,EAAG,IAAI,CAAC4H,QAAQ,CAAA,EAAG,IAAI,CAACC,MAAM,CAAA,EAAG,IAAI,CAACC,IAAI,CAAA,CAAE;AACrD,EAAA;AAEQa,EAAAA,OAAOA,CAACC,KAAa,EAAEC,MAAc,EAAA;AAC3C,IAAA,IAAI,IAAI,CAACf,IAAI,KAAKc,KAAK,EAAE;AAEvB,MAAA;AACF,IAAA;IACC,IAAuB,CAACd,IAAI,GAAGc,KAAK;AACrC,IAAA,MAAME,MAAM,GAAG,IAAI,CAAC9I,GAAG;AACvB+I,IAAAA,cAAc,CAAC,MACb,IAAI,CAAChB,WAAW,CAACvC,IAAI,CAAC;AACpBnB,MAAAA,IAAI,EAAE,YAAY;AAClB2E,MAAAA,KAAK,EAAE,IAAI;MACXH,MAAM;AACNC,MAAAA;AACsB,KAAA,CAAC,CAC1B;AACH,EAAA;AAEAG,EAAAA,YAAYA,CAACD,KAAU,EAAEE,KAAa,EAAEJ,MAAc,EAAA;AACpD,IAAA,MAAMD,MAAM,GAAG,IAAI,CAAC7I,GAAG;IACvB,MAAM;MAAC4H,QAAQ;MAAEC,MAAM;MAAEC,IAAI;MAAEhC,IAAI;AAAEC,MAAAA;AAAQ,KAAC,GAAGuB,QAAQ,CAACwB,MAAM,EAAE,IAAI,CAAC9F,IAAI,CAACmF,QAAQ,CAAC1B,MAAM,CAAC;IAC5F,MAAM0C,YAAY,GAAG,IAAsB;IAC3CA,YAAY,CAACvB,QAAQ,GAAGA,QAAQ;IAChCuB,YAAY,CAACtB,MAAM,GAAGA,MAAM;IAC5BsB,YAAY,CAACrD,IAAI,GAAGA,IAAI;IACxBqD,YAAY,CAACpD,QAAQ,GAAGA,QAAQ;AAChC,IAAA,IAAI,CAAC4C,OAAO,CAACb,IAAI,EAAEe,MAAM,CAAC;AAC5B,EAAA;AAEAO,EAAAA,SAASA,CAACJ,KAAU,EAAEE,KAAa,EAAEJ,MAAc,EAAA;IACjD,IAAI,CAACG,YAAY,CAACD,KAAK,EAAEE,KAAK,EAAEJ,MAAM,CAAC;AACzC,EAAA;AAEAO,EAAAA,OAAOA,GAAA;AACL,IAAA,MAAM,IAAI3G,KAAK,CAAC,iBAAiB,CAAC;AACpC,EAAA;AAEA4G,EAAAA,IAAIA,GAAA;AACF,IAAA,MAAM,IAAI5G,KAAK,CAAC,iBAAiB,CAAC;AACpC,EAAA;AAGA6G,EAAAA,QAAQA,GAAA;AACN,IAAA,OAAO/B,SAAS;AAClB,EAAA;;;;;UA7FWG,sBAAsB;AAAAvC,IAAAA,IAAA,EAAA,EAAA;AAAA7D,IAAAA,MAAA,EAAAyC,EAAA,CAAAO,eAAA,CAAAC;AAAA,GAAA,CAAA;;;;;UAAtBmD;AAAsB,GAAA,CAAA;;;;;;QAAtBA,sBAAsB;AAAAlD,EAAAA,UAAA,EAAA,CAAA;UADlCD;;;;;ACZK,MAAOgF,wBAAyB,SAAQC,kBAAkB,CAAA;EACxBtJ,GAAA;EAAtCkD,WAAAA,CAAsClD,GAAQ,EAAA;IAC5C,KAAK,CAACA,GAAG,CAAC;IAD0B,IAAA,CAAAA,GAAG,GAAHA,GAAG;AAEzC,EAAA;EAGSuJ,QAAQA,CAACC,SAAiB,EAAA;AACjC,IAAA,OAAO,IAAI;AACb,EAAA;EAESC,gBAAgBA,CACvBC,OAAoB,EACpBF,SAAiB,EACjBG,OAAiB,EACjBC,OAAyB,EAAA;AAEzB,IAAA,OAAO3B,OAAM,EAAE,CAAC4B,WAAW,CAACH,OAAO,EAAEF,SAAS,EAAEG,OAAO,EAAEC,OAAO,CAAC;AACnE,EAAA;AAjBW,EAAA,OAAAhG,IAAA,GAAAC,EAAA,CAAAC,kBAAA,CAAA;AAAAC,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,mBAAA;AAAAC,IAAAA,QAAA,EAAAJ,EAAA;AAAAK,IAAAA,IAAA,EAAAmF,wBAAwB;;aACflF;AAAQ,KAAA,CAAA;AAAA/C,IAAAA,MAAA,EAAAyC,EAAA,CAAAO,eAAA,CAAAC;AAAA,GAAA,CAAA;;;;;UADjBgF;AAAwB,GAAA,CAAA;;;;;;QAAxBA,wBAAwB;AAAA/E,EAAAA,UAAA,EAAA,CAAA;UADpCD;;;;;YAEcE,MAAM;aAACJ,QAAQ;;;;;ACS9B,MAAM2F,qBAAqB,GAAG,IAAIrH,cAAc,CAC9C,OAAOW,SAAS,KAAK,WAAW,IAAIA,SAAS,GAAG,uBAAuB,GAAG,EAAE,EAC5E;EACE2G,OAAO,EAAEA,OAAO;AAACC,IAAAA,UAAU,EAAE;GAAM;AACpC,CAAA,CACF;AAEM,MAAMC,sCAAsC,GAAe,CAChE;AACErD,EAAAA,OAAO,EAAElE,qBAAqB;AAC9BwH,EAAAA,UAAU,EAAEC,6BAA6B;AACzClD,EAAAA,KAAK,EAAE;AACR,CAAA,CACF;SAGemD,YAAYA,CAC1BpK,GAAa,EACbqK,WAAmB,EACnBC,KAAoB,EAAA;AAEpB,EAAA,MAAMC,MAAM,GAAGvK,GAAG,CAACwK,aAAa,CAAC,QAAQ,CAAC;EAC1CD,MAAM,CAACF,WAAW,GAAGA,WAAW;AAChC,EAAA,IAAIC,KAAK,EAAE;AACTC,IAAAA,MAAM,CAACE,YAAY,CAAC,OAAO,EAAEH,KAAK,CAAC;AACrC,EAAA;AAEA,EAAA,OAAOC,MAAM;AACf;AAEA,SAASG,2BAA2BA,CAAClG,QAAkB,EAAA;AACrD,EAAA,MAAMmG,mBAAmB,GAAGnG,QAAQ,CAACC,GAAG,CAACqF,qBAAqB,CAAC;EAE/D,IAAIa,mBAAmB,CAACX,UAAU,EAAE;AAClCY,IAAAA,OAAO,CAACC,IAAI,CACV,CAAA,8HAAA,CAAgI,GAC9H,CAAA,sHAAA,CAAwH,GACxH,CAAA,0DAAA,CAA4D,GAC5D,CAAA,8EAAA,CAAgF,GAChF,CAAA,qHAAA,CAAuH,CAC1H;AACH,EAAA;EAEAF,mBAAmB,CAACX,UAAU,GAAG,IAAI;AACvC;AAEA,SAASG,6BAA6BA,GAAA;AACpC,EAAA,MAAMnK,GAAG,GAAGgD,MAAM,CAACmB,QAAQ,CAAC;AAC5B,EAAA,MAAM2G,KAAK,GAAG9H,MAAM,CAAC+H,MAAM,CAAC;AAC5B,EAAA,MAAMC,aAAa,GAAGhI,MAAM,CAACiI,aAAa,CAAC;AAC3C,EAAA,MAAMzG,QAAQ,GAAGxB,MAAM,CAACC,QAAQ,CAAC;AAEjC,EAAA,OAAO,MAAK;IACV,MAAMI,cAAc,GAAG,+BAA+B;IACtDC,eAAc,CAACD,cAAc,CAAC;AAG9B,IAAA,MAAM6H,OAAO,GAAGF,aAAa,CAACG,MAAM,EAAE;IAEtC,IAAIH,aAAa,CAACI,OAAO,EAAE;AAGzB,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,OAAOhI,SAAS,KAAK,WAAW,IAAIA,SAAS,EAAE;MACjDsH,2BAA2B,CAAClG,QAAQ,CAAC;AACvC,IAAA;IAEA,MAAM+F,MAAM,GAAGH,YAAY,CACzBpK,GAAG,EACHkL,OAAO,EAKP,IAAI,CACL;AACDX,IAAAA,MAAM,CAACc,EAAE,GAAGP,KAAK,GAAG,QAAQ;AAC5BP,IAAAA,MAAM,CAACE,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC;AAK/CzK,IAAAA,GAAG,CAACsB,IAAI,CAACgK,WAAW,CAACf,MAAM,CAAC;IAC5B7G,cAAa,CAACL,cAAc,CAAC;EAC/B,CAAC;AACH;;AChEO,MAAMkI,kCAAkC,GAAqB,CAClE;AAAC3E,EAAAA,OAAO,EAAEzC,QAAQ;AAAE+F,EAAAA,UAAU,EAAEsB;AAAS,CAAC,EAC1C;AAAC5E,EAAAA,OAAO,EAAE6E,WAAW;AAAEzE,EAAAA,QAAQ,EAAE0E;AAAkB,CAAC,EACpD;AAAC9E,EAAAA,OAAO,EAAE+E,oBAAoB;AAAEzB,EAAAA,UAAU,EAAE0B,iBAAiB;AAAE3E,EAAAA,KAAK,EAAE;AAAI,CAAC,EAC3E;AACEL,EAAAA,OAAO,EAAElB,gBAAgB;AACzBoB,EAAAA,QAAQ,EAAEU,sBAAsB;AAChCvC,EAAAA,IAAI,EAAE;AACP,CAAA,EACD;AAAC2B,EAAAA,OAAO,EAAEhE,aAAa;EAAEqC,IAAI,EAAE,CAACd,QAAQ;AAAC,CAAC;AAG5C,SAASyH,iBAAiBA,GAAA;AACxB,EAAA,MAAMpH,QAAQ,GAAGxB,MAAM,CAACC,QAAQ,CAAC;AACjC,EAAA,MAAMH,mBAAmB,GAAGC,kBAAkB,CAACyB,QAAQ,CAAC;AACxD,EAAA,OAAO,MAAK;AACV,IAAA,IAAI1B,mBAAmB,EAAE;MACvB1C,aAAa,CAACE,WAAW,EAAE;AAC7B,IAAA,CAAA,MAAO;MACLD,kBAAiB,CAACC,WAAW,EAAE;AACjC,IAAA;EACF,CAAC;AACH;AAEO,MAAMuL,uBAAuB,GAAe,CACjD;AAACjF,EAAAA,OAAO,EAAEkF,qBAAqB;AAAE7E,EAAAA,KAAK,EAAE,IAAI;AAAEH,EAAAA,QAAQ,EAAEuC;AAAwB,CAAC;AAG5E,MAAM0C,yBAAyB,GAAe,CACnD9B,sCAAsC,EACtC4B,uBAAuB,EACvBlF,qBAAqB,EACrB;AAACC,EAAAA,OAAO,EAAEoF,WAAW;AAAEhF,EAAAA,QAAQ,EAAE;AAAI,CAAC,EACtC;AAACJ,EAAAA,OAAO,EAAEqF,YAAW;AAAEjF,EAAAA,QAAQ,EAAE;AAAI,CAAC,EACtC;AAACJ,EAAAA,OAAO,EAAEsF,gBAAgB;AAAEpF,EAAAA,QAAQ,EAAEqF;AAAoB,CAAC;MAYhDC,YAAY,CAAA;;;;;UAAZA,YAAY;AAAAnH,IAAAA,IAAA,EAAA,EAAA;AAAA7D,IAAAA,MAAA,EAAAyC,EAAA,CAAAO,eAAA,CAAAiI;AAAA,GAAA,CAAA;AAAZ,EAAA,OAAAC,IAAA,GAAAzI,EAAA,CAAA0I,mBAAA,CAAA;AAAAxI,IAAAA,UAAA,EAAA,QAAA;AAAAC,IAAAA,OAAA,EAAA,mBAAA;AAAAC,IAAAA,QAAA,EAAAJ,EAAA;AAAAK,IAAAA,IAAA,EAAAkI,YAAY;cAHbI,aAAa;AAAA,GAAA,CAAA;;;;;UAGZJ,YAAY;AAAAK,IAAAA,SAAA,EAFZV,yBAAyB;IAAAW,OAAA,EAAA,CAD1BF,aAAa;AAAA,GAAA,CAAA;;;;;;QAGZJ,YAAY;AAAA9H,EAAAA,UAAA,EAAA,CAAA;UAJxB+H,QAAQ;AAACM,IAAAA,IAAA,EAAA,CAAA;MACRC,OAAO,EAAE,CAACJ,aAAa,CAAC;AACxBC,MAAAA,SAAS,EAAEV;KACZ;;;AAGD,SAASP,SAASA,GAAA;AAChB,EAAA,MAAMhH,QAAQ,GAAGxB,MAAM,CAACC,QAAQ,CAAC;EACjC,MAAM6E,MAAM,GAA0BtD,QAAQ,CAACC,GAAG,CAACjC,cAAc,EAAE,IAAI,CAAC;AACxE,EAAA,MAAMM,mBAAmB,GAAGC,kBAAkB,CAACyB,QAAQ,CAAC;AACxD,EAAA,IAAIvE,QAAkB;AACtB,EAAA,IAAI6H,MAAM,IAAIA,MAAM,CAAC7H,QAAQ,EAAE;AAC7BA,IAAAA,QAAQ,GACN,OAAO6H,MAAM,CAAC7H,QAAQ,KAAK,QAAA,GACvB6C,mBAAA,GACEnD,aAAa,CACXmI,MAAM,CAAC7H,QAAQ,EACf6H,MAAM,CAACjI,GAAG,KAAKwH,SAAS,GAAGF,QAAQ,CAACW,MAAM,CAACjI,GAAG,EAAE,kBAAkB,CAAC,CAAC8F,IAAI,GAAG0B,SAAS,CAAA,GAEtFvH,MAAM,CAACG,QAAA,GACT6H,MAAM,CAAC7H,QAAQ;AACvB,EAAA,CAAA,MAAO;AACLA,IAAAA,QAAQ,GAAGgI,OAAM,EAAE,CAACvH,kBAAkB,EAAE;AAC1C,EAAA;EAEAmM,YAAY,CAAC5M,QAAQ,CAAC;AACtB,EAAA,OAAOA,QAAQ;AACjB;AAYM,SAAU6M,cAAcA,CAACC,cAA6C,EAAA;AAC1E,EAAA,MAAMC,eAAe,GAAG,OAAOC,YAAY,KAAK,WAAW;AAC3D,EAAA,IAAID,eAAe,EAAE;AACnBzN,IAAAA,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI;AACnC,EAAA;AAEA,EAAA,MAAM2N,QAAQ,GAAGC,qBAAqB,CACpCC,YAAY,EACZ,QAAQ,EACR7B,kCAAkC,CACnC,CAACwB,cAAc,CAAC;AAEjB,EAAA,IAAIC,eAAe,EAAE;IACnBE,QAAQ,CAACG,SAAS,CAAC,MAAK;AACtB9N,MAAAA,UAAU,CAAC,cAAc,CAAC,GAAG8H,SAAS;AACxC,IAAA,CAAC,CAAC;AACJ,EAAA;AAEA,EAAA,OAAO6F,QAAQ;AACjB;;;;"}
|
package/fesm2022/init.mjs
CHANGED
|
@@ -1,23 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v22.0.0-rc.
|
|
2
|
+
* @license Angular v22.0.0-rc.2
|
|
3
3
|
* (c) 2010-2026 Google LLC. https://angular.dev/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { PLATFORM_SERVER_PROVIDERS, PlatformState, BEFORE_APP_SERIALIZED, platformServer, INITIAL_CONFIG, createScript } from './_server-chunk.mjs';
|
|
7
|
+
import { PLATFORM_SERVER_PROVIDERS, PlatformState, BEFORE_APP_SERIALIZED, parseUrl, platformServer, INITIAL_CONFIG, createScript } from './_server-chunk.mjs';
|
|
8
8
|
export { ServerModule, DominoAdapter as ɵDominoAdapter, ENABLE_DOM_EMULATION as ɵENABLE_DOM_EMULATION, INTERNAL_SERVER_PLATFORM_PROVIDERS as ɵINTERNAL_SERVER_PLATFORM_PROVIDERS, SERVER_RENDER_PROVIDERS as ɵSERVER_RENDER_PROVIDERS } from './_server-chunk.mjs';
|
|
9
9
|
import { makeEnvironmentProviders, InjectionToken, ɵstartMeasuring as _startMeasuring, ɵstopMeasuring as _stopMeasuring, ApplicationRef, ɵINTERNAL_APPLICATION_ERROR_HANDLER as _INTERNAL_APPLICATION_ERROR_HANDLER, ɵIS_HYDRATION_DOM_REUSE_ENABLED as _IS_HYDRATION_DOM_REUSE_ENABLED, ɵannotateForHydration as _annotateForHydration, CSP_NONCE, APP_ID, Renderer2, ɵSSR_CONTENT_INTEGRITY_MARKER as _SSR_CONTENT_INTEGRITY_MARKER, Version } from '@angular/core';
|
|
10
|
+
import { ɵHTTP_FETCH_MAX_RESPONSE_SIZE as _HTTP_FETCH_MAX_RESPONSE_SIZE } from '@angular/common/http';
|
|
10
11
|
import '@angular/common';
|
|
11
12
|
import '@angular/platform-browser';
|
|
12
13
|
import '../third_party/domino/bundled-domino.mjs';
|
|
13
|
-
import '@angular/common/http';
|
|
14
14
|
import 'rxjs';
|
|
15
15
|
|
|
16
|
-
function provideServerRendering() {
|
|
16
|
+
function provideServerRendering(options) {
|
|
17
17
|
if (typeof ngServerMode === 'undefined') {
|
|
18
18
|
globalThis['ngServerMode'] = true;
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
const providers = [...PLATFORM_SERVER_PROVIDERS];
|
|
21
|
+
if (options?.maxResponseBodySize) {
|
|
22
|
+
providers.push({
|
|
23
|
+
provide: _HTTP_FETCH_MAX_RESPONSE_SIZE,
|
|
24
|
+
useValue: options.maxResponseBodySize
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return makeEnvironmentProviders(providers);
|
|
21
28
|
}
|
|
22
29
|
|
|
23
30
|
const EVENT_DISPATCH_SCRIPT_ID = 'ng-event-dispatch-contract';
|
|
@@ -192,11 +199,14 @@ async function renderApplication(bootstrap, options) {
|
|
|
192
199
|
}
|
|
193
200
|
}
|
|
194
201
|
function validateAllowedHosts(url, allowedHosts) {
|
|
195
|
-
if (typeof url === 'string'
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
202
|
+
if (typeof url === 'string') {
|
|
203
|
+
const parsedUrl = parseUrl(url);
|
|
204
|
+
if (parsedUrl !== null) {
|
|
205
|
+
const hostname = parsedUrl.hostname;
|
|
206
|
+
const allowedHostsSet = new Set(allowedHosts);
|
|
207
|
+
if (!isHostAllowed(hostname, allowedHostsSet)) {
|
|
208
|
+
throw new Error(`Host ${url} is not allowed. You can configure \`allowedHosts\` option.`);
|
|
209
|
+
}
|
|
200
210
|
}
|
|
201
211
|
}
|
|
202
212
|
}
|
|
@@ -216,7 +226,7 @@ function isHostAllowed(hostname, allowedHosts) {
|
|
|
216
226
|
return false;
|
|
217
227
|
}
|
|
218
228
|
|
|
219
|
-
const VERSION = /* @__PURE__ */new Version('22.0.0-rc.
|
|
229
|
+
const VERSION = /* @__PURE__ */new Version('22.0.0-rc.2');
|
|
220
230
|
|
|
221
231
|
export { BEFORE_APP_SERIALIZED, INITIAL_CONFIG, PlatformState, VERSION, platformServer, provideServerRendering, renderApplication, renderModule, SERVER_CONTEXT as ɵSERVER_CONTEXT, isHostAllowed as ɵisHostAllowed, renderInternal as ɵrenderInternal };
|
|
222
232
|
//# sourceMappingURL=platform-server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-server.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/platform-server/src/provide_server.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/platform-server/src/utils.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/platform-server/src/version.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\n\nimport {PLATFORM_SERVER_PROVIDERS} from './server';\n\n/**\n * Sets up providers necessary to enable server rendering functionality for the application.\n *\n * @usageNotes\n *\n * Basic example of how you can add server support to your application:\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideServerRendering()]\n * });\n * ```\n *\n * @publicApi\n * @returns A set of providers to setup the server.\n */\nexport function provideServerRendering(): EnvironmentProviders {\n if (typeof ngServerMode === 'undefined') {\n globalThis['ngServerMode'] = true;\n }\n\n return makeEnvironmentProviders([...PLATFORM_SERVER_PROVIDERS]);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n APP_ID,\n ApplicationRef,\n CSP_NONCE,\n InjectionToken,\n PlatformRef,\n Provider,\n Renderer2,\n StaticProvider,\n Type,\n ɵannotateForHydration as annotateForHydration,\n ɵINTERNAL_APPLICATION_ERROR_HANDLER as INTERNAL_APPLICATION_ERROR_HANDLER,\n ɵIS_HYDRATION_DOM_REUSE_ENABLED as IS_HYDRATION_DOM_REUSE_ENABLED,\n ɵSSR_CONTENT_INTEGRITY_MARKER as SSR_CONTENT_INTEGRITY_MARKER,\n ɵstartMeasuring as startMeasuring,\n ɵstopMeasuring as stopMeasuring,\n} from '@angular/core';\nimport {BootstrapContext} from '@angular/platform-browser';\n\nimport {platformServer} from './server';\nimport {PlatformState} from './platform_state';\nimport {BEFORE_APP_SERIALIZED, INITIAL_CONFIG, PlatformConfig} from './tokens';\nimport {createScript} from './transfer_state';\n\n/**\n * Event dispatch (JSAction) script is inlined into the HTML by the build\n * process to avoid extra blocking request on a page. The script looks like this:\n * ```html\n * <script type=\"text/javascript\" id=\"ng-event-dispatch-contract\">...</script>\n * ```\n * This const represents the \"id\" attribute value.\n */\nexport const EVENT_DISPATCH_SCRIPT_ID = 'ng-event-dispatch-contract';\n\ninterface PlatformOptions extends Omit<PlatformConfig, 'document'> {\n document?: string | Document;\n platformProviders?: Provider[];\n}\n\n/**\n * Creates an instance of a server platform (with or without JIT compiler support\n * depending on the `ngJitMode` global const value), using provided options.\n */\nfunction createServerPlatform(options: PlatformOptions): PlatformRef {\n const extraProviders = options.platformProviders ?? [];\n const measuringLabel = 'createServerPlatform';\n startMeasuring(measuringLabel);\n const {document, url} = options;\n\n const platform = platformServer([\n {\n provide: INITIAL_CONFIG,\n useValue: {\n document,\n url,\n },\n },\n extraProviders,\n ]);\n\n stopMeasuring(measuringLabel);\n return platform;\n}\n\n/**\n * Finds and returns inlined event dispatch script if it exists.\n * See the `EVENT_DISPATCH_SCRIPT_ID` const docs for additional info.\n */\nfunction findEventDispatchScript(doc: Document) {\n return doc.getElementById(EVENT_DISPATCH_SCRIPT_ID);\n}\n\n/**\n * Removes inlined event dispatch script if it exists.\n * See the `EVENT_DISPATCH_SCRIPT_ID` const docs for additional info.\n */\nfunction removeEventDispatchScript(doc: Document) {\n findEventDispatchScript(doc)?.remove();\n}\n\n/**\n * Annotate nodes for hydration and remove event dispatch script when not needed.\n */\nfunction prepareForHydration(platformState: PlatformState, applicationRef: ApplicationRef): void {\n const measuringLabel = 'prepareForHydration';\n startMeasuring(measuringLabel);\n const environmentInjector = applicationRef.injector;\n const doc = platformState.getDocument();\n\n if (!environmentInjector.get(IS_HYDRATION_DOM_REUSE_ENABLED, false)) {\n // Hydration is diabled, remove inlined event dispatch script.\n // (which was injected by the build process) from the HTML.\n removeEventDispatchScript(doc);\n\n return;\n }\n\n appendSsrContentIntegrityMarker(doc);\n\n const eventTypesToReplay = annotateForHydration(applicationRef, doc);\n if (eventTypesToReplay.regular.size || eventTypesToReplay.capture.size) {\n insertEventRecordScript(\n environmentInjector.get(APP_ID),\n doc,\n eventTypesToReplay,\n environmentInjector.get(CSP_NONCE, null),\n );\n } else {\n // No events to replay, we should remove inlined event dispatch script\n // (which was injected by the build process) from the HTML.\n removeEventDispatchScript(doc);\n }\n stopMeasuring(measuringLabel);\n}\n\n/**\n * Creates a marker comment node and append it into the `<body>`.\n * Some CDNs have mechanisms to remove all comment node from HTML.\n * This behaviour breaks hydration, so we'll detect on the client side if this\n * marker comment is still available or else throw an error\n */\nfunction appendSsrContentIntegrityMarker(doc: Document) {\n // Adding a ng hydration marker comment\n const comment = doc.createComment(SSR_CONTENT_INTEGRITY_MARKER);\n doc.body.firstChild\n ? doc.body.insertBefore(comment, doc.body.firstChild)\n : doc.body.append(comment);\n}\n\n/**\n * Adds the `ng-server-context` attribute to host elements of all bootstrapped components\n * within a given application.\n */\nfunction appendServerContextInfo(applicationRef: ApplicationRef) {\n const injector = applicationRef.injector;\n let serverContext = sanitizeServerContext(injector.get(SERVER_CONTEXT, DEFAULT_SERVER_CONTEXT));\n applicationRef.components.forEach((componentRef) => {\n const renderer = componentRef.injector.get(Renderer2);\n const element = componentRef.location.nativeElement;\n if (element) {\n renderer.setAttribute(element, 'ng-server-context', serverContext);\n }\n });\n}\n\nfunction insertEventRecordScript(\n appId: string,\n doc: Document,\n eventTypesToReplay: {regular: Set<string>; capture: Set<string>},\n nonce: string | null,\n): void {\n const measuringLabel = 'insertEventRecordScript';\n startMeasuring(measuringLabel);\n const {regular, capture} = eventTypesToReplay;\n const eventDispatchScript = findEventDispatchScript(doc);\n\n // Note: this is only true when build with the CLI tooling, which inserts the script in the HTML\n if (eventDispatchScript) {\n // This is defined in packages/core/primitives/event-dispatch/contract_binary.ts\n const replayScriptContents =\n `window.__jsaction_bootstrap(` +\n `document.body,` +\n `\"${appId}\",` +\n `${JSON.stringify(Array.from(regular))},` +\n `${JSON.stringify(Array.from(capture))}` +\n `);`;\n\n const replayScript = createScript(doc, replayScriptContents, nonce);\n\n // Insert replay script right after inlined event dispatch script, since it\n // relies on `__jsaction_bootstrap` to be defined in the global scope.\n eventDispatchScript.after(replayScript);\n }\n stopMeasuring(measuringLabel);\n}\n\n/**\n * Renders an Angular application to a string.\n *\n * @private\n *\n * @param platformRef - Reference to the Angular platform.\n * @param applicationRef - Reference to the Angular application.\n * @returns A promise that resolves to the rendered string.\n */\nexport async function renderInternal(\n platformRef: PlatformRef,\n applicationRef: ApplicationRef,\n): Promise<string> {\n const platformState = platformRef.injector.get(PlatformState);\n prepareForHydration(platformState, applicationRef);\n appendServerContextInfo(applicationRef);\n\n // Run any BEFORE_APP_SERIALIZED callbacks just before rendering to string.\n const environmentInjector = applicationRef.injector;\n const errorHandler = environmentInjector.get(INTERNAL_APPLICATION_ERROR_HANDLER);\n const callbacks = environmentInjector.get(BEFORE_APP_SERIALIZED, null);\n if (callbacks) {\n const asyncCallbacks: Promise<void>[] = [];\n for (const callback of callbacks) {\n try {\n const callbackResult = callback();\n if (callbackResult) {\n asyncCallbacks.push(callbackResult);\n }\n } catch (e) {\n // Delegate to the application's ErrorHandler so custom handlers\n // (e.g. Sentry) are notified, rather than writing directly to console.\n errorHandler(e);\n }\n }\n\n if (asyncCallbacks.length) {\n for (const result of await Promise.allSettled(asyncCallbacks)) {\n if (result.status === 'rejected') {\n errorHandler(result.reason);\n }\n }\n }\n }\n\n return platformState.renderToString();\n}\n\n/**\n * Destroy the application in a macrotask, this allows pending promises to be settled and errors\n * to be surfaced to the users.\n */\nfunction asyncDestroyPlatform(platformRef: PlatformRef): Promise<void> {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n platformRef.destroy();\n resolve();\n }, 0);\n });\n}\n\n/**\n * Specifies the value that should be used if no server context value has been provided.\n */\nconst DEFAULT_SERVER_CONTEXT = 'other';\n\n/**\n * An internal token that allows providing extra information about the server context\n * (e.g. whether SSR or SSG was used). The value is a string and characters other\n * than [a-zA-Z0-9\\-] are removed. See the default value in `DEFAULT_SERVER_CONTEXT` const.\n */\nexport const SERVER_CONTEXT = new InjectionToken<string>('SERVER_CONTEXT');\n\n/**\n * Sanitizes provided server context:\n * - removes all characters other than a-z, A-Z, 0-9 and `-`\n * - returns `other` if nothing is provided or the string is empty after sanitization\n */\nfunction sanitizeServerContext(serverContext: string): string {\n const context = serverContext.replace(/[^a-zA-Z0-9\\-]/g, '');\n return context.length > 0 ? context : DEFAULT_SERVER_CONTEXT;\n}\n\n/**\n * Bootstraps an application using provided NgModule and serializes the page content to string.\n *\n * @param moduleType A reference to an NgModule that should be used for bootstrap.\n * @param options Additional configuration for the render operation:\n * - `document` - the document of the page to render, either as an HTML string or\n * as a reference to the `document` instance.\n * - `url` - the URL for the current render request.\n * - `extraProviders` - set of platform level providers for the current render request.\n * - `allowedHosts` - the allowed hosts list for host validation in server-side rendering.\n * @publicApi\n */\nexport async function renderModule<T>(\n moduleType: Type<T>,\n options: {\n document?: string | Document;\n url?: string;\n extraProviders?: StaticProvider[];\n allowedHosts?: Readonly<string>[];\n },\n): Promise<string> {\n const {document, url, extraProviders: platformProviders, allowedHosts} = options;\n validateAllowedHosts(url, allowedHosts);\n const platformRef = createServerPlatform({document, url, platformProviders});\n try {\n const moduleRef = await platformRef.bootstrapModule(moduleType);\n const applicationRef = moduleRef.injector.get(ApplicationRef);\n\n const measuringLabel = 'whenStable';\n startMeasuring(measuringLabel);\n // Block until application is stable.\n await applicationRef.whenStable();\n stopMeasuring(measuringLabel);\n\n return await renderInternal(platformRef, applicationRef);\n } finally {\n await asyncDestroyPlatform(platformRef);\n }\n}\n\n/**\n * Bootstraps an instance of an Angular application and renders it to a string.\n *\n * @usageNotes\n *\n * ```ts\n * import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser';\n * import { renderApplication } from '@angular/platform-server';\n * import { ApplicationConfig } from '@angular/core';\n * import { AppComponent } from './app.component';\n *\n * const appConfig: ApplicationConfig = { providers: [...] };\n * const bootstrap = (context: BootstrapContext) =>\n * bootstrapApplication(AppComponent, config, context);\n * const output = await renderApplication(bootstrap);\n * ```\n *\n * @param bootstrap A method that when invoked returns a promise that returns an `ApplicationRef`\n * instance once resolved. The method is invoked with an `Injector` instance that\n * provides access to the platform-level dependency injection context.\n * @param options Additional configuration for the render operation:\n * - `document` - the document of the page to render, either as an HTML string or\n * as a reference to the `document` instance.\n * - `url` - the URL for the current render request.\n * - `platformProviders` - the platform level providers for the current render request.\n * - `allowedHosts` - the allowed hosts list for host validation in server-side rendering.\n *\n * @returns A Promise, that returns serialized (to a string) rendered page, once resolved.\n *\n * @publicApi\n */\nexport async function renderApplication(\n bootstrap: (context: BootstrapContext) => Promise<ApplicationRef>,\n options: {\n document?: string | Document;\n url?: string;\n platformProviders?: Provider[];\n allowedHosts?: Readonly<string>[];\n },\n): Promise<string> {\n const renderAppLabel = 'renderApplication';\n const bootstrapLabel = 'bootstrap';\n const _renderLabel = '_render';\n const {url, allowedHosts} = options;\n\n validateAllowedHosts(url, allowedHosts);\n\n startMeasuring(renderAppLabel);\n const platformRef = createServerPlatform(options);\n try {\n startMeasuring(bootstrapLabel);\n const applicationRef = await bootstrap({platformRef});\n stopMeasuring(bootstrapLabel);\n\n startMeasuring(_renderLabel);\n\n const measuringLabel = 'whenStable';\n startMeasuring(measuringLabel);\n // Block until application is stable.\n await applicationRef.whenStable();\n stopMeasuring(measuringLabel);\n\n const rendered = await renderInternal(platformRef, applicationRef);\n stopMeasuring(_renderLabel);\n return rendered;\n } finally {\n await asyncDestroyPlatform(platformRef);\n stopMeasuring(renderAppLabel);\n }\n}\n\nfunction validateAllowedHosts(url: string | undefined, allowedHosts: string[] | undefined) {\n if (typeof url === 'string' && URL.canParse(url)) {\n const hostname = new URL(url).hostname;\n const allowedHostsSet: ReadonlySet<string> = new Set(allowedHosts);\n if (!isHostAllowed(hostname, allowedHostsSet)) {\n throw new Error(`Host ${url} is not allowed. You can configure \\`allowedHosts\\` option.`);\n }\n }\n}\n\n/**\n * Checks if the hostname is allowed.\n * @param hostname - The hostname to check.\n * @param allowedHosts - A set of allowed hostnames.\n * @returns `true` if the hostname is allowed, `false` otherwise.\n * @note Used also in `@angular/ssr`.\n * @private\n */\nexport function isHostAllowed(hostname: string, allowedHosts: ReadonlySet<string>): boolean {\n if (allowedHosts.has('*') || allowedHosts.has(hostname)) {\n return true;\n }\n\n for (const allowedHost of allowedHosts) {\n if (!allowedHost.startsWith('*.')) {\n continue;\n }\n\n const domain = allowedHost.slice(1);\n if (hostname.endsWith(domain)) {\n return true;\n }\n }\n\n return false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the platform-server package.\n */\n\nimport {Version} from '@angular/core';\n\n/**\n * @publicApi\n */\nexport const VERSION = /* @__PURE__ */ new Version('22.0.0-rc.1');\n"],"names":["provideServerRendering","ngServerMode","globalThis","makeEnvironmentProviders","PLATFORM_SERVER_PROVIDERS","EVENT_DISPATCH_SCRIPT_ID","createServerPlatform","options","extraProviders","platformProviders","measuringLabel","startMeasuring","document","url","platform","platformServer","provide","INITIAL_CONFIG","useValue","stopMeasuring","findEventDispatchScript","doc","getElementById","removeEventDispatchScript","remove","prepareForHydration","platformState","applicationRef","environmentInjector","injector","getDocument","get","IS_HYDRATION_DOM_REUSE_ENABLED","appendSsrContentIntegrityMarker","eventTypesToReplay","annotateForHydration","regular","size","capture","insertEventRecordScript","APP_ID","CSP_NONCE","comment","createComment","SSR_CONTENT_INTEGRITY_MARKER","body","firstChild","insertBefore","append","appendServerContextInfo","serverContext","sanitizeServerContext","SERVER_CONTEXT","DEFAULT_SERVER_CONTEXT","components","forEach","componentRef","renderer","Renderer2","element","location","nativeElement","setAttribute","appId","nonce","eventDispatchScript","replayScriptContents","JSON","stringify","Array","from","replayScript","createScript","after","renderInternal","platformRef","PlatformState","errorHandler","INTERNAL_APPLICATION_ERROR_HANDLER","callbacks","BEFORE_APP_SERIALIZED","asyncCallbacks","callback","callbackResult","push","e","length","result","Promise","allSettled","status","reason","renderToString","asyncDestroyPlatform","resolve","setTimeout","destroy","InjectionToken","context","replace","renderModule","moduleType","allowedHosts","validateAllowedHosts","moduleRef","bootstrapModule","ApplicationRef","whenStable","renderApplication","bootstrap","renderAppLabel","bootstrapLabel","_renderLabel","rendered","URL","canParse","hostname","allowedHostsSet","Set","isHostAllowed","Error","has","allowedHost","startsWith","domain","slice","endsWith","VERSION","Version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-server.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/platform-server/src/provide_server.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/platform-server/src/utils.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/platform-server/src/version.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\n\nimport {ɵHTTP_FETCH_MAX_RESPONSE_SIZE as HTTP_FETCH_MAX_RESPONSE_SIZE} from '@angular/common/http';\nimport {PLATFORM_SERVER_PROVIDERS} from './server';\n\n/**\n * Sets up providers necessary to enable server rendering functionality for the application.\n *\n * @param options An object to configure the server providers. Currently supports the following options:\n * - `maxResponseBodySize`: The maximum allowed response body size when using the Fetch API.\n *\n * @usageNotes\n *\n * Basic example of how you can add server support to your application:\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideServerRendering()]\n * });\n * ```\n *\n * @publicApi\n * @returns A set of providers to setup the server.\n */\nexport function provideServerRendering(options?: {\n maxResponseBodySize: number;\n}): EnvironmentProviders {\n if (typeof ngServerMode === 'undefined') {\n globalThis['ngServerMode'] = true;\n }\n\n const providers = [...PLATFORM_SERVER_PROVIDERS];\n if (options?.maxResponseBodySize) {\n providers.push({provide: HTTP_FETCH_MAX_RESPONSE_SIZE, useValue: options.maxResponseBodySize});\n }\n\n return makeEnvironmentProviders(providers);\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n APP_ID,\n ApplicationRef,\n CSP_NONCE,\n InjectionToken,\n PlatformRef,\n Provider,\n Renderer2,\n StaticProvider,\n Type,\n ɵannotateForHydration as annotateForHydration,\n ɵINTERNAL_APPLICATION_ERROR_HANDLER as INTERNAL_APPLICATION_ERROR_HANDLER,\n ɵIS_HYDRATION_DOM_REUSE_ENABLED as IS_HYDRATION_DOM_REUSE_ENABLED,\n ɵSSR_CONTENT_INTEGRITY_MARKER as SSR_CONTENT_INTEGRITY_MARKER,\n ɵstartMeasuring as startMeasuring,\n ɵstopMeasuring as stopMeasuring,\n} from '@angular/core';\nimport {BootstrapContext} from '@angular/platform-browser';\n\nimport {platformServer} from './server';\nimport {PlatformState} from './platform_state';\nimport {BEFORE_APP_SERIALIZED, INITIAL_CONFIG, PlatformConfig} from './tokens';\nimport {createScript} from './transfer_state';\nimport {parseUrl} from './url';\n\n/**\n * Event dispatch (JSAction) script is inlined into the HTML by the build\n * process to avoid extra blocking request on a page. The script looks like this:\n * ```html\n * <script type=\"text/javascript\" id=\"ng-event-dispatch-contract\">...</script>\n * ```\n * This const represents the \"id\" attribute value.\n */\nexport const EVENT_DISPATCH_SCRIPT_ID = 'ng-event-dispatch-contract';\n\ninterface PlatformOptions extends Omit<PlatformConfig, 'document'> {\n document?: string | Document;\n platformProviders?: Provider[];\n}\n\n/**\n * Creates an instance of a server platform (with or without JIT compiler support\n * depending on the `ngJitMode` global const value), using provided options.\n */\nfunction createServerPlatform(options: PlatformOptions): PlatformRef {\n const extraProviders = options.platformProviders ?? [];\n const measuringLabel = 'createServerPlatform';\n startMeasuring(measuringLabel);\n const {document, url} = options;\n\n const platform = platformServer([\n {\n provide: INITIAL_CONFIG,\n useValue: {\n document,\n url,\n },\n },\n extraProviders,\n ]);\n\n stopMeasuring(measuringLabel);\n return platform;\n}\n\n/**\n * Finds and returns inlined event dispatch script if it exists.\n * See the `EVENT_DISPATCH_SCRIPT_ID` const docs for additional info.\n */\nfunction findEventDispatchScript(doc: Document) {\n return doc.getElementById(EVENT_DISPATCH_SCRIPT_ID);\n}\n\n/**\n * Removes inlined event dispatch script if it exists.\n * See the `EVENT_DISPATCH_SCRIPT_ID` const docs for additional info.\n */\nfunction removeEventDispatchScript(doc: Document) {\n findEventDispatchScript(doc)?.remove();\n}\n\n/**\n * Annotate nodes for hydration and remove event dispatch script when not needed.\n */\nfunction prepareForHydration(platformState: PlatformState, applicationRef: ApplicationRef): void {\n const measuringLabel = 'prepareForHydration';\n startMeasuring(measuringLabel);\n const environmentInjector = applicationRef.injector;\n const doc = platformState.getDocument();\n\n if (!environmentInjector.get(IS_HYDRATION_DOM_REUSE_ENABLED, false)) {\n // Hydration is diabled, remove inlined event dispatch script.\n // (which was injected by the build process) from the HTML.\n removeEventDispatchScript(doc);\n\n return;\n }\n\n appendSsrContentIntegrityMarker(doc);\n\n const eventTypesToReplay = annotateForHydration(applicationRef, doc);\n if (eventTypesToReplay.regular.size || eventTypesToReplay.capture.size) {\n insertEventRecordScript(\n environmentInjector.get(APP_ID),\n doc,\n eventTypesToReplay,\n environmentInjector.get(CSP_NONCE, null),\n );\n } else {\n // No events to replay, we should remove inlined event dispatch script\n // (which was injected by the build process) from the HTML.\n removeEventDispatchScript(doc);\n }\n stopMeasuring(measuringLabel);\n}\n\n/**\n * Creates a marker comment node and append it into the `<body>`.\n * Some CDNs have mechanisms to remove all comment node from HTML.\n * This behaviour breaks hydration, so we'll detect on the client side if this\n * marker comment is still available or else throw an error\n */\nfunction appendSsrContentIntegrityMarker(doc: Document) {\n // Adding a ng hydration marker comment\n const comment = doc.createComment(SSR_CONTENT_INTEGRITY_MARKER);\n doc.body.firstChild\n ? doc.body.insertBefore(comment, doc.body.firstChild)\n : doc.body.append(comment);\n}\n\n/**\n * Adds the `ng-server-context` attribute to host elements of all bootstrapped components\n * within a given application.\n */\nfunction appendServerContextInfo(applicationRef: ApplicationRef) {\n const injector = applicationRef.injector;\n let serverContext = sanitizeServerContext(injector.get(SERVER_CONTEXT, DEFAULT_SERVER_CONTEXT));\n applicationRef.components.forEach((componentRef) => {\n const renderer = componentRef.injector.get(Renderer2);\n const element = componentRef.location.nativeElement;\n if (element) {\n renderer.setAttribute(element, 'ng-server-context', serverContext);\n }\n });\n}\n\nfunction insertEventRecordScript(\n appId: string,\n doc: Document,\n eventTypesToReplay: {regular: Set<string>; capture: Set<string>},\n nonce: string | null,\n): void {\n const measuringLabel = 'insertEventRecordScript';\n startMeasuring(measuringLabel);\n const {regular, capture} = eventTypesToReplay;\n const eventDispatchScript = findEventDispatchScript(doc);\n\n // Note: this is only true when build with the CLI tooling, which inserts the script in the HTML\n if (eventDispatchScript) {\n // This is defined in packages/core/primitives/event-dispatch/contract_binary.ts\n const replayScriptContents =\n `window.__jsaction_bootstrap(` +\n `document.body,` +\n `\"${appId}\",` +\n `${JSON.stringify(Array.from(regular))},` +\n `${JSON.stringify(Array.from(capture))}` +\n `);`;\n\n const replayScript = createScript(doc, replayScriptContents, nonce);\n\n // Insert replay script right after inlined event dispatch script, since it\n // relies on `__jsaction_bootstrap` to be defined in the global scope.\n eventDispatchScript.after(replayScript);\n }\n stopMeasuring(measuringLabel);\n}\n\n/**\n * Renders an Angular application to a string.\n *\n * @private\n *\n * @param platformRef - Reference to the Angular platform.\n * @param applicationRef - Reference to the Angular application.\n * @returns A promise that resolves to the rendered string.\n */\nexport async function renderInternal(\n platformRef: PlatformRef,\n applicationRef: ApplicationRef,\n): Promise<string> {\n const platformState = platformRef.injector.get(PlatformState);\n prepareForHydration(platformState, applicationRef);\n appendServerContextInfo(applicationRef);\n\n // Run any BEFORE_APP_SERIALIZED callbacks just before rendering to string.\n const environmentInjector = applicationRef.injector;\n const errorHandler = environmentInjector.get(INTERNAL_APPLICATION_ERROR_HANDLER);\n const callbacks = environmentInjector.get(BEFORE_APP_SERIALIZED, null);\n if (callbacks) {\n const asyncCallbacks: Promise<void>[] = [];\n for (const callback of callbacks) {\n try {\n const callbackResult = callback();\n if (callbackResult) {\n asyncCallbacks.push(callbackResult);\n }\n } catch (e) {\n // Delegate to the application's ErrorHandler so custom handlers\n // (e.g. Sentry) are notified, rather than writing directly to console.\n errorHandler(e);\n }\n }\n\n if (asyncCallbacks.length) {\n for (const result of await Promise.allSettled(asyncCallbacks)) {\n if (result.status === 'rejected') {\n errorHandler(result.reason);\n }\n }\n }\n }\n\n return platformState.renderToString();\n}\n\n/**\n * Destroy the application in a macrotask, this allows pending promises to be settled and errors\n * to be surfaced to the users.\n */\nfunction asyncDestroyPlatform(platformRef: PlatformRef): Promise<void> {\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n platformRef.destroy();\n resolve();\n }, 0);\n });\n}\n\n/**\n * Specifies the value that should be used if no server context value has been provided.\n */\nconst DEFAULT_SERVER_CONTEXT = 'other';\n\n/**\n * An internal token that allows providing extra information about the server context\n * (e.g. whether SSR or SSG was used). The value is a string and characters other\n * than [a-zA-Z0-9\\-] are removed. See the default value in `DEFAULT_SERVER_CONTEXT` const.\n */\nexport const SERVER_CONTEXT = new InjectionToken<string>('SERVER_CONTEXT');\n\n/**\n * Sanitizes provided server context:\n * - removes all characters other than a-z, A-Z, 0-9 and `-`\n * - returns `other` if nothing is provided or the string is empty after sanitization\n */\nfunction sanitizeServerContext(serverContext: string): string {\n const context = serverContext.replace(/[^a-zA-Z0-9\\-]/g, '');\n return context.length > 0 ? context : DEFAULT_SERVER_CONTEXT;\n}\n\n/**\n * Bootstraps an application using provided NgModule and serializes the page content to string.\n *\n * @param moduleType A reference to an NgModule that should be used for bootstrap.\n * @param options Additional configuration for the render operation:\n * - `document` - the document of the page to render, either as an HTML string or\n * as a reference to the `document` instance.\n * - `url` - the URL for the current render request.\n * - `extraProviders` - set of platform level providers for the current render request.\n * - `allowedHosts` - the allowed hosts list for host validation in server-side rendering.\n * @publicApi\n */\nexport async function renderModule<T>(\n moduleType: Type<T>,\n options: {\n document?: string | Document;\n url?: string;\n extraProviders?: StaticProvider[];\n allowedHosts?: Readonly<string>[];\n },\n): Promise<string> {\n const {document, url, extraProviders: platformProviders, allowedHosts} = options;\n validateAllowedHosts(url, allowedHosts);\n const platformRef = createServerPlatform({document, url, platformProviders});\n try {\n const moduleRef = await platformRef.bootstrapModule(moduleType);\n const applicationRef = moduleRef.injector.get(ApplicationRef);\n\n const measuringLabel = 'whenStable';\n startMeasuring(measuringLabel);\n // Block until application is stable.\n await applicationRef.whenStable();\n stopMeasuring(measuringLabel);\n\n return await renderInternal(platformRef, applicationRef);\n } finally {\n await asyncDestroyPlatform(platformRef);\n }\n}\n\n/**\n * Bootstraps an instance of an Angular application and renders it to a string.\n *\n * @usageNotes\n *\n * ```ts\n * import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser';\n * import { renderApplication } from '@angular/platform-server';\n * import { ApplicationConfig } from '@angular/core';\n * import { AppComponent } from './app.component';\n *\n * const appConfig: ApplicationConfig = { providers: [...] };\n * const bootstrap = (context: BootstrapContext) =>\n * bootstrapApplication(AppComponent, config, context);\n * const output = await renderApplication(bootstrap);\n * ```\n *\n * @param bootstrap A method that when invoked returns a promise that returns an `ApplicationRef`\n * instance once resolved. The method is invoked with an `Injector` instance that\n * provides access to the platform-level dependency injection context.\n * @param options Additional configuration for the render operation:\n * - `document` - the document of the page to render, either as an HTML string or\n * as a reference to the `document` instance.\n * - `url` - the URL for the current render request.\n * - `platformProviders` - the platform level providers for the current render request.\n * - `allowedHosts` - the allowed hosts list for host validation in server-side rendering.\n *\n * @returns A Promise, that returns serialized (to a string) rendered page, once resolved.\n *\n * @publicApi\n */\nexport async function renderApplication(\n bootstrap: (context: BootstrapContext) => Promise<ApplicationRef>,\n options: {\n document?: string | Document;\n url?: string;\n platformProviders?: Provider[];\n allowedHosts?: Readonly<string>[];\n },\n): Promise<string> {\n const renderAppLabel = 'renderApplication';\n const bootstrapLabel = 'bootstrap';\n const _renderLabel = '_render';\n const {url, allowedHosts} = options;\n\n validateAllowedHosts(url, allowedHosts);\n\n startMeasuring(renderAppLabel);\n const platformRef = createServerPlatform(options);\n try {\n startMeasuring(bootstrapLabel);\n const applicationRef = await bootstrap({platformRef});\n stopMeasuring(bootstrapLabel);\n\n startMeasuring(_renderLabel);\n\n const measuringLabel = 'whenStable';\n startMeasuring(measuringLabel);\n // Block until application is stable.\n await applicationRef.whenStable();\n stopMeasuring(measuringLabel);\n\n const rendered = await renderInternal(platformRef, applicationRef);\n stopMeasuring(_renderLabel);\n return rendered;\n } finally {\n await asyncDestroyPlatform(platformRef);\n stopMeasuring(renderAppLabel);\n }\n}\n\nfunction validateAllowedHosts(url: string | undefined, allowedHosts: string[] | undefined) {\n if (typeof url === 'string') {\n const parsedUrl = parseUrl(url);\n if (parsedUrl !== null) {\n const hostname = parsedUrl.hostname;\n const allowedHostsSet: ReadonlySet<string> = new Set(allowedHosts);\n if (!isHostAllowed(hostname, allowedHostsSet)) {\n throw new Error(`Host ${url} is not allowed. You can configure \\`allowedHosts\\` option.`);\n }\n }\n }\n}\n\n/**\n * Checks if the hostname is allowed.\n * @param hostname - The hostname to check.\n * @param allowedHosts - A set of allowed hostnames.\n * @returns `true` if the hostname is allowed, `false` otherwise.\n * @note Used also in `@angular/ssr`.\n * @private\n */\nexport function isHostAllowed(hostname: string, allowedHosts: ReadonlySet<string>): boolean {\n if (allowedHosts.has('*') || allowedHosts.has(hostname)) {\n return true;\n }\n\n for (const allowedHost of allowedHosts) {\n if (!allowedHost.startsWith('*.')) {\n continue;\n }\n\n const domain = allowedHost.slice(1);\n if (hostname.endsWith(domain)) {\n return true;\n }\n }\n\n return false;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/**\n * @module\n * @description\n * Entry point for all public APIs of the platform-server package.\n */\n\nimport {Version} from '@angular/core';\n\n/**\n * @publicApi\n */\nexport const VERSION = /* @__PURE__ */ new Version('22.0.0-rc.2');\n"],"names":["provideServerRendering","options","ngServerMode","globalThis","providers","PLATFORM_SERVER_PROVIDERS","maxResponseBodySize","push","provide","HTTP_FETCH_MAX_RESPONSE_SIZE","useValue","makeEnvironmentProviders","EVENT_DISPATCH_SCRIPT_ID","createServerPlatform","extraProviders","platformProviders","measuringLabel","startMeasuring","document","url","platform","platformServer","INITIAL_CONFIG","stopMeasuring","findEventDispatchScript","doc","getElementById","removeEventDispatchScript","remove","prepareForHydration","platformState","applicationRef","environmentInjector","injector","getDocument","get","IS_HYDRATION_DOM_REUSE_ENABLED","appendSsrContentIntegrityMarker","eventTypesToReplay","annotateForHydration","regular","size","capture","insertEventRecordScript","APP_ID","CSP_NONCE","comment","createComment","SSR_CONTENT_INTEGRITY_MARKER","body","firstChild","insertBefore","append","appendServerContextInfo","serverContext","sanitizeServerContext","SERVER_CONTEXT","DEFAULT_SERVER_CONTEXT","components","forEach","componentRef","renderer","Renderer2","element","location","nativeElement","setAttribute","appId","nonce","eventDispatchScript","replayScriptContents","JSON","stringify","Array","from","replayScript","createScript","after","renderInternal","platformRef","PlatformState","errorHandler","INTERNAL_APPLICATION_ERROR_HANDLER","callbacks","BEFORE_APP_SERIALIZED","asyncCallbacks","callback","callbackResult","e","length","result","Promise","allSettled","status","reason","renderToString","asyncDestroyPlatform","resolve","setTimeout","destroy","InjectionToken","context","replace","renderModule","moduleType","allowedHosts","validateAllowedHosts","moduleRef","bootstrapModule","ApplicationRef","whenStable","renderApplication","bootstrap","renderAppLabel","bootstrapLabel","_renderLabel","rendered","parsedUrl","parseUrl","hostname","allowedHostsSet","Set","isHostAllowed","Error","has","allowedHost","startsWith","domain","slice","endsWith","VERSION","Version"],"mappings":"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"}
|