@analogjs/router 3.0.0-alpha.5 → 3.0.0-alpha.50
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/content/package.json +4 -0
- package/fesm2022/analogjs-router-content.mjs +63 -0
- package/fesm2022/analogjs-router-content.mjs.map +1 -0
- package/fesm2022/analogjs-router-i18n.mjs +156 -0
- package/fesm2022/analogjs-router-i18n.mjs.map +1 -0
- package/fesm2022/analogjs-router-server-actions.mjs +309 -1
- package/fesm2022/analogjs-router-server-actions.mjs.map +1 -0
- package/fesm2022/analogjs-router-server.mjs +60 -3
- package/fesm2022/analogjs-router-server.mjs.map +1 -0
- package/fesm2022/analogjs-router-tanstack-query-server.mjs +22 -0
- package/fesm2022/analogjs-router-tanstack-query-server.mjs.map +1 -0
- package/fesm2022/analogjs-router-tanstack-query.mjs +39 -0
- package/fesm2022/analogjs-router-tanstack-query.mjs.map +1 -0
- package/fesm2022/analogjs-router-tokens.mjs +7 -2
- package/fesm2022/analogjs-router-tokens.mjs.map +1 -0
- package/fesm2022/analogjs-router.mjs +559 -61
- package/fesm2022/analogjs-router.mjs.map +1 -0
- package/fesm2022/debug.page.mjs +53 -31
- package/fesm2022/debug.page.mjs.map +1 -0
- package/fesm2022/provide-analog-query.mjs +23 -0
- package/fesm2022/provide-analog-query.mjs.map +1 -0
- package/fesm2022/route-files.mjs +361 -0
- package/fesm2022/route-files.mjs.map +1 -0
- package/fesm2022/routes.mjs +5 -278
- package/fesm2022/routes.mjs.map +1 -0
- package/i18n/package.json +4 -0
- package/package.json +76 -25
- package/tanstack-query/package.json +4 -0
- package/tanstack-query/server/package.json +4 -0
- package/types/content/src/index.d.ts +4 -0
- package/types/content/src/lib/debug/routes.d.ts +10 -0
- package/types/{src → content/src}/lib/markdown-helpers.d.ts +1 -1
- package/types/content/src/lib/routes.d.ts +8 -0
- package/types/content/src/lib/with-content-routes.d.ts +2 -0
- package/types/i18n/src/index.d.ts +1 -0
- package/types/i18n/src/provide-i18n.d.ts +92 -0
- package/types/server/actions/src/define-action.d.ts +54 -0
- package/types/server/actions/src/define-api-route.d.ts +57 -0
- package/types/server/actions/src/define-page-load.d.ts +55 -0
- package/types/server/actions/src/define-server-route.d.ts +68 -0
- package/types/server/actions/src/index.d.ts +9 -1
- package/types/server/actions/src/parse-request-data.d.ts +9 -0
- package/types/server/actions/src/validate.d.ts +8 -0
- package/types/server/src/provide-server-context.d.ts +15 -1
- package/types/server/src/render.d.ts +1 -1
- package/types/server/src/server-component-render.d.ts +1 -1
- package/types/src/index.d.ts +16 -5
- package/types/src/lib/cache-key.d.ts +1 -1
- package/types/src/lib/cookie-interceptor.d.ts +1 -1
- package/types/src/lib/debug/debug.page.d.ts +4 -2
- package/types/src/lib/define-route.d.ts +6 -1
- package/types/src/lib/endpoints.d.ts +1 -1
- package/types/src/lib/experimental.d.ts +140 -0
- package/types/src/lib/form-action.directive.d.ts +12 -5
- package/types/src/lib/inject-load.d.ts +5 -2
- package/types/src/lib/inject-navigate.d.ts +23 -0
- package/types/src/lib/inject-route-context.d.ts +32 -0
- package/types/src/lib/inject-typed-params.d.ts +63 -0
- package/types/src/lib/json-ld.d.ts +32 -0
- package/types/src/lib/meta-tags.d.ts +3 -1
- package/types/src/lib/models.d.ts +3 -0
- package/types/src/lib/provide-file-router-base.d.ts +4 -0
- package/types/src/lib/provide-file-router.d.ts +2 -8
- package/types/src/lib/route-builder.d.ts +5 -0
- package/types/src/lib/route-files.d.ts +18 -0
- package/types/src/lib/route-path.d.ts +124 -0
- package/types/src/lib/route-types.d.ts +2 -1
- package/types/src/lib/routes.d.ts +2 -10
- package/types/src/lib/validation-errors.d.ts +7 -0
- package/types/tanstack-query/server/src/index.d.ts +1 -0
- package/types/tanstack-query/src/index.d.ts +2 -0
- package/types/tanstack-query/src/provide-analog-query.d.ts +4 -0
- package/types/tanstack-query/src/provide-server-analog-query.d.ts +2 -0
- package/types/tanstack-query/src/server-query.d.ts +16 -0
- package/types/tokens/src/index.d.ts +2 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { BASE_URL, INTERNAL_FETCH, LOCALE, REQUEST, RESPONSE } from "./analogjs-router-tokens.mjs";
|
|
1
2
|
import { APP_ID, InjectionToken, TransferState, assertInInjectionContext, enableProdMode, inject, makeStateKey, reflectComponentType, ɵConsole } from "@angular/core";
|
|
2
|
-
import { BASE_URL, INTERNAL_FETCH, REQUEST, RESPONSE } from "@analogjs/router/tokens";
|
|
3
3
|
import { bootstrapApplication } from "@angular/platform-browser";
|
|
4
4
|
import { provideServerRendering, renderApplication, ɵSERVER_CONTEXT } from "@angular/platform-server";
|
|
5
5
|
import { json } from "node:stream/consumers";
|
|
@@ -15,6 +15,7 @@ function getRequestHeader(req, name) {
|
|
|
15
15
|
}
|
|
16
16
|
function provideServerContext({ req, res, fetch }) {
|
|
17
17
|
const baseUrl = getBaseUrl(req);
|
|
18
|
+
const locale = detectLocale(req);
|
|
18
19
|
return [
|
|
19
20
|
{
|
|
20
21
|
provide: ɵSERVER_CONTEXT,
|
|
@@ -35,7 +36,11 @@ function provideServerContext({ req, res, fetch }) {
|
|
|
35
36
|
{
|
|
36
37
|
provide: INTERNAL_FETCH,
|
|
37
38
|
useValue: fetch
|
|
38
|
-
}
|
|
39
|
+
},
|
|
40
|
+
...locale ? [{
|
|
41
|
+
provide: LOCALE,
|
|
42
|
+
useValue: locale
|
|
43
|
+
}] : []
|
|
39
44
|
];
|
|
40
45
|
}
|
|
41
46
|
function getBaseUrl(req) {
|
|
@@ -49,6 +54,39 @@ function getRequestProtocol(req, opts = {}) {
|
|
|
49
54
|
if (opts.xForwardedProto !== false && forwardedProto === "https") return "https";
|
|
50
55
|
return req.connection?.encrypted ? "https" : "http";
|
|
51
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Detects the locale from the request URL path prefix or Accept-Language header.
|
|
59
|
+
* URL prefix takes priority (e.g. /fr/about -> 'fr').
|
|
60
|
+
*/
|
|
61
|
+
function detectLocale(req) {
|
|
62
|
+
const localeFromUrl = extractLocaleFromUrl(req.originalUrl || req.url || "");
|
|
63
|
+
if (localeFromUrl) return localeFromUrl;
|
|
64
|
+
return parseAcceptLanguage(getRequestHeader(req, "accept-language"));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extracts a locale from the first URL path segment if it matches
|
|
68
|
+
* a BCP 47-like pattern (e.g. 'en', 'en-US', 'zh-Hans-CN').
|
|
69
|
+
*/
|
|
70
|
+
function extractLocaleFromUrl(url) {
|
|
71
|
+
const segments = url.split("?")[0].split("/").filter(Boolean);
|
|
72
|
+
if (segments.length === 0) return;
|
|
73
|
+
const firstSegment = segments[0];
|
|
74
|
+
if (/^[a-z]{2}(-[a-zA-Z]{2,4})?(-[a-zA-Z]{2}|\d{3})?$/.test(firstSegment)) return firstSegment;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parses the Accept-Language header and returns the most preferred language.
|
|
78
|
+
*/
|
|
79
|
+
function parseAcceptLanguage(header) {
|
|
80
|
+
if (!header) return;
|
|
81
|
+
return header.split(",").map((part) => {
|
|
82
|
+
const [locale, qPart] = part.trim().split(";");
|
|
83
|
+
const q = qPart ? parseFloat(qPart.replace("q=", "")) : 1;
|
|
84
|
+
return {
|
|
85
|
+
locale: locale.trim(),
|
|
86
|
+
q
|
|
87
|
+
};
|
|
88
|
+
}).sort((a, b) => b.q - a.q)[0]?.locale || void 0;
|
|
89
|
+
}
|
|
52
90
|
//#endregion
|
|
53
91
|
//#region packages/router/server/src/tokens.ts
|
|
54
92
|
var STATIC_PROPS = new InjectionToken("Static Props");
|
|
@@ -82,7 +120,7 @@ var components = /* @__PURE__ */ Object.assign({});
|
|
|
82
120
|
async function renderServerComponent(url, serverContext, config) {
|
|
83
121
|
const { componentLoader, componentId } = getComponentLoader(serverComponentRequest(serverContext));
|
|
84
122
|
if (!componentLoader) return new Response(`Server Component Not Found ${componentId}`, { status: 404 });
|
|
85
|
-
const component = (await componentLoader())
|
|
123
|
+
const component = (await componentLoader()).default;
|
|
86
124
|
if (!component) return new Response(`No default export for ${componentId}`, { status: 422 });
|
|
87
125
|
const selector = reflectComponentType(component)?.selector.split(",")?.[0] || "server-component";
|
|
88
126
|
const body = await json(serverContext.req).catch(() => ({})) || {};
|
|
@@ -151,6 +189,24 @@ function retrieveTransferredState(html, appId) {
|
|
|
151
189
|
//#region packages/router/server/src/render.ts
|
|
152
190
|
enableProdMode();
|
|
153
191
|
/**
|
|
192
|
+
* Nulls `def.tView` on every component definition that Angular has
|
|
193
|
+
* compiled in this process. Angular caches the result of `consts()` on
|
|
194
|
+
* `def.tView` — that factory is where `$localize` tagged templates are
|
|
195
|
+
* evaluated — so without this reset the first rendered locale would be
|
|
196
|
+
* frozen into the cache for the process lifetime.
|
|
197
|
+
*
|
|
198
|
+
* The set on `globalThis.__ngComponentDefs` is populated by a Vite
|
|
199
|
+
* transform in `@analogjs/platform` that patches `@angular/core`'s
|
|
200
|
+
* `getComponentId()` to mirror every compiled component definition to
|
|
201
|
+
* a global Set, bypassing the `ngServerMode` guard that normally
|
|
202
|
+
* prevents registration on the server.
|
|
203
|
+
*/
|
|
204
|
+
function resetComponentDefTViews() {
|
|
205
|
+
const defs = globalThis.__ngComponentDefs;
|
|
206
|
+
if (!defs) return;
|
|
207
|
+
for (const def of defs) def.tView = null;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
154
210
|
* Returns a function that accepts the navigation URL,
|
|
155
211
|
* the root HTML, and server context.
|
|
156
212
|
*
|
|
@@ -165,6 +221,7 @@ function render(rootComponent, config, platformProviders = []) {
|
|
|
165
221
|
}
|
|
166
222
|
return async function render(url, document, serverContext) {
|
|
167
223
|
if (serverComponentRequest(serverContext)) return await renderServerComponent(url, serverContext);
|
|
224
|
+
resetComponentDefTViews();
|
|
168
225
|
return await renderApplication(bootstrap, {
|
|
169
226
|
document,
|
|
170
227
|
url,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analogjs-router-server.mjs","names":[],"sources":["../../server/src/provide-server-context.ts","../../server/src/tokens.ts","../../server/src/server-component-render.ts","../../server/src/render.ts"],"sourcesContent":["import { StaticProvider, ɵresetCompiledComponents } from '@angular/core';\nimport { ɵSERVER_CONTEXT as SERVER_CONTEXT } from '@angular/platform-server';\n\nimport {\n BASE_URL,\n INTERNAL_FETCH,\n LOCALE,\n REQUEST,\n RESPONSE,\n ServerInternalFetch,\n ServerRequest,\n ServerResponse,\n} from '../../tokens/src/index.js';\n\nfunction getHeaderValue(\n value: string | string[] | undefined,\n): string | undefined {\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction getRequestHeader(\n req: ServerRequest,\n name: string,\n): string | undefined {\n const headers = (req as { headers?: unknown }).headers;\n\n if (!headers) {\n return undefined;\n }\n\n if (\n typeof headers === 'object' &&\n headers !== null &&\n 'get' in headers &&\n typeof headers.get === 'function'\n ) {\n return headers.get(name) ?? undefined;\n }\n\n return getHeaderValue(\n (headers as Record<string, string | string[] | undefined>)[name],\n );\n}\n\nexport function provideServerContext({\n req,\n res,\n fetch,\n}: {\n req: ServerRequest;\n res: ServerResponse;\n fetch?: ServerInternalFetch;\n}): StaticProvider[] {\n const baseUrl = getBaseUrl(req);\n const locale = detectLocale(req);\n\n if (import.meta.env.DEV) {\n ɵresetCompiledComponents();\n }\n\n return [\n { provide: SERVER_CONTEXT, useValue: 'ssr-analog' },\n { provide: REQUEST, useValue: req },\n { provide: RESPONSE, useValue: res },\n { provide: BASE_URL, useValue: baseUrl },\n { provide: INTERNAL_FETCH, useValue: fetch },\n ...(locale ? [{ provide: LOCALE, useValue: locale }] : []),\n ];\n}\n\nexport function getBaseUrl(req: ServerRequest): string {\n const protocol = getRequestProtocol(req);\n const host =\n getRequestHeader(req, 'x-forwarded-host') ??\n getRequestHeader(req, 'host') ??\n 'localhost';\n const originalUrl = req.originalUrl || req.url || '/';\n const parsedUrl = new URL(\n '',\n `${protocol}://${host}${\n originalUrl.endsWith('/')\n ? originalUrl.substring(0, originalUrl.length - 1)\n : originalUrl\n }`,\n );\n const baseUrl = parsedUrl.origin;\n\n return baseUrl;\n}\n\nexport function getRequestProtocol(\n req: ServerRequest,\n opts: { xForwardedProto?: boolean } = {},\n): string {\n const forwardedProto = getRequestHeader(req, 'x-forwarded-proto')\n ?.split(',')[0]\n ?.trim();\n\n if (opts.xForwardedProto !== false && forwardedProto === 'https') {\n return 'https';\n }\n\n return (req.connection as { encrypted?: boolean })?.encrypted\n ? 'https'\n : 'http';\n}\n\n/**\n * Detects the locale from the request URL path prefix or Accept-Language header.\n * URL prefix takes priority (e.g. /fr/about -> 'fr').\n */\nexport function detectLocale(req: ServerRequest): string | undefined {\n const url = req.originalUrl || req.url || '';\n const localeFromUrl = extractLocaleFromUrl(url);\n if (localeFromUrl) {\n return localeFromUrl;\n }\n\n return parseAcceptLanguage(getRequestHeader(req, 'accept-language'));\n}\n\n/**\n * Extracts a locale from the first URL path segment if it matches\n * a BCP 47-like pattern (e.g. 'en', 'en-US', 'zh-Hans-CN').\n */\nexport function extractLocaleFromUrl(url: string): string | undefined {\n const pathname = url.split('?')[0];\n const segments = pathname.split('/').filter(Boolean);\n if (segments.length === 0) {\n return undefined;\n }\n\n const firstSegment = segments[0];\n // Match BCP 47 language tags: 2-letter language code with optional region/script\n if (/^[a-z]{2}(-[a-zA-Z]{2,4})?(-[a-zA-Z]{2}|\\d{3})?$/.test(firstSegment)) {\n return firstSegment;\n }\n\n return undefined;\n}\n\n/**\n * Parses the Accept-Language header and returns the most preferred language.\n */\nexport function parseAcceptLanguage(\n header: string | undefined,\n): string | undefined {\n if (!header) {\n return undefined;\n }\n\n const locales = header\n .split(',')\n .map((part) => {\n const [locale, qPart] = part.trim().split(';');\n const q = qPart ? parseFloat(qPart.replace('q=', '')) : 1;\n return { locale: locale.trim(), q };\n })\n .sort((a, b) => b.q - a.q);\n\n return locales[0]?.locale || undefined;\n}\n","import {\n assertInInjectionContext,\n inject,\n InjectionToken,\n makeStateKey,\n Provider,\n TransferState,\n} from '@angular/core';\n\nexport const STATIC_PROPS: InjectionToken<Record<string, any>> =\n new InjectionToken<Record<string, any>>('Static Props');\n\nexport function provideStaticProps<T = Record<string, any>>(\n props: T,\n): Provider {\n return {\n provide: STATIC_PROPS,\n useFactory() {\n return props;\n },\n };\n}\n\nexport function injectStaticProps(): Record<string, any> {\n assertInInjectionContext(injectStaticProps);\n\n return inject(STATIC_PROPS);\n}\n\nexport function injectStaticOutputs<T>(): { set(data: T): void } {\n const transferState = inject(TransferState);\n const outputsKey = makeStateKey<T>('_analog_output');\n\n return {\n set(data: T): void {\n transferState.set(outputsKey, data);\n },\n };\n}\n","import { ApplicationConfig, Type } from '@angular/core';\nimport {\n bootstrapApplication,\n BootstrapContext,\n} from '@angular/platform-browser';\nimport {\n reflectComponentType,\n ɵConsole as Console,\n APP_ID,\n} from '@angular/core';\nimport {\n provideServerRendering,\n renderApplication,\n ɵSERVER_CONTEXT as SERVER_CONTEXT,\n} from '@angular/platform-server';\nimport type { ServerContext } from '../../tokens/src/index.js';\nimport { json as readJsonStream } from 'node:stream/consumers';\n\nimport { provideStaticProps } from './tokens';\n\ntype ComponentLoader = () => Promise<Type<unknown>>;\n\nexport function serverComponentRequest(\n serverContext: ServerContext,\n): string | undefined {\n // `ServerContext` is still backed by raw Node req/res, so read the header\n // directly instead of reconstructing an H3Event just for lookup.\n // In h3 v2 / Nitro v3, req may be undefined during fetch-based prerendering\n // (where event.node is not populated), so guard with optional chaining.\n const serverComponentId = serverContext.req?.headers?.[\n 'x-analog-component'\n ] as string | undefined;\n\n if (\n !serverComponentId &&\n serverContext.req?.url &&\n serverContext.req.url.startsWith('/_analog/components')\n ) {\n const componentId = serverContext.req.url.split('/')?.[3];\n\n return componentId;\n }\n\n return serverComponentId;\n}\n\nconst components = import.meta.glob([\n '/src/server/components/**/*.{ts,analog,ag}',\n]);\n\nexport async function renderServerComponent(\n url: string,\n serverContext: ServerContext,\n config?: ApplicationConfig,\n): Promise<Response> {\n const componentReqId = serverComponentRequest(serverContext) as string;\n const { componentLoader, componentId } = getComponentLoader(componentReqId);\n\n if (!componentLoader) {\n return new Response(`Server Component Not Found ${componentId}`, {\n status: 404,\n });\n }\n\n const component = ((await componentLoader()) as { default?: Type<unknown> })\n .default;\n\n if (!component) {\n return new Response(`No default export for ${componentId}`, {\n status: 422,\n });\n }\n\n const mirror = reflectComponentType(component);\n const selector = mirror?.selector.split(',')?.[0] || 'server-component';\n // Server component requests POST JSON props from the client bridge, so parse\n // the Node request body directly instead of rebuilding an H3Event wrapper.\n const body =\n (await readJsonStream(serverContext.req).catch(() => ({}))) || {};\n const appId = `analog-server-${selector.toLowerCase()}-${new Date().getTime()}`;\n\n const bootstrap = (context: BootstrapContext) =>\n bootstrapApplication(\n component,\n {\n providers: [\n provideServerRendering(),\n provideStaticProps(body),\n { provide: SERVER_CONTEXT, useValue: 'analog-server-component' },\n {\n provide: APP_ID,\n useFactory() {\n return appId;\n },\n },\n ...(config?.providers || []),\n ],\n },\n context,\n );\n\n const html = await renderApplication(bootstrap as any, {\n url,\n document: `<${selector}></${selector}>`,\n platformProviders: [\n {\n provide: Console,\n useFactory() {\n return {\n warn: () => {\n /* noop */\n },\n log: () => {\n /* noop */\n },\n };\n },\n },\n ],\n });\n\n const outputs = retrieveTransferredState(html, appId);\n const responseData: { html: string; outputs: Record<string, unknown> } = {\n html,\n outputs,\n };\n\n return new Response(JSON.stringify(responseData), {\n headers: {\n 'X-Analog-Component': 'true',\n },\n });\n}\n\nfunction getComponentLoader(componentReqId: string): {\n componentLoader: ComponentLoader | undefined;\n componentId: string;\n} {\n const _componentId = `/src/server/components/${componentReqId.toLowerCase()}`;\n let componentLoader: ComponentLoader | undefined = undefined;\n let componentId = _componentId;\n\n if (components[`${_componentId}.ts`]) {\n componentId = `${_componentId}.ts`;\n componentLoader = components[componentId] as ComponentLoader;\n }\n\n return { componentLoader, componentId };\n}\n\nfunction retrieveTransferredState(\n html: string,\n appId: string,\n): Record<string, unknown | undefined> {\n const regex = new RegExp(\n `<script id=\"${appId}-state\" type=\"application/json\">(.*?)</script>`,\n );\n const match = html.match(regex);\n\n if (match) {\n const scriptContent = match[1];\n\n if (scriptContent) {\n try {\n const parsedContent: {\n _analog_output: Record<string, unknown | undefined>;\n } = JSON.parse(scriptContent);\n return parsedContent._analog_output || {};\n } catch (e) {\n console.warn('Exception while parsing static outputs for ' + appId, e);\n }\n }\n\n return {};\n } else {\n return {};\n }\n}\n","import {\n ApplicationConfig,\n Provider,\n Type,\n enableProdMode,\n} from '@angular/core';\nimport {\n bootstrapApplication,\n type BootstrapContext,\n} from '@angular/platform-browser';\nimport { renderApplication } from '@angular/platform-server';\nimport type { ServerContext } from '../../tokens/src/index.js';\n\nimport { provideServerContext } from './provide-server-context';\nimport {\n serverComponentRequest,\n renderServerComponent,\n} from './server-component-render';\n\nif (import.meta.env.PROD) {\n enableProdMode();\n}\n\n/**\n * Nulls `def.tView` on every component definition that Angular has\n * compiled in this process. Angular caches the result of `consts()` on\n * `def.tView` — that factory is where `$localize` tagged templates are\n * evaluated — so without this reset the first rendered locale would be\n * frozen into the cache for the process lifetime.\n *\n * The set on `globalThis.__ngComponentDefs` is populated by a Vite\n * transform in `@analogjs/platform` that patches `@angular/core`'s\n * `getComponentId()` to mirror every compiled component definition to\n * a global Set, bypassing the `ngServerMode` guard that normally\n * prevents registration on the server.\n */\nfunction resetComponentDefTViews(): void {\n const defs = (globalThis as any).__ngComponentDefs as Set<any> | undefined;\n if (!defs) return;\n for (const def of defs) {\n def.tView = null;\n }\n}\n\n/**\n * Returns a function that accepts the navigation URL,\n * the root HTML, and server context.\n *\n * @param rootComponent\n * @param config\n * @param platformProviders\n * @returns Promise<string | Reponse>\n */\nexport function render(\n rootComponent: Type<unknown>,\n config: ApplicationConfig,\n platformProviders: Provider[] = [],\n) {\n function bootstrap(context?: BootstrapContext) {\n return bootstrapApplication(rootComponent, config, context);\n }\n\n return async function render(\n url: string,\n document: string,\n serverContext: ServerContext,\n ): Promise<string | Response> {\n if (serverComponentRequest(serverContext)) {\n return await renderServerComponent(url, serverContext);\n }\n\n resetComponentDefTViews();\n\n const html = await renderApplication(bootstrap, {\n document,\n url,\n platformProviders: [\n provideServerContext(serverContext),\n platformProviders,\n ],\n });\n\n return html;\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { t as ANALOG_QUERY_STATE_KEY } from "./provide-analog-query.mjs";
|
|
2
|
+
import { TransferState, makeEnvironmentProviders } from "@angular/core";
|
|
3
|
+
import { QueryClient, dehydrate } from "@tanstack/angular-query-experimental";
|
|
4
|
+
import { BEFORE_APP_SERIALIZED } from "@angular/platform-server";
|
|
5
|
+
//#region packages/router/tanstack-query/src/provide-server-analog-query.ts
|
|
6
|
+
var SERVER_ANALOG_QUERY_PROVIDER = {
|
|
7
|
+
provide: BEFORE_APP_SERIALIZED,
|
|
8
|
+
multi: true,
|
|
9
|
+
useFactory: (queryClient, transferState) => {
|
|
10
|
+
return () => {
|
|
11
|
+
transferState.set(ANALOG_QUERY_STATE_KEY, dehydrate(queryClient));
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
deps: [QueryClient, TransferState]
|
|
15
|
+
};
|
|
16
|
+
function provideServerAnalogQuery() {
|
|
17
|
+
return makeEnvironmentProviders([SERVER_ANALOG_QUERY_PROVIDER]);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { provideServerAnalogQuery };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=analogjs-router-tanstack-query-server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analogjs-router-tanstack-query-server.mjs","names":[],"sources":["../../tanstack-query/src/provide-server-analog-query.ts"],"sourcesContent":["import { TransferState, makeEnvironmentProviders } from '@angular/core';\nimport type { EnvironmentProviders, Provider } from '@angular/core';\nimport { BEFORE_APP_SERIALIZED } from '@angular/platform-server';\nimport { QueryClient, dehydrate } from '@tanstack/angular-query-experimental';\n\nimport { ANALOG_QUERY_STATE_KEY } from './provide-analog-query';\n\nconst SERVER_ANALOG_QUERY_PROVIDER: Provider = {\n provide: BEFORE_APP_SERIALIZED,\n multi: true,\n useFactory: (queryClient: QueryClient, transferState: TransferState) => {\n return () => {\n transferState.set(ANALOG_QUERY_STATE_KEY, dehydrate(queryClient));\n };\n },\n deps: [QueryClient, TransferState],\n};\n\nexport function provideServerAnalogQuery(): EnvironmentProviders {\n return makeEnvironmentProviders([SERVER_ANALOG_QUERY_PROVIDER]);\n}\n"],"mappings":";;;;;AAOA,IAAM,+BAAyC;CAC7C,SAAS;CACT,OAAO;CACP,aAAa,aAA0B,kBAAiC;AACtE,eAAa;AACX,iBAAkB,IAAA,wBAAwB,UAAU,YAAa,CAAA;;;CAGrE,MAAO,CAAA,aAAa,cAAA;CACrB;AAED,SAAgB,2BAAiD;AAC/D,QAAO,yBAA0B,CAAA,6BAA8B,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { n as provideAnalogQuery, t as ANALOG_QUERY_STATE_KEY } from "./provide-analog-query.mjs";
|
|
2
|
+
import { lastValueFrom } from "rxjs";
|
|
3
|
+
//#region packages/router/tanstack-query/src/server-query.ts
|
|
4
|
+
function buildUrl(base, params) {
|
|
5
|
+
if (!params) return base;
|
|
6
|
+
const parts = [];
|
|
7
|
+
for (const [key, value] of Object.entries(params)) {
|
|
8
|
+
if (value === void 0 || value === null) continue;
|
|
9
|
+
const k = encodeURIComponent(key);
|
|
10
|
+
if (Array.isArray(value)) for (const item of value) parts.push(`${k}=${encodeURIComponent(String(item))}`);
|
|
11
|
+
else parts.push(`${k}=${encodeURIComponent(String(value))}`);
|
|
12
|
+
}
|
|
13
|
+
if (parts.length === 0) return base;
|
|
14
|
+
return `${base}${base.includes("?") ? "&" : "?"}${parts.join("&")}`;
|
|
15
|
+
}
|
|
16
|
+
function serverQueryOptions(http, url, options) {
|
|
17
|
+
const { query, ...rest } = options;
|
|
18
|
+
return {
|
|
19
|
+
...rest,
|
|
20
|
+
queryFn: () => lastValueFrom(http.get(buildUrl(url, query)))
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function serverMutationOptions(http, url, options) {
|
|
24
|
+
return {
|
|
25
|
+
mutationFn: (body) => lastValueFrom(http.post(url, body)),
|
|
26
|
+
...options
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function serverInfiniteQueryOptions(http, url, options) {
|
|
30
|
+
const { query: buildQuery, ...rest } = options;
|
|
31
|
+
return {
|
|
32
|
+
...rest,
|
|
33
|
+
queryFn: (context) => lastValueFrom(http.get(buildUrl(url, buildQuery(context))))
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ANALOG_QUERY_STATE_KEY, provideAnalogQuery, serverInfiniteQueryOptions, serverMutationOptions, serverQueryOptions };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=analogjs-router-tanstack-query.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analogjs-router-tanstack-query.mjs","names":[],"sources":["../../tanstack-query/src/server-query.ts"],"sourcesContent":["import type { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport type {\n CreateQueryOptions,\n CreateMutationOptions,\n CreateInfiniteQueryOptions,\n DefaultError,\n InfiniteData,\n QueryKey,\n} from '@tanstack/angular-query-experimental';\nimport type {\n ServerRouteHandler,\n InferRouteQuery,\n InferRouteBody,\n InferRouteResult,\n} from '../../server/actions/src/index.js';\n\nfunction buildUrl(base: string, params?: Record<string, unknown>): string {\n if (!params) return base;\n const parts: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n const k = encodeURIComponent(key);\n if (Array.isArray(value)) {\n for (const item of value) {\n parts.push(`${k}=${encodeURIComponent(String(item))}`);\n }\n } else {\n parts.push(`${k}=${encodeURIComponent(String(value))}`);\n }\n }\n if (parts.length === 0) return base;\n const separator = base.includes('?') ? '&' : '?';\n return `${base}${separator}${parts.join('&')}`;\n}\n\nexport function serverQueryOptions<\n TRoute extends ServerRouteHandler<any, any, any>,\n TError = DefaultError,\n TData = InferRouteResult<TRoute>,\n TQueryKey extends QueryKey = QueryKey,\n>(\n http: HttpClient,\n url: string,\n options: { queryKey: TQueryKey; query?: InferRouteQuery<TRoute> } & Omit<\n CreateQueryOptions<InferRouteResult<TRoute>, TError, TData, TQueryKey>,\n 'queryKey' | 'queryFn'\n >,\n): CreateQueryOptions<InferRouteResult<TRoute>, TError, TData, TQueryKey> {\n const { query, ...rest } = options;\n return {\n ...rest,\n queryFn: () =>\n lastValueFrom(\n http.get<InferRouteResult<TRoute>>(\n buildUrl(url, query as Record<string, any>),\n ),\n ),\n } as CreateQueryOptions<InferRouteResult<TRoute>, TError, TData, TQueryKey>;\n}\n\nexport function serverMutationOptions<\n TRoute extends ServerRouteHandler<any, any, any>,\n TError = DefaultError,\n TOnMutateResult = unknown,\n>(\n http: HttpClient,\n url: string,\n options?: Omit<\n CreateMutationOptions<\n InferRouteResult<TRoute>,\n TError,\n InferRouteBody<TRoute>,\n TOnMutateResult\n >,\n 'mutationFn'\n >,\n): CreateMutationOptions<\n InferRouteResult<TRoute>,\n TError,\n InferRouteBody<TRoute>,\n TOnMutateResult\n> {\n return {\n mutationFn: (body: InferRouteBody<TRoute>) =>\n lastValueFrom(http.post<InferRouteResult<TRoute>>(url, body)),\n ...options,\n } as CreateMutationOptions<\n InferRouteResult<TRoute>,\n TError,\n InferRouteBody<TRoute>,\n TOnMutateResult\n >;\n}\n\nexport function serverInfiniteQueryOptions<\n TRoute extends ServerRouteHandler<any, any, any>,\n TError = DefaultError,\n TData = InfiniteData<InferRouteResult<TRoute>>,\n TQueryKey extends QueryKey = QueryKey,\n TPageParam = unknown,\n>(\n http: HttpClient,\n url: string,\n options: {\n queryKey: TQueryKey;\n query: (context: { pageParam: TPageParam }) => InferRouteQuery<TRoute>;\n initialPageParam: TPageParam;\n getNextPageParam: (\n lastPage: InferRouteResult<TRoute>,\n allPages: InferRouteResult<TRoute>[],\n ) => TPageParam | undefined | null;\n } & Omit<\n CreateInfiniteQueryOptions<\n InferRouteResult<TRoute>,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >,\n 'queryKey' | 'queryFn' | 'initialPageParam' | 'getNextPageParam'\n >,\n): CreateInfiniteQueryOptions<\n InferRouteResult<TRoute>,\n TError,\n TData,\n TQueryKey,\n TPageParam\n> {\n const { query: buildQuery, ...rest } = options;\n return {\n ...rest,\n queryFn: (context: { pageParam: TPageParam }) =>\n lastValueFrom(\n http.get<InferRouteResult<TRoute>>(\n buildUrl(url, buildQuery(context) as Record<string, any>),\n ),\n ),\n } as CreateInfiniteQueryOptions<\n InferRouteResult<TRoute>,\n TError,\n TData,\n TQueryKey,\n TPageParam\n >;\n}\n"],"mappings":";;;AAiBA,SAAS,SAAS,MAAc,QAA0C;AACxE,KAAK,CAAA,OACC,QAAkB;CACxB,MAAK,QAAY,EAAA;AACf,MAAI,MAAA,CAAU,KAAA,UAAa,OAAA,QAAgB,OAAA,EAAA;AACrC,MAAI,UAAA,KAAA,KAAuB,UAAA,KACvB;EACH,MAAM,IAAA,mBAAe,IAAA;AACxB,MAAM,MAAQ,QAAK,MAAA,CAAA,MAAA,MAAA,QAAA,MAEhB,OAAA,KAAA,GAAA,EAAA,GAAA,mBAAA,OAAA,KAAA,CAAA,GAAA;MAIC,OAAA,KAAW,GAAG,EAAA,GAAA,mBAAO,OAAA,MAAA,CAAA,GAAA;;wBAK1B,QAAA;AAcL,QAAO,GAAA,OADW,KAAA,SAAS,IAAA,GAAA,MAAA,MACpB,MAAA,KAAA,IAAA;;SAEL,mBAEI,MACE,KAAA,SAAc;CAGrB,MAAA,EAAA,OAAA,GAAA,SAAA;;EAGI,GAAA;EAsBE,eAAA,cAAA,KAAA,IAAA,SAAA,KAAA,MAAA,CAAA,CAAA;EACL;;SAGD,sBAAA,MAAA,KAAA,SAAA;;EAQI,aAAS,SAAA,cAOd,KACA,KACA,KAAA,KAwBA,CAAA;EACM,GAAE;EACR;;SAEY,2BAED,MACH,KAAA,SAAc;CAGrB,MAAA,EAAA,OAAA,YAAA,GAAA,SAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InjectionToken, inject } from "@angular/core";
|
|
1
|
+
import { InjectionToken, assertInInjectionContext, inject } from "@angular/core";
|
|
2
2
|
//#region packages/router/tokens/src/index.ts
|
|
3
3
|
var REQUEST = new InjectionToken("@analogjs/router Server Request");
|
|
4
4
|
var RESPONSE = new InjectionToken("@analogjs/router Server Response");
|
|
@@ -20,7 +20,12 @@ function injectInternalServerFetch() {
|
|
|
20
20
|
function injectAPIPrefix() {
|
|
21
21
|
return inject(API_PREFIX);
|
|
22
22
|
}
|
|
23
|
+
var LOCALE = new InjectionToken("@analogjs/router Locale");
|
|
24
|
+
function injectLocale() {
|
|
25
|
+
assertInInjectionContext(injectLocale);
|
|
26
|
+
return inject(LOCALE, { optional: true });
|
|
27
|
+
}
|
|
23
28
|
//#endregion
|
|
24
|
-
export { API_PREFIX, BASE_URL, INTERNAL_FETCH, REQUEST, RESPONSE, injectAPIPrefix, injectBaseURL, injectInternalServerFetch, injectRequest, injectResponse };
|
|
29
|
+
export { API_PREFIX, BASE_URL, INTERNAL_FETCH, LOCALE, REQUEST, RESPONSE, injectAPIPrefix, injectBaseURL, injectInternalServerFetch, injectLocale, injectRequest, injectResponse };
|
|
25
30
|
|
|
26
31
|
//# sourceMappingURL=analogjs-router-tokens.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analogjs-router-tokens.mjs","names":[],"sources":["../../tokens/src/index.ts"],"sourcesContent":["import {\n InjectionToken,\n assertInInjectionContext,\n inject,\n} from '@angular/core';\nimport type { $Fetch } from 'nitro/types';\nimport type {\n IncomingMessage,\n ServerResponse as NodeServerResponse,\n} from 'node:http';\n\nexport type ServerRequest = IncomingMessage & { originalUrl: string };\nexport type ServerResponse = NodeServerResponse;\nexport type ServerInternalFetch = $Fetch;\nexport type ServerContext = {\n req: ServerRequest;\n res: ServerResponse;\n fetch?: ServerInternalFetch;\n};\n\nexport const REQUEST: InjectionToken<ServerRequest> =\n new InjectionToken<ServerRequest>('@analogjs/router Server Request');\nexport const RESPONSE: InjectionToken<ServerResponse> =\n new InjectionToken<ServerResponse>('@analogjs/router Server Response');\nexport const BASE_URL: InjectionToken<string> = new InjectionToken<string>(\n '@analogjs/router Base URL',\n);\nexport const INTERNAL_FETCH: InjectionToken<ServerInternalFetch> =\n new InjectionToken<ServerInternalFetch>(\n '@analogjs/router Internal Server Fetch',\n );\n\nexport const API_PREFIX: InjectionToken<string> = new InjectionToken<string>(\n '@analogjs/router API Prefix',\n);\n\nexport function injectRequest(): ServerRequest | null {\n return inject(REQUEST, { optional: true });\n}\n\nexport function injectResponse(): ServerResponse | null {\n return inject(RESPONSE, { optional: true });\n}\n\nexport function injectBaseURL(): string | null {\n return inject(BASE_URL, { optional: true });\n}\n\nexport function injectInternalServerFetch(): ServerInternalFetch | null {\n return inject(INTERNAL_FETCH, { optional: true });\n}\n\nexport function injectAPIPrefix(): string {\n return inject(API_PREFIX);\n}\n\nexport const LOCALE: InjectionToken<string> = new InjectionToken<string>(\n '@analogjs/router Locale',\n);\n\nexport function injectLocale(): string | null {\n assertInInjectionContext(injectLocale);\n return inject(LOCALE, { optional: true });\n}\n"],"mappings":";;AAoBA,IAAa,UACX,IAAI,eAA8B,kCAAkC;AACtE,IAAa,WACX,IAAI,eAA+B,mCAAmC;AACxE,IAAa,WAAmC,IAAI,eAClD,4BACD;AACD,IAAa,iBACX,IAAI,eACF,yCACD;AAEH,IAAa,aAAqC,IAAI,eACpD,8BACD;AAED,SAAgB,gBAAsC;AACpD,QAAO,OAAO,SAAW,EAAA,UAAU,MAAO,CAAA;;AAG5C,SAAgB,iBAAwC;AACtD,QAAO,OAAO,UAAY,EAAA,UAAU,MAAO,CAAA;;AAG7C,SAAgB,gBAA+B;AAC7C,QAAO,OAAO,UAAY,EAAA,UAAU,MAAO,CAAA;;AAG7C,SAAgB,4BAAwD;AACtE,QAAO,OAAO,gBAAkB,EAAA,UAAU,MAAO,CAAA;;AAGnD,SAAgB,kBAA0B;AACxC,QAAO,OAAO,WAAW;;AAG3B,IAAa,SAAiC,IAAI,eAChD,0BACD;AAED,SAAgB,eAA8B;AAC5C,0BAAyB,aAAa;AACtC,QAAO,OAAO,QAAU,EAAA,UAAU,MAAO,CAAA"}
|