@analogjs/router 3.0.0-alpha.2 → 3.0.0-alpha.21
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-server-actions.mjs +327 -31
- package/fesm2022/analogjs-router-server-actions.mjs.map +1 -1
- package/fesm2022/analogjs-router-server.mjs +151 -199
- package/fesm2022/analogjs-router-server.mjs.map +1 -1
- 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 +15 -18
- package/fesm2022/analogjs-router-tokens.mjs.map +1 -1
- package/fesm2022/analogjs-router.mjs +960 -815
- package/fesm2022/analogjs-router.mjs.map +1 -1
- package/fesm2022/debug.page.mjs +135 -0
- 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 +345 -0
- package/fesm2022/route-files.mjs.map +1 -0
- package/fesm2022/routes.mjs +28 -0
- package/fesm2022/routes.mjs.map +1 -0
- package/package.json +67 -27
- package/server/actions/package.json +4 -0
- package/server/package.json +4 -0
- package/tanstack-query/package.json +4 -0
- package/tanstack-query/server/package.json +4 -0
- package/tokens/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/content/src/lib/markdown-helpers.d.ts +2 -0
- package/types/content/src/lib/routes.d.ts +8 -0
- package/types/content/src/lib/with-content-routes.d.ts +2 -0
- package/types/server/actions/src/actions.d.ts +13 -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 -0
- 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/index.d.ts +4 -0
- package/types/server/src/provide-server-context.d.ts +11 -0
- package/types/server/src/render.d.ts +12 -0
- package/types/server/src/server-component-render.d.ts +4 -0
- package/types/server/src/tokens.d.ts +7 -0
- package/types/src/index.d.ts +27 -0
- package/types/src/lib/cache-key.d.ts +3 -0
- package/types/src/lib/constants.d.ts +2 -0
- package/types/src/lib/cookie-interceptor.d.ts +4 -0
- package/types/src/lib/debug/debug.page.d.ts +20 -0
- package/types/src/lib/debug/index.d.ts +10 -0
- package/types/src/lib/debug/routes.d.ts +10 -0
- package/types/src/lib/define-route.d.ts +51 -0
- package/types/src/lib/endpoints.d.ts +5 -0
- package/types/src/lib/experimental.d.ts +140 -0
- package/types/src/lib/form-action.directive.d.ts +25 -0
- package/types/src/lib/get-load-resolver.d.ts +8 -0
- package/types/src/lib/inject-load.d.ts +9 -0
- 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-route-endpoint-url.d.ts +2 -0
- package/types/src/lib/inject-typed-params.d.ts +63 -0
- package/types/src/lib/json-ld.d.ts +31 -0
- package/types/src/lib/meta-tags.d.ts +33 -0
- package/types/src/lib/models.d.ts +32 -0
- package/types/src/lib/provide-file-router-base.d.ts +4 -0
- package/types/src/lib/provide-file-router.d.ts +12 -0
- package/types/src/lib/request-context.d.ts +13 -0
- package/types/src/lib/route-builder.d.ts +5 -0
- package/types/src/lib/route-config.d.ts +2 -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 +12 -0
- package/types/src/lib/routes.d.ts +11 -0
- package/types/src/lib/server.component.d.ts +33 -0
- 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 +23 -0
- package/fesm2022/analogjs-router-debug.page-jzggTA45.mjs +0 -91
- package/fesm2022/analogjs-router-debug.page-jzggTA45.mjs.map +0 -1
- package/types/analogjs-router-server-actions.d.ts +0 -17
- package/types/analogjs-router-server.d.ts +0 -29
- package/types/analogjs-router-tokens.d.ts +0 -27
- package/types/analogjs-router.d.ts +0 -269
|
@@ -1,226 +1,178 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { json } from
|
|
6
|
-
|
|
1
|
+
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
|
+
import { bootstrapApplication } from "@angular/platform-browser";
|
|
4
|
+
import { provideServerRendering, renderApplication, ɵSERVER_CONTEXT } from "@angular/platform-server";
|
|
5
|
+
import { json } from "node:stream/consumers";
|
|
6
|
+
//#region packages/router/server/src/provide-server-context.ts
|
|
7
7
|
function getHeaderValue(value) {
|
|
8
|
-
|
|
8
|
+
return Array.isArray(value) ? value[0] : value;
|
|
9
9
|
}
|
|
10
10
|
function getRequestHeader(req, name) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (typeof headers === 'object' &&
|
|
16
|
-
headers !== null &&
|
|
17
|
-
'get' in headers &&
|
|
18
|
-
typeof headers.get === 'function') {
|
|
19
|
-
return headers.get(name) ?? undefined;
|
|
20
|
-
}
|
|
21
|
-
return getHeaderValue(headers[name]);
|
|
11
|
+
const headers = req.headers;
|
|
12
|
+
if (!headers) return;
|
|
13
|
+
if (typeof headers === "object" && headers !== null && "get" in headers && typeof headers.get === "function") return headers.get(name) ?? void 0;
|
|
14
|
+
return getHeaderValue(headers[name]);
|
|
22
15
|
}
|
|
23
|
-
function provideServerContext({ req, res, fetch
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
16
|
+
function provideServerContext({ req, res, fetch }) {
|
|
17
|
+
const baseUrl = getBaseUrl(req);
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
provide: ɵSERVER_CONTEXT,
|
|
21
|
+
useValue: "ssr-analog"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
provide: REQUEST,
|
|
25
|
+
useValue: req
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
provide: RESPONSE,
|
|
29
|
+
useValue: res
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
provide: BASE_URL,
|
|
33
|
+
useValue: baseUrl
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
provide: INTERNAL_FETCH,
|
|
37
|
+
useValue: fetch
|
|
38
|
+
}
|
|
39
|
+
];
|
|
35
40
|
}
|
|
36
41
|
function getBaseUrl(req) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const originalUrl = req.originalUrl || req.url || '/';
|
|
42
|
-
const parsedUrl = new URL('', `${protocol}://${host}${originalUrl.endsWith('/')
|
|
43
|
-
? originalUrl.substring(0, originalUrl.length - 1)
|
|
44
|
-
: originalUrl}`);
|
|
45
|
-
const baseUrl = parsedUrl.origin;
|
|
46
|
-
return baseUrl;
|
|
42
|
+
const protocol = getRequestProtocol(req);
|
|
43
|
+
const host = getRequestHeader(req, "x-forwarded-host") ?? getRequestHeader(req, "host") ?? "localhost";
|
|
44
|
+
const originalUrl = req.originalUrl || req.url || "/";
|
|
45
|
+
return new URL("", `${protocol}://${host}${originalUrl.endsWith("/") ? originalUrl.substring(0, originalUrl.length - 1) : originalUrl}`).origin;
|
|
47
46
|
}
|
|
48
47
|
function getRequestProtocol(req, opts = {}) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (opts.xForwardedProto !== false && forwardedProto === 'https') {
|
|
53
|
-
return 'https';
|
|
54
|
-
}
|
|
55
|
-
return req.connection?.encrypted ? 'https' : 'http';
|
|
48
|
+
const forwardedProto = getRequestHeader(req, "x-forwarded-proto")?.split(",")[0]?.trim();
|
|
49
|
+
if (opts.xForwardedProto !== false && forwardedProto === "https") return "https";
|
|
50
|
+
return req.connection?.encrypted ? "https" : "http";
|
|
56
51
|
}
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region packages/router/server/src/tokens.ts
|
|
54
|
+
var STATIC_PROPS = new InjectionToken("Static Props");
|
|
59
55
|
function provideStaticProps(props) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
return {
|
|
57
|
+
provide: STATIC_PROPS,
|
|
58
|
+
useFactory() {
|
|
59
|
+
return props;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
66
62
|
}
|
|
67
63
|
function injectStaticProps() {
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
assertInInjectionContext(injectStaticProps);
|
|
65
|
+
return inject(STATIC_PROPS);
|
|
70
66
|
}
|
|
71
67
|
function injectStaticOutputs() {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
},
|
|
78
|
-
};
|
|
68
|
+
const transferState = inject(TransferState);
|
|
69
|
+
const outputsKey = makeStateKey("_analog_output");
|
|
70
|
+
return { set(data) {
|
|
71
|
+
transferState.set(outputsKey, data);
|
|
72
|
+
} };
|
|
79
73
|
}
|
|
80
|
-
|
|
74
|
+
//#endregion
|
|
75
|
+
//#region packages/router/server/src/server-component-render.ts
|
|
81
76
|
function serverComponentRequest(serverContext) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
// (where event.node is not populated), so guard with optional chaining.
|
|
86
|
-
const serverComponentId = serverContext.req?.headers?.['x-analog-component'];
|
|
87
|
-
if (!serverComponentId &&
|
|
88
|
-
serverContext.req?.url &&
|
|
89
|
-
serverContext.req.url.startsWith('/_analog/components')) {
|
|
90
|
-
const componentId = serverContext.req.url.split('/')?.[3];
|
|
91
|
-
return componentId;
|
|
92
|
-
}
|
|
93
|
-
return serverComponentId;
|
|
77
|
+
const serverComponentId = serverContext.req?.headers?.["x-analog-component"];
|
|
78
|
+
if (!serverComponentId && serverContext.req?.url && serverContext.req.url.startsWith("/_analog/components")) return serverContext.req.url.split("/")?.[3];
|
|
79
|
+
return serverComponentId;
|
|
94
80
|
}
|
|
95
|
-
|
|
96
|
-
'/src/server/components/**/*.{ts,analog,ag}',
|
|
97
|
-
]);
|
|
81
|
+
var components = /* @__PURE__ */ Object.assign({});
|
|
98
82
|
async function renderServerComponent(url, serverContext, config) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
warn: () => { },
|
|
141
|
-
log: () => { },
|
|
142
|
-
};
|
|
143
|
-
},
|
|
144
|
-
},
|
|
145
|
-
],
|
|
146
|
-
});
|
|
147
|
-
const outputs = retrieveTransferredState(html, appId);
|
|
148
|
-
const responseData = {
|
|
149
|
-
html,
|
|
150
|
-
outputs,
|
|
151
|
-
};
|
|
152
|
-
return new Response(JSON.stringify(responseData), {
|
|
153
|
-
headers: {
|
|
154
|
-
'X-Analog-Component': 'true',
|
|
155
|
-
},
|
|
156
|
-
});
|
|
83
|
+
const { componentLoader, componentId } = getComponentLoader(serverComponentRequest(serverContext));
|
|
84
|
+
if (!componentLoader) return new Response(`Server Component Not Found ${componentId}`, { status: 404 });
|
|
85
|
+
const component = (await componentLoader()).default;
|
|
86
|
+
if (!component) return new Response(`No default export for ${componentId}`, { status: 422 });
|
|
87
|
+
const selector = reflectComponentType(component)?.selector.split(",")?.[0] || "server-component";
|
|
88
|
+
const body = await json(serverContext.req).catch(() => ({})) || {};
|
|
89
|
+
const appId = `analog-server-${selector.toLowerCase()}-${(/* @__PURE__ */ new Date()).getTime()}`;
|
|
90
|
+
const bootstrap = (context) => bootstrapApplication(component, { providers: [
|
|
91
|
+
provideServerRendering(),
|
|
92
|
+
provideStaticProps(body),
|
|
93
|
+
{
|
|
94
|
+
provide: ɵSERVER_CONTEXT,
|
|
95
|
+
useValue: "analog-server-component"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
provide: APP_ID,
|
|
99
|
+
useFactory() {
|
|
100
|
+
return appId;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
...config?.providers || []
|
|
104
|
+
] }, context);
|
|
105
|
+
const html = await renderApplication(bootstrap, {
|
|
106
|
+
url,
|
|
107
|
+
document: `<${selector}></${selector}>`,
|
|
108
|
+
platformProviders: [{
|
|
109
|
+
provide: ɵConsole,
|
|
110
|
+
useFactory() {
|
|
111
|
+
return {
|
|
112
|
+
warn: () => {},
|
|
113
|
+
log: () => {}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}]
|
|
117
|
+
});
|
|
118
|
+
const responseData = {
|
|
119
|
+
html,
|
|
120
|
+
outputs: retrieveTransferredState(html, appId)
|
|
121
|
+
};
|
|
122
|
+
return new Response(JSON.stringify(responseData), { headers: { "X-Analog-Component": "true" } });
|
|
157
123
|
}
|
|
158
124
|
function getComponentLoader(componentReqId) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
125
|
+
const _componentId = `/src/server/components/${componentReqId.toLowerCase()}`;
|
|
126
|
+
let componentLoader = void 0;
|
|
127
|
+
let componentId = _componentId;
|
|
128
|
+
if (components[`${_componentId}.ts`]) {
|
|
129
|
+
componentId = `${_componentId}.ts`;
|
|
130
|
+
componentLoader = components[componentId];
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
componentLoader,
|
|
134
|
+
componentId
|
|
135
|
+
};
|
|
167
136
|
}
|
|
168
137
|
function retrieveTransferredState(html, appId) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return {};
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
return {};
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (import.meta.env.PROD) {
|
|
190
|
-
enableProdMode();
|
|
138
|
+
const regex = new RegExp(`<script id="${appId}-state" type="application/json">(.*?)<\/script>`);
|
|
139
|
+
const match = html.match(regex);
|
|
140
|
+
if (match) {
|
|
141
|
+
const scriptContent = match[1];
|
|
142
|
+
if (scriptContent) try {
|
|
143
|
+
return JSON.parse(scriptContent)._analog_output || {};
|
|
144
|
+
} catch (e) {
|
|
145
|
+
console.warn("Exception while parsing static outputs for " + appId, e);
|
|
146
|
+
}
|
|
147
|
+
return {};
|
|
148
|
+
} else return {};
|
|
191
149
|
}
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region packages/router/server/src/render.ts
|
|
152
|
+
enableProdMode();
|
|
192
153
|
/**
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
154
|
+
* Returns a function that accepts the navigation URL,
|
|
155
|
+
* the root HTML, and server context.
|
|
156
|
+
*
|
|
157
|
+
* @param rootComponent
|
|
158
|
+
* @param config
|
|
159
|
+
* @param platformProviders
|
|
160
|
+
* @returns Promise<string | Reponse>
|
|
161
|
+
*/
|
|
201
162
|
function render(rootComponent, config, platformProviders = []) {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
provideServerContext(serverContext),
|
|
214
|
-
platformProviders,
|
|
215
|
-
],
|
|
216
|
-
});
|
|
217
|
-
return html;
|
|
218
|
-
};
|
|
163
|
+
function bootstrap(context) {
|
|
164
|
+
return bootstrapApplication(rootComponent, config, context);
|
|
165
|
+
}
|
|
166
|
+
return async function render(url, document, serverContext) {
|
|
167
|
+
if (serverComponentRequest(serverContext)) return await renderServerComponent(url, serverContext);
|
|
168
|
+
return await renderApplication(bootstrap, {
|
|
169
|
+
document,
|
|
170
|
+
url,
|
|
171
|
+
platformProviders: [provideServerContext(serverContext), platformProviders]
|
|
172
|
+
});
|
|
173
|
+
};
|
|
219
174
|
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Generated bundle index. Do not edit.
|
|
223
|
-
*/
|
|
224
|
-
|
|
175
|
+
//#endregion
|
|
225
176
|
export { injectStaticOutputs, injectStaticProps, provideServerContext, render, renderServerComponent, serverComponentRequest };
|
|
226
|
-
|
|
177
|
+
|
|
178
|
+
//# sourceMappingURL=analogjs-router-server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analogjs-router-server.mjs","sources":["../../../../packages/router/server/src/provide-server-context.ts","../../../../packages/router/server/src/tokens.ts","../../../../packages/router/server/src/server-component-render.ts","../../../../packages/router/server/src/render.ts","../../../../packages/router/server/src/analogjs-router-server.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 REQUEST,\n RESPONSE,\n ServerInternalFetch,\n ServerRequest,\n ServerResponse,\n} from '@analogjs/router/tokens';\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\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 ];\n}\n\nexport function getBaseUrl(req: ServerRequest) {\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) {\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 any)?.encrypted ? 'https' : 'http';\n}\n","import {\n assertInInjectionContext,\n inject,\n InjectionToken,\n makeStateKey,\n Provider,\n TransferState,\n} from '@angular/core';\n\nexport const STATIC_PROPS = new InjectionToken<Record<string, any>>(\n 'Static Props',\n);\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() {\n assertInInjectionContext(injectStaticProps);\n\n return inject(STATIC_PROPS);\n}\n\nexport function injectStaticOutputs<T>() {\n const transferState = inject(TransferState);\n const outputsKey = makeStateKey<T>('_analog_output');\n\n return {\n set(data: T) {\n transferState.set(outputsKey, data);\n },\n };\n}\n","import { ApplicationConfig, Type } from '@angular/core';\nimport {\n bootstrapApplication,\n type 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 { ServerContext } from '@analogjs/router/tokens';\nimport { json as readJsonStream } from 'node:stream/consumers';\n\nimport { provideStaticProps } from './tokens';\n\ntype ComponentLoader = () => Promise<Type<unknown>>;\n\nexport function serverComponentRequest(serverContext: ServerContext) {\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) {\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 any)[\n 'default'\n ] as Type<unknown>;\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, {\n url,\n document: `<${selector}></${selector}>`,\n platformProviders: [\n {\n provide: Console,\n useFactory() {\n return {\n warn: () => {},\n log: () => {},\n };\n },\n },\n ],\n });\n\n const outputs = retrieveTransferredState(html, appId);\n const responseData: { html: string; outputs: Record<string, any> } = {\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 let _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 '@analogjs/router/tokens';\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 * 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 ) {\n if (serverComponentRequest(serverContext)) {\n return await renderServerComponent(url, serverContext);\n }\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵresetCompiledComponents","SERVER_CONTEXT","readJsonStream","Console"],"mappings":"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"}
|
|
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 REQUEST,\n RESPONSE,\n ServerInternalFetch,\n ServerRequest,\n ServerResponse,\n} from '@analogjs/router/tokens';\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\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 ];\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","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 type 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 { ServerContext } from '@analogjs/router/tokens';\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, {\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 '@analogjs/router/tokens';\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 * 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 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 '@analogjs/router/server/actions';\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,29 +1,26 @@
|
|
|
1
|
-
import { InjectionToken, inject } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { InjectionToken, inject } from "@angular/core";
|
|
2
|
+
//#region packages/router/tokens/src/index.ts
|
|
3
|
+
var REQUEST = new InjectionToken("@analogjs/router Server Request");
|
|
4
|
+
var RESPONSE = new InjectionToken("@analogjs/router Server Response");
|
|
5
|
+
var BASE_URL = new InjectionToken("@analogjs/router Base URL");
|
|
6
|
+
var INTERNAL_FETCH = new InjectionToken("@analogjs/router Internal Server Fetch");
|
|
7
|
+
var API_PREFIX = new InjectionToken("@analogjs/router API Prefix");
|
|
8
8
|
function injectRequest() {
|
|
9
|
-
|
|
9
|
+
return inject(REQUEST, { optional: true });
|
|
10
10
|
}
|
|
11
11
|
function injectResponse() {
|
|
12
|
-
|
|
12
|
+
return inject(RESPONSE, { optional: true });
|
|
13
13
|
}
|
|
14
14
|
function injectBaseURL() {
|
|
15
|
-
|
|
15
|
+
return inject(BASE_URL, { optional: true });
|
|
16
16
|
}
|
|
17
17
|
function injectInternalServerFetch() {
|
|
18
|
-
|
|
18
|
+
return inject(INTERNAL_FETCH, { optional: true });
|
|
19
19
|
}
|
|
20
20
|
function injectAPIPrefix() {
|
|
21
|
-
|
|
21
|
+
return inject(API_PREFIX);
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Generated bundle index. Do not edit.
|
|
26
|
-
*/
|
|
27
|
-
|
|
23
|
+
//#endregion
|
|
28
24
|
export { API_PREFIX, BASE_URL, INTERNAL_FETCH, REQUEST, RESPONSE, injectAPIPrefix, injectBaseURL, injectInternalServerFetch, injectRequest, injectResponse };
|
|
29
|
-
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=analogjs-router-tokens.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analogjs-router-tokens.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"analogjs-router-tokens.mjs","names":[],"sources":["../../tokens/src/index.ts"],"sourcesContent":["import { InjectionToken, inject } 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"],"mappings":";;AAgBA,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"}
|