@analogjs/router 2.4.0-beta.9 → 3.0.0-alpha.10

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 (60) hide show
  1. package/fesm2022/analogjs-router-server-actions.mjs +327 -31
  2. package/fesm2022/analogjs-router-server.mjs +155 -176
  3. package/fesm2022/analogjs-router-tanstack-query.mjs +58 -0
  4. package/fesm2022/analogjs-router-tokens.mjs +17 -16
  5. package/fesm2022/analogjs-router.mjs +521 -812
  6. package/fesm2022/debug.page.mjs +121 -0
  7. package/fesm2022/routes.mjs +301 -0
  8. package/package.json +44 -26
  9. package/server/actions/package.json +4 -0
  10. package/server/package.json +4 -0
  11. package/tokens/package.json +4 -0
  12. package/types/server/actions/src/actions.d.ts +13 -0
  13. package/types/server/actions/src/define-action.d.ts +54 -0
  14. package/types/server/actions/src/define-page-load.d.ts +55 -0
  15. package/types/server/actions/src/define-server-route.d.ts +68 -0
  16. package/types/server/actions/src/index.d.ts +9 -0
  17. package/types/server/actions/src/parse-request-data.d.ts +9 -0
  18. package/types/server/actions/src/validate.d.ts +8 -0
  19. package/types/server/src/index.d.ts +4 -0
  20. package/types/server/src/provide-server-context.d.ts +11 -0
  21. package/types/server/src/render.d.ts +12 -0
  22. package/types/server/src/server-component-render.d.ts +4 -0
  23. package/types/server/src/tokens.d.ts +7 -0
  24. package/types/src/index.d.ts +16 -0
  25. package/types/src/lib/cache-key.d.ts +3 -0
  26. package/types/src/lib/constants.d.ts +2 -0
  27. package/types/src/lib/cookie-interceptor.d.ts +4 -0
  28. package/types/src/lib/debug/debug.page.d.ts +18 -0
  29. package/types/src/lib/debug/index.d.ts +10 -0
  30. package/types/src/lib/debug/routes.d.ts +10 -0
  31. package/types/src/lib/define-route.d.ts +46 -0
  32. package/types/src/lib/endpoints.d.ts +5 -0
  33. package/types/src/lib/form-action.directive.d.ts +25 -0
  34. package/types/src/lib/get-load-resolver.d.ts +8 -0
  35. package/types/src/lib/inject-load.d.ts +9 -0
  36. package/types/src/lib/inject-route-endpoint-url.d.ts +2 -0
  37. package/types/src/lib/markdown-helpers.d.ts +2 -0
  38. package/types/src/lib/meta-tags.d.ts +33 -0
  39. package/types/src/lib/models.d.ts +29 -0
  40. package/types/src/lib/provide-file-router.d.ts +18 -0
  41. package/types/src/lib/request-context.d.ts +13 -0
  42. package/types/src/lib/route-config.d.ts +2 -0
  43. package/types/src/lib/route-types.d.ts +12 -0
  44. package/types/src/lib/routes.d.ts +19 -0
  45. package/types/src/lib/server.component.d.ts +33 -0
  46. package/types/tanstack-query/src/index.d.ts +2 -0
  47. package/types/tanstack-query/src/provide-analog-query.d.ts +4 -0
  48. package/types/tanstack-query/src/provide-server-analog-query.d.ts +2 -0
  49. package/types/tanstack-query/src/server-query.d.ts +16 -0
  50. package/types/tokens/src/index.d.ts +23 -0
  51. package/fesm2022/analogjs-router-debug.page-jzggTA45.mjs +0 -91
  52. package/fesm2022/analogjs-router-debug.page-jzggTA45.mjs.map +0 -1
  53. package/fesm2022/analogjs-router-server-actions.mjs.map +0 -1
  54. package/fesm2022/analogjs-router-server.mjs.map +0 -1
  55. package/fesm2022/analogjs-router-tokens.mjs.map +0 -1
  56. package/fesm2022/analogjs-router.mjs.map +0 -1
  57. package/types/analogjs-router-server-actions.d.ts +0 -16
  58. package/types/analogjs-router-server.d.ts +0 -28
  59. package/types/analogjs-router-tokens.d.ts +0 -22
  60. package/types/analogjs-router.d.ts +0 -268
@@ -1,199 +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 } from '@analogjs/router/tokens';
4
- import { bootstrapApplication } from '@angular/platform-browser';
5
- import { getHeader, createEvent, readBody } from 'h3';
6
-
7
- function provideServerContext({ req, res, }) {
8
- const baseUrl = getBaseUrl(req);
9
- if (import.meta.env.DEV) {
10
- _resetCompiledComponents();
11
- }
12
- return [
13
- { provide: _SERVER_CONTEXT, useValue: 'ssr-analog' },
14
- { provide: REQUEST, useValue: req },
15
- { provide: RESPONSE, useValue: res },
16
- { provide: BASE_URL, useValue: baseUrl },
17
- ];
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
+ function getHeaderValue(value) {
8
+ return Array.isArray(value) ? value[0] : value;
9
+ }
10
+ function getRequestHeader(req, 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]);
15
+ }
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
+ ];
18
40
  }
19
41
  function getBaseUrl(req) {
20
- const protocol = getRequestProtocol(req);
21
- const { originalUrl, headers } = req;
22
- const parsedUrl = new URL('', `${protocol}://${headers.host}${originalUrl.endsWith('/')
23
- ? originalUrl.substring(0, originalUrl.length - 1)
24
- : originalUrl}`);
25
- const baseUrl = parsedUrl.origin;
26
- 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;
27
46
  }
28
47
  function getRequestProtocol(req, opts = {}) {
29
- if (opts.xForwardedProto !== false &&
30
- req.headers['x-forwarded-proto'] === 'https') {
31
- return 'https';
32
- }
33
- 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";
34
51
  }
35
-
36
- 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");
37
55
  function provideStaticProps(props) {
38
- return {
39
- provide: STATIC_PROPS,
40
- useFactory() {
41
- return props;
42
- },
43
- };
56
+ return {
57
+ provide: STATIC_PROPS,
58
+ useFactory() {
59
+ return props;
60
+ }
61
+ };
44
62
  }
45
63
  function injectStaticProps() {
46
- assertInInjectionContext(injectStaticProps);
47
- return inject(STATIC_PROPS);
64
+ assertInInjectionContext(injectStaticProps);
65
+ return inject(STATIC_PROPS);
48
66
  }
49
67
  function injectStaticOutputs() {
50
- const transferState = inject(TransferState);
51
- const outputsKey = makeStateKey('_analog_output');
52
- return {
53
- set(data) {
54
- transferState.set(outputsKey, data);
55
- },
56
- };
68
+ const transferState = inject(TransferState);
69
+ const outputsKey = makeStateKey("_analog_output");
70
+ return { set(data) {
71
+ transferState.set(outputsKey, data);
72
+ } };
57
73
  }
58
-
74
+ //#endregion
75
+ //#region packages/router/server/src/server-component-render.ts
59
76
  function serverComponentRequest(serverContext) {
60
- const serverComponentId = getHeader(createEvent(serverContext.req, serverContext.res), 'X-Analog-Component');
61
- if (!serverComponentId &&
62
- serverContext.req.url &&
63
- serverContext.req.url.startsWith('/_analog/components')) {
64
- const componentId = serverContext.req.url.split('/')?.[3];
65
- return componentId;
66
- }
67
- 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;
68
80
  }
69
- const components = import.meta.glob([
70
- '/src/server/components/**/*.{ts,analog,ag}',
71
- ]);
81
+ var components = /* @__PURE__ */ Object.assign({});
72
82
  async function renderServerComponent(url, serverContext, config) {
73
- const componentReqId = serverComponentRequest(serverContext);
74
- const { componentLoader, componentId } = getComponentLoader(componentReqId);
75
- if (!componentLoader) {
76
- return new Response(`Server Component Not Found ${componentId}`, {
77
- status: 404,
78
- });
79
- }
80
- const component = (await componentLoader())['default'];
81
- if (!component) {
82
- return new Response(`No default export for ${componentId}`, {
83
- status: 422,
84
- });
85
- }
86
- const mirror = reflectComponentType(component);
87
- const selector = mirror?.selector.split(',')?.[0] || 'server-component';
88
- const event = createEvent(serverContext.req, serverContext.res);
89
- const body = (await readBody(event)) || {};
90
- const appId = `analog-server-${selector.toLowerCase()}-${new Date().getTime()}`;
91
- const bootstrap = (context) => bootstrapApplication(component, {
92
- providers: [
93
- provideServerRendering(),
94
- provideStaticProps(body),
95
- { provide: _SERVER_CONTEXT, useValue: 'analog-server-component' },
96
- {
97
- provide: APP_ID,
98
- useFactory() {
99
- return appId;
100
- },
101
- },
102
- ...(config?.providers || []),
103
- ],
104
- }, context);
105
- const html = await renderApplication(bootstrap, {
106
- url,
107
- document: `<${selector}></${selector}>`,
108
- platformProviders: [
109
- {
110
- provide: _Console,
111
- useFactory() {
112
- return {
113
- warn: () => { },
114
- log: () => { },
115
- };
116
- },
117
- },
118
- ],
119
- });
120
- const outputs = retrieveTransferredState(html, appId);
121
- const responseData = {
122
- html,
123
- outputs,
124
- };
125
- return new Response(JSON.stringify(responseData), {
126
- headers: {
127
- 'X-Analog-Component': 'true',
128
- },
129
- });
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" } });
130
123
  }
131
124
  function getComponentLoader(componentReqId) {
132
- let _componentId = `/src/server/components/${componentReqId.toLowerCase()}`;
133
- let componentLoader = undefined;
134
- let componentId = _componentId;
135
- if (components[`${_componentId}.ts`]) {
136
- componentId = `${_componentId}.ts`;
137
- componentLoader = components[componentId];
138
- }
139
- 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
+ };
140
136
  }
141
137
  function retrieveTransferredState(html, appId) {
142
- const regex = new RegExp(`<script id="${appId}-state" type="application/json">(.*?)<\/script>`);
143
- const match = html.match(regex);
144
- if (match) {
145
- const scriptContent = match[1];
146
- if (scriptContent) {
147
- try {
148
- const parsedContent = JSON.parse(scriptContent);
149
- return parsedContent._analog_output || {};
150
- }
151
- catch (e) {
152
- console.warn('Exception while parsing static outputs for ' + appId, e);
153
- }
154
- }
155
- return {};
156
- }
157
- else {
158
- return {};
159
- }
160
- }
161
-
162
- if (import.meta.env.PROD) {
163
- 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 {};
164
149
  }
150
+ //#endregion
151
+ //#region packages/router/server/src/render.ts
152
+ enableProdMode();
165
153
  /**
166
- * Returns a function that accepts the navigation URL,
167
- * the root HTML, and server context.
168
- *
169
- * @param rootComponent
170
- * @param config
171
- * @param platformProviders
172
- * @returns Promise<string | Reponse>
173
- */
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
+ */
174
162
  function render(rootComponent, config, platformProviders = []) {
175
- function bootstrap(context) {
176
- return bootstrapApplication(rootComponent, config, context);
177
- }
178
- return async function render(url, document, serverContext) {
179
- if (serverComponentRequest(serverContext)) {
180
- return await renderServerComponent(url, serverContext);
181
- }
182
- const html = await renderApplication(bootstrap, {
183
- document,
184
- url,
185
- platformProviders: [
186
- provideServerContext(serverContext),
187
- platformProviders,
188
- ],
189
- });
190
- return html;
191
- };
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
+ };
192
174
  }
193
-
194
- /**
195
- * Generated bundle index. Do not edit.
196
- */
197
-
175
+ //#endregion
198
176
  export { injectStaticOutputs, injectStaticProps, provideServerContext, render, renderServerComponent, serverComponentRequest };
199
- //# sourceMappingURL=analogjs-router-server.mjs.map
177
+
178
+ //# sourceMappingURL=analogjs-router-server.mjs.map
@@ -0,0 +1,58 @@
1
+ import { ENVIRONMENT_INITIALIZER, TransferState, inject, makeEnvironmentProviders, makeStateKey } from "@angular/core";
2
+ import { lastValueFrom } from "rxjs";
3
+ import { QueryClient, hydrate } from "@tanstack/angular-query-experimental";
4
+ //#region packages/router/tanstack-query/src/provide-analog-query.ts
5
+ var ANALOG_QUERY_STATE_KEY = makeStateKey("analog_query_state");
6
+ function provideAnalogQuery() {
7
+ return makeEnvironmentProviders([{
8
+ provide: ENVIRONMENT_INITIALIZER,
9
+ multi: true,
10
+ useValue() {
11
+ const transferState = inject(TransferState);
12
+ const client = inject(QueryClient);
13
+ const dehydratedState = transferState.get(ANALOG_QUERY_STATE_KEY, null);
14
+ if (dehydratedState) {
15
+ hydrate(client, dehydratedState);
16
+ transferState.remove(ANALOG_QUERY_STATE_KEY);
17
+ }
18
+ }
19
+ }]);
20
+ }
21
+ //#endregion
22
+ //#region packages/router/tanstack-query/src/server-query.ts
23
+ function buildUrl(base, params) {
24
+ if (!params) return base;
25
+ const parts = [];
26
+ for (const [key, value] of Object.entries(params)) {
27
+ if (value === void 0 || value === null) continue;
28
+ const k = encodeURIComponent(key);
29
+ if (Array.isArray(value)) for (const item of value) parts.push(`${k}=${encodeURIComponent(String(item))}`);
30
+ else parts.push(`${k}=${encodeURIComponent(String(value))}`);
31
+ }
32
+ if (parts.length === 0) return base;
33
+ return `${base}${base.includes("?") ? "&" : "?"}${parts.join("&")}`;
34
+ }
35
+ function serverQueryOptions(http, url, options) {
36
+ const { query, ...rest } = options;
37
+ return {
38
+ ...rest,
39
+ queryFn: () => lastValueFrom(http.get(buildUrl(url, query)))
40
+ };
41
+ }
42
+ function serverMutationOptions(http, url, options) {
43
+ return {
44
+ mutationFn: (body) => lastValueFrom(http.post(url, body)),
45
+ ...options
46
+ };
47
+ }
48
+ function serverInfiniteQueryOptions(http, url, options) {
49
+ const { query: buildQuery, ...rest } = options;
50
+ return {
51
+ ...rest,
52
+ queryFn: (context) => lastValueFrom(http.get(buildUrl(url, buildQuery(context))))
53
+ };
54
+ }
55
+ //#endregion
56
+ export { ANALOG_QUERY_STATE_KEY, provideAnalogQuery, serverInfiniteQueryOptions, serverMutationOptions, serverQueryOptions };
57
+
58
+ //# sourceMappingURL=analogjs-router-tanstack-query.mjs.map
@@ -1,25 +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 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");
7
8
  function injectRequest() {
8
- return inject(REQUEST, { optional: true });
9
+ return inject(REQUEST, { optional: true });
9
10
  }
10
11
  function injectResponse() {
11
- return inject(RESPONSE, { optional: true });
12
+ return inject(RESPONSE, { optional: true });
12
13
  }
13
14
  function injectBaseURL() {
14
- return inject(BASE_URL, { optional: true });
15
+ return inject(BASE_URL, { optional: true });
16
+ }
17
+ function injectInternalServerFetch() {
18
+ return inject(INTERNAL_FETCH, { optional: true });
15
19
  }
16
20
  function injectAPIPrefix() {
17
- return inject(API_PREFIX);
21
+ return inject(API_PREFIX);
18
22
  }
23
+ //#endregion
24
+ export { API_PREFIX, BASE_URL, INTERNAL_FETCH, REQUEST, RESPONSE, injectAPIPrefix, injectBaseURL, injectInternalServerFetch, injectRequest, injectResponse };
19
25
 
20
- /**
21
- * Generated bundle index. Do not edit.
22
- */
23
-
24
- export { API_PREFIX, BASE_URL, REQUEST, RESPONSE, injectAPIPrefix, injectBaseURL, injectRequest, injectResponse };
25
- //# sourceMappingURL=analogjs-router-tokens.mjs.map
26
+ //# sourceMappingURL=analogjs-router-tokens.mjs.map