@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.
Files changed (50) hide show
  1. package/fesm2022/analogjs-router-server-actions.mjs +20 -32
  2. package/fesm2022/analogjs-router-server.mjs +151 -199
  3. package/fesm2022/analogjs-router-tokens.mjs +15 -18
  4. package/fesm2022/analogjs-router.mjs +481 -820
  5. package/fesm2022/debug.page.mjs +121 -0
  6. package/fesm2022/routes.mjs +301 -0
  7. package/package.json +8 -8
  8. package/server/actions/package.json +4 -0
  9. package/server/package.json +4 -0
  10. package/tokens/package.json +4 -0
  11. package/types/server/actions/src/actions.d.ts +13 -0
  12. package/types/server/actions/src/index.d.ts +1 -0
  13. package/types/server/src/index.d.ts +4 -0
  14. package/types/server/src/provide-server-context.d.ts +11 -0
  15. package/types/server/src/render.d.ts +12 -0
  16. package/types/server/src/server-component-render.d.ts +4 -0
  17. package/types/server/src/tokens.d.ts +7 -0
  18. package/types/src/index.d.ts +16 -0
  19. package/types/src/lib/cache-key.d.ts +3 -0
  20. package/types/src/lib/constants.d.ts +2 -0
  21. package/types/src/lib/cookie-interceptor.d.ts +4 -0
  22. package/types/src/lib/debug/debug.page.d.ts +18 -0
  23. package/types/src/lib/debug/index.d.ts +10 -0
  24. package/types/src/lib/debug/routes.d.ts +10 -0
  25. package/types/src/lib/define-route.d.ts +46 -0
  26. package/types/src/lib/endpoints.d.ts +5 -0
  27. package/types/src/lib/form-action.directive.d.ts +18 -0
  28. package/types/src/lib/get-load-resolver.d.ts +8 -0
  29. package/types/src/lib/inject-load.d.ts +6 -0
  30. package/types/src/lib/inject-route-endpoint-url.d.ts +2 -0
  31. package/types/src/lib/markdown-helpers.d.ts +2 -0
  32. package/types/src/lib/meta-tags.d.ts +33 -0
  33. package/types/src/lib/models.d.ts +29 -0
  34. package/types/src/lib/provide-file-router.d.ts +18 -0
  35. package/types/src/lib/request-context.d.ts +13 -0
  36. package/types/src/lib/route-config.d.ts +2 -0
  37. package/types/src/lib/route-types.d.ts +11 -0
  38. package/types/src/lib/routes.d.ts +19 -0
  39. package/types/src/lib/server.component.d.ts +33 -0
  40. package/types/tokens/src/index.d.ts +23 -0
  41. package/fesm2022/analogjs-router-debug.page-jzggTA45.mjs +0 -91
  42. package/fesm2022/analogjs-router-debug.page-jzggTA45.mjs.map +0 -1
  43. package/fesm2022/analogjs-router-server-actions.mjs.map +0 -1
  44. package/fesm2022/analogjs-router-server.mjs.map +0 -1
  45. package/fesm2022/analogjs-router-tokens.mjs.map +0 -1
  46. package/fesm2022/analogjs-router.mjs.map +0 -1
  47. package/types/analogjs-router-server-actions.d.ts +0 -17
  48. package/types/analogjs-router-server.d.ts +0 -29
  49. package/types/analogjs-router-tokens.d.ts +0 -27
  50. 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
- return new Response(JSON.stringify(errors), {
3
- status,
4
- headers: {
5
- 'X-Analog-Errors': 'true',
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
- return new Response(JSON.stringify(data), {
11
- headers: {
12
- 'Content-Type': 'application/json; charset=utf-8',
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
- if (typeof config === 'number') {
19
- return new Response(null, {
20
- status: config,
21
- headers: {
22
- Location: `${url}`,
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
- //# sourceMappingURL=analogjs-router-server-actions.mjs.map
26
+
27
+ //# sourceMappingURL=analogjs-router-server-actions.mjs.map
@@ -1,226 +1,178 @@
1
- import { ɵresetCompiledComponents as _resetCompiledComponents, InjectionToken, assertInInjectionContext, inject, TransferState, makeStateKey, reflectComponentType, APP_ID, ɵConsole as _Console, enableProdMode } from '@angular/core';
2
- import { ɵSERVER_CONTEXT as _SERVER_CONTEXT, provideServerRendering, renderApplication } from '@angular/platform-server';
3
- import { REQUEST, RESPONSE, BASE_URL, INTERNAL_FETCH } from '@analogjs/router/tokens';
4
- import { bootstrapApplication } from '@angular/platform-browser';
5
- import { json } from 'node:stream/consumers';
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
- return Array.isArray(value) ? value[0] : value;
8
+ return Array.isArray(value) ? value[0] : value;
9
9
  }
10
10
  function getRequestHeader(req, name) {
11
- const headers = req.headers;
12
- if (!headers) {
13
- return undefined;
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
- const baseUrl = getBaseUrl(req);
25
- if (import.meta.env.DEV) {
26
- _resetCompiledComponents();
27
- }
28
- return [
29
- { provide: _SERVER_CONTEXT, useValue: 'ssr-analog' },
30
- { provide: REQUEST, useValue: req },
31
- { provide: RESPONSE, useValue: res },
32
- { provide: BASE_URL, useValue: baseUrl },
33
- { provide: INTERNAL_FETCH, useValue: fetch },
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
- const protocol = getRequestProtocol(req);
38
- const host = getRequestHeader(req, 'x-forwarded-host') ??
39
- getRequestHeader(req, 'host') ??
40
- 'localhost';
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
- const forwardedProto = getRequestHeader(req, 'x-forwarded-proto')
50
- ?.split(',')[0]
51
- ?.trim();
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
- const STATIC_PROPS = new InjectionToken('Static Props');
52
+ //#endregion
53
+ //#region packages/router/server/src/tokens.ts
54
+ var STATIC_PROPS = new InjectionToken("Static Props");
59
55
  function provideStaticProps(props) {
60
- return {
61
- provide: STATIC_PROPS,
62
- useFactory() {
63
- return props;
64
- },
65
- };
56
+ return {
57
+ provide: STATIC_PROPS,
58
+ useFactory() {
59
+ return props;
60
+ }
61
+ };
66
62
  }
67
63
  function injectStaticProps() {
68
- assertInInjectionContext(injectStaticProps);
69
- return inject(STATIC_PROPS);
64
+ assertInInjectionContext(injectStaticProps);
65
+ return inject(STATIC_PROPS);
70
66
  }
71
67
  function injectStaticOutputs() {
72
- const transferState = inject(TransferState);
73
- const outputsKey = makeStateKey('_analog_output');
74
- return {
75
- set(data) {
76
- transferState.set(outputsKey, data);
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
- // `ServerContext` is still backed by raw Node req/res, so read the header
83
- // directly instead of reconstructing an H3Event just for lookup.
84
- // In h3 v2 / Nitro v3, req may be undefined during fetch-based prerendering
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
- const components = import.meta.glob([
96
- '/src/server/components/**/*.{ts,analog,ag}',
97
- ]);
81
+ var components = /* @__PURE__ */ Object.assign({});
98
82
  async function renderServerComponent(url, serverContext, config) {
99
- const componentReqId = serverComponentRequest(serverContext);
100
- const { componentLoader, componentId } = getComponentLoader(componentReqId);
101
- if (!componentLoader) {
102
- return new Response(`Server Component Not Found ${componentId}`, {
103
- status: 404,
104
- });
105
- }
106
- const component = (await componentLoader())['default'];
107
- if (!component) {
108
- return new Response(`No default export for ${componentId}`, {
109
- status: 422,
110
- });
111
- }
112
- const mirror = reflectComponentType(component);
113
- const selector = mirror?.selector.split(',')?.[0] || 'server-component';
114
- // Server component requests POST JSON props from the client bridge, so parse
115
- // the Node request body directly instead of rebuilding an H3Event wrapper.
116
- const body = (await json(serverContext.req).catch(() => ({}))) || {};
117
- const appId = `analog-server-${selector.toLowerCase()}-${new Date().getTime()}`;
118
- const bootstrap = (context) => bootstrapApplication(component, {
119
- providers: [
120
- provideServerRendering(),
121
- provideStaticProps(body),
122
- { provide: _SERVER_CONTEXT, useValue: 'analog-server-component' },
123
- {
124
- provide: APP_ID,
125
- useFactory() {
126
- return appId;
127
- },
128
- },
129
- ...(config?.providers || []),
130
- ],
131
- }, context);
132
- const html = await renderApplication(bootstrap, {
133
- url,
134
- document: `<${selector}></${selector}>`,
135
- platformProviders: [
136
- {
137
- provide: _Console,
138
- useFactory() {
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
- let _componentId = `/src/server/components/${componentReqId.toLowerCase()}`;
160
- let componentLoader = undefined;
161
- let componentId = _componentId;
162
- if (components[`${_componentId}.ts`]) {
163
- componentId = `${_componentId}.ts`;
164
- componentLoader = components[componentId];
165
- }
166
- return { componentLoader, componentId };
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
- const regex = new RegExp(`<script id="${appId}-state" type="application/json">(.*?)<\/script>`);
170
- const match = html.match(regex);
171
- if (match) {
172
- const scriptContent = match[1];
173
- if (scriptContent) {
174
- try {
175
- const parsedContent = JSON.parse(scriptContent);
176
- return parsedContent._analog_output || {};
177
- }
178
- catch (e) {
179
- console.warn('Exception while parsing static outputs for ' + appId, e);
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
- * Returns a function that accepts the navigation URL,
194
- * the root HTML, and server context.
195
- *
196
- * @param rootComponent
197
- * @param config
198
- * @param platformProviders
199
- * @returns Promise<string | Reponse>
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
- function bootstrap(context) {
203
- return bootstrapApplication(rootComponent, config, context);
204
- }
205
- return async function render(url, document, serverContext) {
206
- if (serverComponentRequest(serverContext)) {
207
- return await renderServerComponent(url, serverContext);
208
- }
209
- const html = await renderApplication(bootstrap, {
210
- document,
211
- url,
212
- platformProviders: [
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
- //# sourceMappingURL=analogjs-router-server.mjs.map
177
+
178
+ //# sourceMappingURL=analogjs-router-server.mjs.map
@@ -1,29 +1,26 @@
1
- import { InjectionToken, inject } from '@angular/core';
2
-
3
- const REQUEST = new InjectionToken('@analogjs/router Server Request');
4
- const RESPONSE = new InjectionToken('@analogjs/router Server Response');
5
- const BASE_URL = new InjectionToken('@analogjs/router Base URL');
6
- const INTERNAL_FETCH = new InjectionToken('@analogjs/router Internal Server Fetch');
7
- const API_PREFIX = new InjectionToken('@analogjs/router API Prefix');
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
- return inject(REQUEST, { optional: true });
9
+ return inject(REQUEST, { optional: true });
10
10
  }
11
11
  function injectResponse() {
12
- return inject(RESPONSE, { optional: true });
12
+ return inject(RESPONSE, { optional: true });
13
13
  }
14
14
  function injectBaseURL() {
15
- return inject(BASE_URL, { optional: true });
15
+ return inject(BASE_URL, { optional: true });
16
16
  }
17
17
  function injectInternalServerFetch() {
18
- return inject(INTERNAL_FETCH, { optional: true });
18
+ return inject(INTERNAL_FETCH, { optional: true });
19
19
  }
20
20
  function injectAPIPrefix() {
21
- return inject(API_PREFIX);
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
- //# sourceMappingURL=analogjs-router-tokens.mjs.map
25
+
26
+ //# sourceMappingURL=analogjs-router-tokens.mjs.map