@analogjs/router 3.0.0-alpha.1 → 3.0.0-alpha.3
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/analogjs-router-server-actions.mjs +20 -32
- package/fesm2022/analogjs-router-server.mjs +151 -199
- package/fesm2022/analogjs-router-tokens.mjs +15 -18
- package/fesm2022/analogjs-router.mjs +481 -820
- package/fesm2022/debug.page.mjs +121 -0
- package/fesm2022/routes.mjs +301 -0
- package/package.json +8 -8
- package/server/actions/package.json +4 -0
- package/server/package.json +4 -0
- package/tokens/package.json +4 -0
- package/types/server/actions/src/actions.d.ts +13 -0
- package/types/server/actions/src/index.d.ts +1 -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 +16 -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 +18 -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 +46 -0
- package/types/src/lib/endpoints.d.ts +5 -0
- package/types/src/lib/form-action.directive.d.ts +18 -0
- package/types/src/lib/get-load-resolver.d.ts +8 -0
- package/types/src/lib/inject-load.d.ts +6 -0
- package/types/src/lib/inject-route-endpoint-url.d.ts +2 -0
- package/types/src/lib/markdown-helpers.d.ts +2 -0
- package/types/src/lib/meta-tags.d.ts +33 -0
- package/types/src/lib/models.d.ts +29 -0
- package/types/src/lib/provide-file-router.d.ts +18 -0
- package/types/src/lib/request-context.d.ts +13 -0
- package/types/src/lib/route-config.d.ts +2 -0
- package/types/src/lib/route-types.d.ts +11 -0
- package/types/src/lib/routes.d.ts +19 -0
- package/types/src/lib/server.component.d.ts +33 -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/fesm2022/analogjs-router-server-actions.mjs.map +0 -1
- package/fesm2022/analogjs-router-server.mjs.map +0 -1
- package/fesm2022/analogjs-router-tokens.mjs.map +0 -1
- package/fesm2022/analogjs-router.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,39 +1,27 @@
|
|
|
1
|
+
//#region packages/router/server/actions/src/actions.ts
|
|
1
2
|
function fail(status, errors) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
},
|
|
7
|
-
});
|
|
3
|
+
return new Response(JSON.stringify(errors), {
|
|
4
|
+
status,
|
|
5
|
+
headers: { "X-Analog-Errors": "true" }
|
|
6
|
+
});
|
|
8
7
|
}
|
|
9
8
|
function json(data, config) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
...config,
|
|
15
|
-
});
|
|
9
|
+
return new Response(JSON.stringify(data), {
|
|
10
|
+
headers: { "Content-Type": "application/json; charset=utf-8" },
|
|
11
|
+
...config
|
|
12
|
+
});
|
|
16
13
|
}
|
|
17
14
|
function redirect(url, config = 302) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return new Response(null, {
|
|
27
|
-
headers: {
|
|
28
|
-
Location: `${url}`,
|
|
29
|
-
},
|
|
30
|
-
...config,
|
|
31
|
-
});
|
|
15
|
+
if (typeof config === "number") return new Response(null, {
|
|
16
|
+
status: config,
|
|
17
|
+
headers: { Location: `${url}` }
|
|
18
|
+
});
|
|
19
|
+
return new Response(null, {
|
|
20
|
+
headers: { Location: `${url}` },
|
|
21
|
+
...config
|
|
22
|
+
});
|
|
32
23
|
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Generated bundle index. Do not edit.
|
|
36
|
-
*/
|
|
37
|
-
|
|
24
|
+
//#endregion
|
|
38
25
|
export { fail, json, redirect };
|
|
39
|
-
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=analogjs-router-server-actions.mjs.map
|
|
@@ -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,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
|