@analogjs/router 1.4.0-beta.1 → 1.4.0-beta.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.
@@ -1,314 +1,383 @@
1
- // lib/meta-tags.mjs
2
- import { inject } from "@angular/core";
3
- import { Meta } from "@angular/platform-browser";
4
- import { NavigationEnd, Router } from "@angular/router";
5
- import { filter } from "rxjs/operators";
6
- var ROUTE_META_TAGS_KEY = Symbol("@analogjs/router Route Meta Tags Key");
7
- var CHARSET_KEY = "charset";
8
- var HTTP_EQUIV_KEY = "httpEquiv";
9
- var HTTP_EQUIV_SELECTOR_KEY = "http-equiv";
10
- var NAME_KEY = "name";
11
- var PROPERTY_KEY = "property";
12
- var CONTENT_KEY = "content";
1
+ import { inject, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER, Injector } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { firstValueFrom, map } from 'rxjs';
4
+ import { Meta } from '@angular/platform-browser';
5
+ import { Router, NavigationEnd, ActivatedRoute, provideRouter } from '@angular/router';
6
+ import { filter } from 'rxjs/operators';
7
+
8
+ const ROUTE_META_TAGS_KEY = Symbol('@analogjs/router Route Meta Tags Key');
9
+ const CHARSET_KEY = 'charset';
10
+ const HTTP_EQUIV_KEY = 'httpEquiv';
11
+ // httpEquiv selector key needs to be in kebab case format
12
+ const HTTP_EQUIV_SELECTOR_KEY = 'http-equiv';
13
+ const NAME_KEY = 'name';
14
+ const PROPERTY_KEY = 'property';
15
+ const CONTENT_KEY = 'content';
13
16
  function updateMetaTagsOnRouteChange() {
14
- const router = inject(Router);
15
- const metaService = inject(Meta);
16
- router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
17
- const metaTagMap = getMetaTagMap(router.routerState.snapshot.root);
18
- for (const metaTagSelector in metaTagMap) {
19
- const metaTag = metaTagMap[metaTagSelector];
20
- metaService.updateTag(metaTag, metaTagSelector);
21
- }
22
- });
17
+ const router = inject(Router);
18
+ const metaService = inject(Meta);
19
+ router.events
20
+ .pipe(filter((event) => event instanceof NavigationEnd))
21
+ .subscribe(() => {
22
+ const metaTagMap = getMetaTagMap(router.routerState.snapshot.root);
23
+ for (const metaTagSelector in metaTagMap) {
24
+ const metaTag = metaTagMap[metaTagSelector];
25
+ metaService.updateTag(metaTag, metaTagSelector);
26
+ }
27
+ });
23
28
  }
24
29
  function getMetaTagMap(route) {
25
- const metaTagMap = {};
26
- let currentRoute = route;
27
- while (currentRoute) {
28
- const metaTags = currentRoute.data[ROUTE_META_TAGS_KEY] ?? [];
29
- for (const metaTag of metaTags) {
30
- metaTagMap[getMetaTagSelector(metaTag)] = metaTag;
30
+ const metaTagMap = {};
31
+ let currentRoute = route;
32
+ while (currentRoute) {
33
+ const metaTags = currentRoute.data[ROUTE_META_TAGS_KEY] ?? [];
34
+ for (const metaTag of metaTags) {
35
+ metaTagMap[getMetaTagSelector(metaTag)] = metaTag;
36
+ }
37
+ currentRoute = currentRoute.firstChild;
31
38
  }
32
- currentRoute = currentRoute.firstChild;
33
- }
34
- return metaTagMap;
39
+ return metaTagMap;
35
40
  }
36
41
  function getMetaTagSelector(metaTag) {
37
- if (metaTag.name) {
38
- return `${NAME_KEY}="${metaTag.name}"`;
39
- }
40
- if (metaTag.property) {
41
- return `${PROPERTY_KEY}="${metaTag.property}"`;
42
- }
43
- if (metaTag.httpEquiv) {
44
- return `${HTTP_EQUIV_SELECTOR_KEY}="${metaTag.httpEquiv}"`;
45
- }
46
- return CHARSET_KEY;
42
+ if (metaTag.name) {
43
+ return `${NAME_KEY}="${metaTag.name}"`;
44
+ }
45
+ if (metaTag.property) {
46
+ return `${PROPERTY_KEY}="${metaTag.property}"`;
47
+ }
48
+ if (metaTag.httpEquiv) {
49
+ return `${HTTP_EQUIV_SELECTOR_KEY}="${metaTag.httpEquiv}"`;
50
+ }
51
+ return CHARSET_KEY;
47
52
  }
48
53
 
49
- // lib/endpoints.mjs
50
- var ANALOG_META_KEY = Symbol("@analogjs/router Analog Route Metadata Key");
51
- var PAGE_ENDPOINTS = import.meta.glob([
52
- "/src/app/pages/**/*.server.ts"
54
+ const ANALOG_META_KEY = Symbol('@analogjs/router Analog Route Metadata Key');
55
+ const PAGE_ENDPOINTS = import.meta.glob([
56
+ '/src/app/pages/**/*.server.ts',
53
57
  ]);
54
58
 
55
- // lib/route-config.mjs
56
- import { inject as inject2 } from "@angular/core";
57
- import { HttpClient } from "@angular/common/http";
58
- import { firstValueFrom } from "rxjs";
59
59
  function toRouteConfig(routeMeta) {
60
- if (routeMeta && isRedirectRouteMeta(routeMeta)) {
61
- return routeMeta;
62
- }
63
- let { meta, ...routeConfig } = routeMeta ?? {};
64
- if (Array.isArray(meta)) {
65
- routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };
66
- } else if (typeof meta === "function") {
60
+ if (routeMeta && isRedirectRouteMeta(routeMeta)) {
61
+ return routeMeta;
62
+ }
63
+ let { meta, ...routeConfig } = routeMeta ?? {};
64
+ if (Array.isArray(meta)) {
65
+ routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };
66
+ }
67
+ else if (typeof meta === 'function') {
68
+ routeConfig.resolve = {
69
+ ...routeConfig.resolve,
70
+ [ROUTE_META_TAGS_KEY]: meta,
71
+ };
72
+ }
73
+ if (!routeConfig) {
74
+ routeConfig = {};
75
+ }
67
76
  routeConfig.resolve = {
68
- ...routeConfig.resolve,
69
- [ROUTE_META_TAGS_KEY]: meta
77
+ ...routeConfig.resolve,
78
+ load: async (route) => {
79
+ const routeConfig = route.routeConfig;
80
+ if (PAGE_ENDPOINTS[routeConfig[ANALOG_META_KEY].endpointKey]) {
81
+ const { queryParams, fragment: hash, params, parent } = route;
82
+ const segment = parent?.url.map((segment) => segment.path).join('/') || '';
83
+ const url = new URL('', import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL']);
84
+ url.pathname = `${url.pathname.endsWith('/') ? url.pathname : url.pathname + '/'}api/_analog${routeConfig[ANALOG_META_KEY].endpoint}`;
85
+ url.search = `${new URLSearchParams(queryParams).toString()}`;
86
+ url.hash = hash ?? '';
87
+ Object.keys(params).forEach((param) => {
88
+ url.pathname = url.pathname.replace(`[${param}]`, params[param]);
89
+ });
90
+ url.pathname = url.pathname.replace('**', segment);
91
+ if (globalThis.$fetch) {
92
+ return globalThis.$fetch(url.pathname);
93
+ }
94
+ const http = inject(HttpClient);
95
+ return firstValueFrom(http.get(`${url.href}`));
96
+ }
97
+ return {};
98
+ },
70
99
  };
71
- }
72
- if (!routeConfig) {
73
- routeConfig = {};
74
- }
75
- routeConfig.resolve = {
76
- ...routeConfig.resolve,
77
- load: async (route) => {
78
- const routeConfig2 = route.routeConfig;
79
- if (PAGE_ENDPOINTS[routeConfig2[ANALOG_META_KEY].endpointKey]) {
80
- const { queryParams, fragment: hash, params, parent } = route;
81
- const segment = parent?.url.map((segment2) => segment2.path).join("/") || "";
82
- const url = new URL("", import.meta.env["VITE_ANALOG_PUBLIC_BASE_URL"]);
83
- url.pathname = `${url.pathname.endsWith("/") ? url.pathname : url.pathname + "/"}api/_analog${routeConfig2[ANALOG_META_KEY].endpoint}`;
84
- url.search = `${new URLSearchParams(queryParams).toString()}`;
85
- url.hash = hash ?? "";
86
- Object.keys(params).forEach((param) => {
87
- url.pathname = url.pathname.replace(`[${param}]`, params[param]);
88
- });
89
- url.pathname = url.pathname.replace("**", segment);
90
- if (globalThis.$fetch) {
91
- return globalThis.$fetch(url.pathname);
92
- }
93
- const http = inject2(HttpClient);
94
- return firstValueFrom(http.get(`${url.href}`));
95
- }
96
- return {};
97
- }
98
- };
99
- return routeConfig;
100
+ return routeConfig;
100
101
  }
101
102
  function isRedirectRouteMeta(routeMeta) {
102
- return !!routeMeta.redirectTo;
103
+ return !!routeMeta.redirectTo;
103
104
  }
104
105
 
105
- // lib/markdown-helpers.mjs
106
- import { inject as inject3 } from "@angular/core";
107
- var isNgZoneEnabled = typeof Zone !== "undefined" && !!Zone.root;
106
+ // The Zone is currently enabled by default, so we wouldn't need this check.
107
+ // However, leaving this open space will be useful if zone.js becomes optional
108
+ // in the future. This means we won't have to modify the current code, and it will
109
+ // continue to work seamlessly.
110
+ const isNgZoneEnabled = typeof Zone !== 'undefined' && !!Zone.root;
108
111
  function toMarkdownModule(markdownFileFactory) {
109
- return async () => {
110
- const createLoader = () => Promise.all([import("@analogjs/content"), markdownFileFactory()]);
111
- const [{ parseRawContentFile, MarkdownRouteComponent, ContentRenderer }, markdownFile] = await (isNgZoneEnabled ? (
112
- // We are not able to use `runOutsideAngular` because we are not inside
113
- // an injection context to retrieve the `NgZone` instance.
114
- // The `Zone.root.run` is required when the code is running in the
115
- // browser since asynchronous tasks being scheduled in the current context
116
- // are a reason for unnecessary change detection cycles.
117
- Zone.root.run(createLoader)
118
- ) : createLoader());
119
- const { content, attributes } = parseRawContentFile(markdownFile);
120
- const { title, meta } = attributes;
121
- return {
122
- default: MarkdownRouteComponent,
123
- routeMeta: {
124
- data: { _analogContent: content },
125
- title,
126
- meta,
127
- resolve: {
128
- renderedAnalogContent: async () => {
129
- const contentRenderer = inject3(ContentRenderer);
130
- return contentRenderer.render(content);
131
- }
132
- }
133
- }
112
+ return async () => {
113
+ const createLoader = () => Promise.all([import('@analogjs/content'), markdownFileFactory()]);
114
+ const [{ parseRawContentFile, MarkdownRouteComponent, ContentRenderer }, markdownFile,] = await (isNgZoneEnabled
115
+ ? // We are not able to use `runOutsideAngular` because we are not inside
116
+ // an injection context to retrieve the `NgZone` instance.
117
+ // The `Zone.root.run` is required when the code is running in the
118
+ // browser since asynchronous tasks being scheduled in the current context
119
+ // are a reason for unnecessary change detection cycles.
120
+ Zone.root.run(createLoader)
121
+ : createLoader());
122
+ const { content, attributes } = parseRawContentFile(markdownFile);
123
+ const { title, meta } = attributes;
124
+ return {
125
+ default: MarkdownRouteComponent,
126
+ routeMeta: {
127
+ data: { _analogContent: content },
128
+ title,
129
+ meta,
130
+ resolve: {
131
+ renderedAnalogContent: async () => {
132
+ const contentRenderer = inject(ContentRenderer);
133
+ return contentRenderer.render(content);
134
+ },
135
+ },
136
+ },
137
+ };
134
138
  };
135
- };
136
139
  }
137
140
 
138
- // lib/constants.mjs
139
- var ENDPOINT_EXTENSION = ".server.ts";
140
- var APP_DIR = "src/app";
141
+ const ENDPOINT_EXTENSION = '.server.ts';
142
+ const APP_DIR = 'src/app';
141
143
 
142
- // lib/routes.mjs
143
- var FILES = import.meta.glob([
144
- "/app/routes/**/*.ts",
145
- "/src/app/routes/**/*.ts",
146
- "/src/app/pages/**/*.page.ts",
147
- "/src/app/pages/**/*.page.analog"
144
+ /// <reference types="vite/client" />
145
+ const FILES = import.meta.glob([
146
+ '/app/routes/**/*.ts',
147
+ '/src/app/routes/**/*.ts',
148
+ '/src/app/pages/**/*.page.ts',
149
+ '/src/app/pages/**/*.page.analog',
148
150
  ]);
149
- var CONTENT_FILES = import.meta.glob(["/src/app/routes/**/*.md", "/src/app/pages/**/*.md"], { query: "?raw", import: "default" });
151
+ const CONTENT_FILES = import.meta.glob(['/src/app/routes/**/*.md', '/src/app/pages/**/*.md'], { query: '?raw', import: 'default' });
152
+ /**
153
+ * A function used to parse list of files and create configuration of routes.
154
+ *
155
+ * @param files
156
+ * @returns Array of routes
157
+ */
150
158
  function createRoutes(files) {
151
- const filenames = Object.keys(files);
152
- if (filenames.length === 0) {
153
- return [];
154
- }
155
- const rawRoutesByLevelMap = filenames.reduce((acc, filename) => {
156
- const rawPath = toRawPath(filename);
157
- const rawSegments = rawPath.split("/");
158
- const level = rawSegments.length - 1;
159
- const rawSegment = rawSegments[level];
160
- const ancestorRawSegments = rawSegments.slice(0, level);
161
- return {
162
- ...acc,
163
- [level]: {
164
- ...acc[level],
165
- [rawPath]: {
166
- filename,
167
- rawSegment,
168
- ancestorRawSegments,
169
- segment: toSegment(rawSegment),
170
- level,
171
- children: []
159
+ const filenames = Object.keys(files);
160
+ if (filenames.length === 0) {
161
+ return [];
162
+ }
163
+ // map filenames to raw routes and group them by level
164
+ const rawRoutesByLevelMap = filenames.reduce((acc, filename) => {
165
+ const rawPath = toRawPath(filename);
166
+ const rawSegments = rawPath.split('/');
167
+ // nesting level starts at 0
168
+ // rawPath: /products => level: 0
169
+ // rawPath: /products/:id => level: 1
170
+ const level = rawSegments.length - 1;
171
+ const rawSegment = rawSegments[level];
172
+ const ancestorRawSegments = rawSegments.slice(0, level);
173
+ return {
174
+ ...acc,
175
+ [level]: {
176
+ ...acc[level],
177
+ [rawPath]: {
178
+ filename,
179
+ rawSegment,
180
+ ancestorRawSegments,
181
+ segment: toSegment(rawSegment),
182
+ level,
183
+ children: [],
184
+ },
185
+ },
186
+ };
187
+ }, {});
188
+ const allLevels = Object.keys(rawRoutesByLevelMap).map(Number);
189
+ const maxLevel = Math.max(...allLevels);
190
+ // add each raw route to its parent's children array
191
+ for (let level = maxLevel; level > 0; level--) {
192
+ const rawRoutesMap = rawRoutesByLevelMap[level];
193
+ const rawPaths = Object.keys(rawRoutesMap);
194
+ for (const rawPath of rawPaths) {
195
+ const rawRoute = rawRoutesMap[rawPath];
196
+ const parentRawPath = rawRoute.ancestorRawSegments.join('/');
197
+ const parentRawSegmentIndex = rawRoute.ancestorRawSegments.length - 1;
198
+ const parentRawSegment = rawRoute.ancestorRawSegments[parentRawSegmentIndex];
199
+ // create the parent level and/or raw route if it does not exist
200
+ // parent route won't exist for nested routes that don't have a layout route
201
+ rawRoutesByLevelMap[level - 1] ||= {};
202
+ rawRoutesByLevelMap[level - 1][parentRawPath] ||= {
203
+ filename: null,
204
+ rawSegment: parentRawSegment,
205
+ ancestorRawSegments: rawRoute.ancestorRawSegments.slice(0, parentRawSegmentIndex),
206
+ segment: toSegment(parentRawSegment),
207
+ level: level - 1,
208
+ children: [],
209
+ };
210
+ rawRoutesByLevelMap[level - 1][parentRawPath].children.push(rawRoute);
172
211
  }
173
- }
174
- };
175
- }, {});
176
- const allLevels = Object.keys(rawRoutesByLevelMap).map(Number);
177
- const maxLevel = Math.max(...allLevels);
178
- for (let level = maxLevel; level > 0; level--) {
179
- const rawRoutesMap = rawRoutesByLevelMap[level];
180
- const rawPaths = Object.keys(rawRoutesMap);
181
- for (const rawPath of rawPaths) {
182
- const rawRoute = rawRoutesMap[rawPath];
183
- const parentRawPath = rawRoute.ancestorRawSegments.join("/");
184
- const parentRawSegmentIndex = rawRoute.ancestorRawSegments.length - 1;
185
- const parentRawSegment = rawRoute.ancestorRawSegments[parentRawSegmentIndex];
186
- rawRoutesByLevelMap[level - 1] ||= {};
187
- rawRoutesByLevelMap[level - 1][parentRawPath] ||= {
188
- filename: null,
189
- rawSegment: parentRawSegment,
190
- ancestorRawSegments: rawRoute.ancestorRawSegments.slice(0, parentRawSegmentIndex),
191
- segment: toSegment(parentRawSegment),
192
- level: level - 1,
193
- children: []
194
- };
195
- rawRoutesByLevelMap[level - 1][parentRawPath].children.push(rawRoute);
196
212
  }
197
- }
198
- const rootRawRoutesMap = rawRoutesByLevelMap[0];
199
- const rawRoutes = Object.keys(rootRawRoutesMap).map((segment) => rootRawRoutesMap[segment]);
200
- sortRawRoutes(rawRoutes);
201
- return toRoutes(rawRoutes, files);
213
+ // only take raw routes from the root level
214
+ // since they already contain nested routes as their children
215
+ const rootRawRoutesMap = rawRoutesByLevelMap[0];
216
+ const rawRoutes = Object.keys(rootRawRoutesMap).map((segment) => rootRawRoutesMap[segment]);
217
+ sortRawRoutes(rawRoutes);
218
+ return toRoutes(rawRoutes, files);
202
219
  }
203
220
  function toRawPath(filename) {
204
- return filename.replace(
221
+ return filename
222
+ .replace(
205
223
  // convert to relative path and remove file extension
206
- /^\/(.*?)\/routes\/|^\/(.*?)\/pages\/|\/app\/routes\/|(\.page\.(js|ts|analog)$)|(\.(ts|md|analog)$)/g,
207
- ""
208
- ).replace(/\[\.{3}.+\]/, "**").replace(/\[([^\]]+)\]/g, ":$1");
224
+ /^\/(.*?)\/routes\/|^\/(.*?)\/pages\/|\/app\/routes\/|(\.page\.(js|ts|analog)$)|(\.(ts|md|analog)$)/g, '')
225
+ .replace(/\[\.{3}.+\]/, '**') // [...not-found] => **
226
+ .replace(/\[([^\]]+)\]/g, ':$1'); // [id] => :id
209
227
  }
210
228
  function toSegment(rawSegment) {
211
- return rawSegment.replace(/index|\(.*?\)/g, "").replace(/\.|\/+/g, "/").replace(/^\/+|\/+$/g, "");
229
+ return rawSegment
230
+ .replace(/index|\(.*?\)/g, '') // replace named empty segments
231
+ .replace(/\.|\/+/g, '/') // replace dots with slashes and remove redundant slashes
232
+ .replace(/^\/+|\/+$/g, ''); // remove trailing slashes
212
233
  }
213
234
  function toRoutes(rawRoutes, files) {
214
- const routes2 = [];
215
- for (const rawRoute of rawRoutes) {
216
- const children = rawRoute.children.length > 0 ? toRoutes(rawRoute.children, files) : void 0;
217
- let module = void 0;
218
- let analogMeta = void 0;
219
- if (rawRoute.filename) {
220
- const isMarkdownFile = rawRoute.filename.endsWith(".md");
221
- module = isMarkdownFile ? toMarkdownModule(files[rawRoute.filename]) : files[rawRoute.filename];
222
- const endpointKey = rawRoute.filename.replace(/\.page\.(ts|analog)$/, ENDPOINT_EXTENSION);
223
- const rawEndpoint = rawRoute.filename.replace(/\.page\.(ts|analog)$/, "").replace(/\[\.{3}.+\]/, "**").split(APP_DIR)[1];
224
- const endpoint = (rawEndpoint || "").replace(/\./g, "/").replace(/\/\((.*?)\)$/, "/-$1-");
225
- analogMeta = {
226
- endpoint,
227
- endpointKey
228
- };
229
- }
230
- const route = module ? {
231
- path: rawRoute.segment,
232
- loadChildren: () => module().then((m) => [
233
- {
234
- path: "",
235
- component: m.default,
236
- ...toRouteConfig(m.routeMeta),
237
- children,
238
- [ANALOG_META_KEY]: analogMeta
235
+ const routes = [];
236
+ for (const rawRoute of rawRoutes) {
237
+ const children = rawRoute.children.length > 0
238
+ ? toRoutes(rawRoute.children, files)
239
+ : undefined;
240
+ let module = undefined;
241
+ let analogMeta = undefined;
242
+ if (rawRoute.filename) {
243
+ const isMarkdownFile = rawRoute.filename.endsWith('.md');
244
+ module = isMarkdownFile
245
+ ? toMarkdownModule(files[rawRoute.filename])
246
+ : files[rawRoute.filename];
247
+ const endpointKey = rawRoute.filename.replace(/\.page\.(ts|analog)$/, ENDPOINT_EXTENSION);
248
+ // get endpoint path
249
+ const rawEndpoint = rawRoute.filename
250
+ .replace(/\.page\.(ts|analog)$/, '')
251
+ .replace(/\[\.{3}.+\]/, '**') // [...not-found] => **
252
+ .split(APP_DIR)[1];
253
+ // replace periods, remove (index) paths
254
+ const endpoint = (rawEndpoint || '')
255
+ .replace(/\./g, '/')
256
+ .replace(/\/\((.*?)\)$/, '/-$1-');
257
+ analogMeta = {
258
+ endpoint,
259
+ endpointKey,
260
+ };
239
261
  }
240
- ])
241
- } : { path: rawRoute.segment, children };
242
- routes2.push(route);
243
- }
244
- return routes2;
262
+ const route = module
263
+ ? {
264
+ path: rawRoute.segment,
265
+ loadChildren: () => module().then((m) => [
266
+ {
267
+ path: '',
268
+ component: m.default,
269
+ ...toRouteConfig(m.routeMeta),
270
+ children,
271
+ [ANALOG_META_KEY]: analogMeta,
272
+ },
273
+ ]),
274
+ }
275
+ : { path: rawRoute.segment, children };
276
+ routes.push(route);
277
+ }
278
+ return routes;
245
279
  }
246
280
  function sortRawRoutes(rawRoutes) {
247
- rawRoutes.sort((a, b) => {
248
- let segmentA = deprioritizeSegment(a.segment);
249
- let segmentB = deprioritizeSegment(b.segment);
250
- if (a.children.length > b.children.length) {
251
- segmentA = `~${segmentA}`;
252
- } else if (a.children.length < b.children.length) {
253
- segmentB = `~${segmentB}`;
281
+ rawRoutes.sort((a, b) => {
282
+ let segmentA = deprioritizeSegment(a.segment);
283
+ let segmentB = deprioritizeSegment(b.segment);
284
+ // prioritize routes with fewer children
285
+ if (a.children.length > b.children.length) {
286
+ segmentA = `~${segmentA}`;
287
+ }
288
+ else if (a.children.length < b.children.length) {
289
+ segmentB = `~${segmentB}`;
290
+ }
291
+ return segmentA > segmentB ? 1 : -1;
292
+ });
293
+ for (const rawRoute of rawRoutes) {
294
+ sortRawRoutes(rawRoute.children);
254
295
  }
255
- return segmentA > segmentB ? 1 : -1;
256
- });
257
- for (const rawRoute of rawRoutes) {
258
- sortRawRoutes(rawRoute.children);
259
- }
260
296
  }
261
297
  function deprioritizeSegment(segment) {
262
- return segment.replace(":", "~~").replace("**", "~~~~");
298
+ // deprioritize param and wildcard segments
299
+ return segment.replace(':', '~~').replace('**', '~~~~');
263
300
  }
264
- var routes = createRoutes({ ...FILES, ...CONTENT_FILES });
301
+ const routes = createRoutes({ ...FILES, ...CONTENT_FILES });
265
302
 
266
- // lib/define-route.mjs
267
- import { inject as inject4 } from "@angular/core";
268
- import { Router as Router2 } from "@angular/router";
269
- import { ActivatedRoute } from "@angular/router";
270
- var defineRouteMeta = (route) => {
271
- return route;
303
+ /**
304
+ * @deprecated Use `RouteMeta` type instead.
305
+ * For more info see: https://github.com/analogjs/analog/issues/223
306
+ *
307
+ * Defines additional route config metadata. This
308
+ * object is merged into the route config with
309
+ * the predefined file-based route.
310
+ *
311
+ * @usageNotes
312
+ *
313
+ * ```
314
+ * import { Component } from '@angular/core';
315
+ * import { defineRouteMeta } from '@analogjs/router';
316
+ *
317
+ * export const routeMeta = defineRouteMeta({
318
+ * title: 'Welcome'
319
+ * });
320
+ *
321
+ * @Component({
322
+ * template: `Home`,
323
+ * standalone: true,
324
+ * })
325
+ * export default class HomeComponent {}
326
+ * ```
327
+ *
328
+ * @param route
329
+ * @returns
330
+ */
331
+ const defineRouteMeta = (route) => {
332
+ return route;
272
333
  };
273
- var injectRouter = () => {
274
- return inject4(Router2);
334
+ /**
335
+ * Returns the instance of Angular Router
336
+ *
337
+ * @returns The router
338
+ */
339
+ const injectRouter = () => {
340
+ return inject(Router);
275
341
  };
276
- var injectActivatedRoute = () => {
277
- return inject4(ActivatedRoute);
342
+ /**
343
+ * Returns the instance of the Activate Route for the component
344
+ *
345
+ * @returns The activated route
346
+ */
347
+ const injectActivatedRoute = () => {
348
+ return inject(ActivatedRoute);
278
349
  };
279
350
 
280
- // lib/provide-file-router.mjs
281
- import { ENVIRONMENT_INITIALIZER, makeEnvironmentProviders } from "@angular/core";
282
- import { provideRouter } from "@angular/router";
351
+ /**
352
+ * Sets up providers for the Angular router, and registers
353
+ * file-based routes. Additional features can be provided
354
+ * to further configure the behavior of the router.
355
+ *
356
+ * @param features
357
+ * @returns Providers and features to configure the router with routes
358
+ */
283
359
  function provideFileRouter(...features) {
284
- return makeEnvironmentProviders([
285
- // TODO: remove type casting after Angular >=15.1.1 upgrade
286
- // https://github.com/angular/angular/pull/48720
287
- provideRouter(routes, ...features).ɵproviders,
288
- {
289
- provide: ENVIRONMENT_INITIALIZER,
290
- multi: true,
291
- useValue: () => updateMetaTagsOnRouteChange()
292
- }
293
- ]);
360
+ return makeEnvironmentProviders([
361
+ // TODO: remove type casting after Angular >=15.1.1 upgrade
362
+ // https://github.com/angular/angular/pull/48720
363
+ provideRouter(routes, ...features).ɵproviders,
364
+ {
365
+ provide: ENVIRONMENT_INITIALIZER,
366
+ multi: true,
367
+ useValue: () => updateMetaTagsOnRouteChange(),
368
+ },
369
+ ]);
294
370
  }
295
371
 
296
- // lib/inject-load.mjs
297
- import { Injector, inject as inject5 } from "@angular/core";
298
- import { ActivatedRoute as ActivatedRoute2 } from "@angular/router";
299
- import { map } from "rxjs";
300
372
  function injectLoad(options) {
301
- const injector = options?.injector ?? inject5(Injector);
302
- const route = injector.get(ActivatedRoute2);
303
- return route.data.pipe(map((data) => data["load"]));
373
+ const injector = options?.injector ?? inject(Injector);
374
+ const route = injector.get(ActivatedRoute);
375
+ return route.data.pipe(map((data) => data['load']));
304
376
  }
305
- export {
306
- createRoutes,
307
- defineRouteMeta,
308
- injectActivatedRoute,
309
- injectLoad,
310
- injectRouter,
311
- provideFileRouter,
312
- routes
313
- };
377
+
378
+ /**
379
+ * Generated bundle index. Do not edit.
380
+ */
381
+
382
+ export { createRoutes, defineRouteMeta, injectActivatedRoute, injectLoad, injectRouter, provideFileRouter, routes };
314
383
  //# sourceMappingURL=analogjs-router.mjs.map
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../packages/router/src/lib/meta-tags.ts", "../../../../packages/router/src/lib/endpoints.ts", "../../../../packages/router/src/lib/route-config.ts", "../../../../packages/router/src/lib/markdown-helpers.ts", "../../../../packages/router/src/lib/constants.ts", "../../../../packages/router/src/lib/routes.ts", "../../../../packages/router/src/lib/define-route.ts", "../../../../packages/router/src/lib/provide-file-router.ts", "../../../../packages/router/src/lib/inject-load.ts"],
4
- "sourcesContent": ["import { inject } from '@angular/core';\nimport { Meta, MetaDefinition as NgMetaTag } from '@angular/platform-browser';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\nexport const ROUTE_META_TAGS_KEY = Symbol(\n '@analogjs/router Route Meta Tags Key'\n);\n\nconst CHARSET_KEY = 'charset';\nconst HTTP_EQUIV_KEY = 'httpEquiv';\n// httpEquiv selector key needs to be in kebab case format\nconst HTTP_EQUIV_SELECTOR_KEY = 'http-equiv';\nconst NAME_KEY = 'name';\nconst PROPERTY_KEY = 'property';\nconst CONTENT_KEY = 'content';\n\nexport type MetaTag =\n | (CharsetMetaTag & ExcludeRestMetaTagKeys<typeof CHARSET_KEY>)\n | (HttpEquivMetaTag & ExcludeRestMetaTagKeys<typeof HTTP_EQUIV_KEY>)\n | (NameMetaTag & ExcludeRestMetaTagKeys<typeof NAME_KEY>)\n | (PropertyMetaTag & ExcludeRestMetaTagKeys<typeof PROPERTY_KEY>);\n\ntype CharsetMetaTag = { [CHARSET_KEY]: string };\ntype HttpEquivMetaTag = { [HTTP_EQUIV_KEY]: string; [CONTENT_KEY]: string };\ntype NameMetaTag = { [NAME_KEY]: string; [CONTENT_KEY]: string };\ntype PropertyMetaTag = { [PROPERTY_KEY]: string; [CONTENT_KEY]: string };\n\ntype MetaTagKey =\n | typeof CHARSET_KEY\n | typeof HTTP_EQUIV_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY;\ntype ExcludeRestMetaTagKeys<Key extends MetaTagKey> = {\n [K in Exclude<MetaTagKey, Key>]?: never;\n};\n\ntype MetaTagSelector =\n | typeof CHARSET_KEY\n | `${\n | typeof HTTP_EQUIV_SELECTOR_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY}=\"${string}\"`;\ntype MetaTagMap = Record<MetaTagSelector, MetaTag>;\n\nexport function updateMetaTagsOnRouteChange(): void {\n const router = inject(Router);\n const metaService = inject(Meta);\n\n router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n const metaTagMap = getMetaTagMap(router.routerState.snapshot.root);\n\n for (const metaTagSelector in metaTagMap) {\n const metaTag = metaTagMap[\n metaTagSelector as MetaTagSelector\n ] as NgMetaTag;\n metaService.updateTag(metaTag, metaTagSelector);\n }\n });\n}\n\nfunction getMetaTagMap(route: ActivatedRouteSnapshot): MetaTagMap {\n const metaTagMap = {} as MetaTagMap;\n let currentRoute: ActivatedRouteSnapshot | null = route;\n\n while (currentRoute) {\n const metaTags: MetaTag[] = currentRoute.data[ROUTE_META_TAGS_KEY] ?? [];\n for (const metaTag of metaTags) {\n metaTagMap[getMetaTagSelector(metaTag)] = metaTag;\n }\n\n currentRoute = currentRoute.firstChild;\n }\n\n return metaTagMap;\n}\n\nfunction getMetaTagSelector(metaTag: MetaTag): MetaTagSelector {\n if (metaTag.name) {\n return `${NAME_KEY}=\"${metaTag.name}\"`;\n }\n\n if (metaTag.property) {\n return `${PROPERTY_KEY}=\"${metaTag.property}\"`;\n }\n\n if (metaTag.httpEquiv) {\n return `${HTTP_EQUIV_SELECTOR_KEY}=\"${metaTag.httpEquiv}\"`;\n }\n\n return CHARSET_KEY;\n}\n", "export const ANALOG_META_KEY = Symbol(\n '@analogjs/router Analog Route Metadata Key'\n);\n\nexport const PAGE_ENDPOINTS = import.meta.glob([\n '/src/app/pages/**/*.server.ts',\n]);\n", "import { inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Route } from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\n\nimport { RedirectRouteMeta, RouteConfig, RouteMeta } from './models';\nimport { ROUTE_META_TAGS_KEY } from './meta-tags';\nimport { PAGE_ENDPOINTS, ANALOG_META_KEY } from './endpoints';\n\nexport function toRouteConfig(routeMeta: RouteMeta | undefined): RouteConfig {\n if (routeMeta && isRedirectRouteMeta(routeMeta)) {\n return routeMeta;\n }\n\n let { meta, ...routeConfig } = routeMeta ?? {};\n\n if (Array.isArray(meta)) {\n routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };\n } else if (typeof meta === 'function') {\n routeConfig.resolve = {\n ...routeConfig.resolve,\n [ROUTE_META_TAGS_KEY]: meta,\n };\n }\n\n if (!routeConfig) {\n routeConfig = {};\n }\n\n routeConfig.resolve = {\n ...routeConfig.resolve,\n load: async (route) => {\n const routeConfig = route.routeConfig as Route & {\n [ANALOG_META_KEY]: { endpoint: string; endpointKey: string };\n };\n\n if (PAGE_ENDPOINTS[routeConfig[ANALOG_META_KEY].endpointKey]) {\n const { queryParams, fragment: hash, params, parent } = route;\n const segment =\n parent?.url.map((segment) => segment.path).join('/') || '';\n const url = new URL('', import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL']);\n url.pathname = `${\n url.pathname.endsWith('/') ? url.pathname : url.pathname + '/'\n }api/_analog${routeConfig[ANALOG_META_KEY].endpoint}`;\n url.search = `${new URLSearchParams(queryParams).toString()}`;\n url.hash = hash ?? '';\n\n Object.keys(params).forEach((param) => {\n url.pathname = url.pathname.replace(`[${param}]`, params[param]);\n });\n url.pathname = url.pathname.replace('**', segment);\n\n if ((globalThis as any).$fetch) {\n return (globalThis as any).$fetch(url.pathname);\n }\n\n const http = inject(HttpClient);\n return firstValueFrom(http.get(`${url.href}`));\n }\n\n return {};\n },\n };\n\n return routeConfig;\n}\n\nfunction isRedirectRouteMeta(\n routeMeta: RouteMeta\n): routeMeta is RedirectRouteMeta {\n return !!routeMeta.redirectTo;\n}\n", "import { inject } from '@angular/core';\nimport { RouteExport } from './models';\n\ndeclare const Zone: any;\n\n// The Zone is currently enabled by default, so we wouldn't need this check.\n// However, leaving this open space will be useful if zone.js becomes optional\n// in the future. This means we won't have to modify the current code, and it will\n// continue to work seamlessly.\nconst isNgZoneEnabled = typeof Zone !== 'undefined' && !!Zone.root;\n\nexport function toMarkdownModule(\n markdownFileFactory: () => Promise<string>\n): () => Promise<RouteExport> {\n return async () => {\n const createLoader = () =>\n Promise.all([import('@analogjs/content'), markdownFileFactory()]);\n\n const [\n { parseRawContentFile, MarkdownRouteComponent, ContentRenderer },\n markdownFile,\n ]: [typeof import('@analogjs/content'), string] = await (isNgZoneEnabled\n ? // We are not able to use `runOutsideAngular` because we are not inside\n // an injection context to retrieve the `NgZone` instance.\n // The `Zone.root.run` is required when the code is running in the\n // browser since asynchronous tasks being scheduled in the current context\n // are a reason for unnecessary change detection cycles.\n Zone.root.run(createLoader)\n : createLoader());\n\n const { content, attributes } = parseRawContentFile(markdownFile);\n const { title, meta } = attributes;\n\n return {\n default: MarkdownRouteComponent,\n routeMeta: {\n data: { _analogContent: content },\n title,\n meta,\n resolve: {\n renderedAnalogContent: async () => {\n const contentRenderer = inject(ContentRenderer);\n return contentRenderer.render(content);\n },\n },\n },\n };\n };\n}\n", "export const ENDPOINT_EXTENSION = '.server.ts';\nexport const APP_DIR = 'src/app';\n", "/// <reference types=\"vite/client\" />\n\nimport type { Route } from '@angular/router';\n\nimport type { RouteExport, RouteMeta } from './models';\nimport { toRouteConfig } from './route-config';\nimport { toMarkdownModule } from './markdown-helpers';\nimport { APP_DIR, ENDPOINT_EXTENSION } from './constants';\nimport { ANALOG_META_KEY } from './endpoints';\n\nconst FILES = import.meta.glob<RouteExport>([\n '/app/routes/**/*.ts',\n '/src/app/routes/**/*.ts',\n '/src/app/pages/**/*.page.ts',\n '/src/app/pages/**/*.page.analog',\n]);\n\nconst CONTENT_FILES = import.meta.glob<string>(\n ['/src/app/routes/**/*.md', '/src/app/pages/**/*.md'],\n { query: '?raw', import: 'default' }\n);\n\nexport type Files = Record<string, () => Promise<RouteExport | string>>;\n\ntype RawRoute = {\n filename: string | null;\n rawSegment: string;\n ancestorRawSegments: string[];\n segment: string;\n level: number;\n children: RawRoute[];\n};\n\ntype RawRouteMap = Record<string, RawRoute>;\n\ntype RawRouteByLevelMap = Record<number, RawRouteMap>;\n\n/**\n * A function used to parse list of files and create configuration of routes.\n *\n * @param files\n * @returns Array of routes\n */\nexport function createRoutes(files: Files): Route[] {\n const filenames = Object.keys(files);\n\n if (filenames.length === 0) {\n return [];\n }\n\n // map filenames to raw routes and group them by level\n const rawRoutesByLevelMap = filenames.reduce((acc, filename) => {\n const rawPath = toRawPath(filename);\n const rawSegments = rawPath.split('/');\n // nesting level starts at 0\n // rawPath: /products => level: 0\n // rawPath: /products/:id => level: 1\n const level = rawSegments.length - 1;\n const rawSegment = rawSegments[level];\n const ancestorRawSegments = rawSegments.slice(0, level);\n\n return {\n ...acc,\n [level]: {\n ...acc[level],\n [rawPath]: {\n filename,\n rawSegment,\n ancestorRawSegments,\n segment: toSegment(rawSegment),\n level,\n children: [],\n },\n },\n };\n }, {} as RawRouteByLevelMap);\n\n const allLevels = Object.keys(rawRoutesByLevelMap).map(Number);\n const maxLevel = Math.max(...allLevels);\n\n // add each raw route to its parent's children array\n for (let level = maxLevel; level > 0; level--) {\n const rawRoutesMap = rawRoutesByLevelMap[level];\n const rawPaths = Object.keys(rawRoutesMap);\n\n for (const rawPath of rawPaths) {\n const rawRoute = rawRoutesMap[rawPath];\n const parentRawPath = rawRoute.ancestorRawSegments.join('/');\n const parentRawSegmentIndex = rawRoute.ancestorRawSegments.length - 1;\n const parentRawSegment =\n rawRoute.ancestorRawSegments[parentRawSegmentIndex];\n\n // create the parent level and/or raw route if it does not exist\n // parent route won't exist for nested routes that don't have a layout route\n rawRoutesByLevelMap[level - 1] ||= {};\n rawRoutesByLevelMap[level - 1][parentRawPath] ||= {\n filename: null,\n rawSegment: parentRawSegment,\n ancestorRawSegments: rawRoute.ancestorRawSegments.slice(\n 0,\n parentRawSegmentIndex\n ),\n segment: toSegment(parentRawSegment),\n level: level - 1,\n children: [],\n };\n\n rawRoutesByLevelMap[level - 1][parentRawPath].children.push(rawRoute);\n }\n }\n\n // only take raw routes from the root level\n // since they already contain nested routes as their children\n const rootRawRoutesMap = rawRoutesByLevelMap[0];\n const rawRoutes = Object.keys(rootRawRoutesMap).map(\n (segment) => rootRawRoutesMap[segment]\n );\n sortRawRoutes(rawRoutes);\n\n return toRoutes(rawRoutes, files);\n}\n\nfunction toRawPath(filename: string): string {\n return filename\n .replace(\n // convert to relative path and remove file extension\n /^\\/(.*?)\\/routes\\/|^\\/(.*?)\\/pages\\/|\\/app\\/routes\\/|(\\.page\\.(js|ts|analog)$)|(\\.(ts|md|analog)$)/g,\n ''\n )\n .replace(/\\[\\.{3}.+\\]/, '**') // [...not-found] => **\n .replace(/\\[([^\\]]+)\\]/g, ':$1'); // [id] => :id\n}\n\nfunction toSegment(rawSegment: string): string {\n return rawSegment\n .replace(/index|\\(.*?\\)/g, '') // replace named empty segments\n .replace(/\\.|\\/+/g, '/') // replace dots with slashes and remove redundant slashes\n .replace(/^\\/+|\\/+$/g, ''); // remove trailing slashes\n}\n\nfunction toRoutes(rawRoutes: RawRoute[], files: Files): Route[] {\n const routes: Route[] = [];\n\n for (const rawRoute of rawRoutes) {\n const children: Route[] | undefined =\n rawRoute.children.length > 0\n ? toRoutes(rawRoute.children, files)\n : undefined;\n let module: (() => Promise<RouteExport>) | undefined = undefined;\n let analogMeta: { endpoint: string; endpointKey: string } | undefined =\n undefined;\n\n if (rawRoute.filename) {\n const isMarkdownFile = rawRoute.filename.endsWith('.md');\n module = isMarkdownFile\n ? toMarkdownModule(files[rawRoute.filename] as () => Promise<string>)\n : (files[rawRoute.filename] as () => Promise<RouteExport>);\n\n const endpointKey = rawRoute.filename.replace(\n /\\.page\\.(ts|analog)$/,\n ENDPOINT_EXTENSION\n );\n\n // get endpoint path\n const rawEndpoint = rawRoute.filename\n .replace(/\\.page\\.(ts|analog)$/, '')\n .replace(/\\[\\.{3}.+\\]/, '**') // [...not-found] => **\n .split(APP_DIR)[1];\n\n // replace periods, remove (index) paths\n const endpoint = (rawEndpoint || '')\n .replace(/\\./g, '/')\n .replace(/\\/\\((.*?)\\)$/, '/-$1-');\n\n analogMeta = {\n endpoint,\n endpointKey,\n };\n }\n\n const route: Route & { meta?: typeof analogMeta } = module\n ? {\n path: rawRoute.segment,\n loadChildren: () =>\n module!().then((m) => [\n {\n path: '',\n component: m.default,\n ...toRouteConfig(m.routeMeta as RouteMeta | undefined),\n children,\n [ANALOG_META_KEY]: analogMeta,\n },\n ]),\n }\n : { path: rawRoute.segment, children };\n\n routes.push(route);\n }\n\n return routes;\n}\n\nfunction sortRawRoutes(rawRoutes: RawRoute[]): void {\n rawRoutes.sort((a, b) => {\n let segmentA = deprioritizeSegment(a.segment);\n let segmentB = deprioritizeSegment(b.segment);\n\n // prioritize routes with fewer children\n if (a.children.length > b.children.length) {\n segmentA = `~${segmentA}`;\n } else if (a.children.length < b.children.length) {\n segmentB = `~${segmentB}`;\n }\n\n return segmentA > segmentB ? 1 : -1;\n });\n\n for (const rawRoute of rawRoutes) {\n sortRawRoutes(rawRoute.children);\n }\n}\n\nfunction deprioritizeSegment(segment: string): string {\n // deprioritize param and wildcard segments\n return segment.replace(':', '~~').replace('**', '~~~~');\n}\n\nexport const routes: Route[] = createRoutes({ ...FILES, ...CONTENT_FILES });\n", "import { inject } from '@angular/core';\nimport { Route as NgRoute, Router } from '@angular/router';\nimport { ActivatedRoute } from '@angular/router';\n\ntype RouteOmitted =\n | 'component'\n | 'loadComponent'\n | 'loadChildren'\n | 'path'\n | 'pathMatch';\n\ntype RestrictedRoute = Omit<NgRoute, RouteOmitted>;\n\n/**\n * @deprecated Use `RouteMeta` type instead.\n * For more info see: https://github.com/analogjs/analog/issues/223\n *\n * Defines additional route config metadata. This\n * object is merged into the route config with\n * the predefined file-based route.\n *\n * @usageNotes\n *\n * ```\n * import { Component } from '@angular/core';\n * import { defineRouteMeta } from '@analogjs/router';\n *\n * export const routeMeta = defineRouteMeta({\n * title: 'Welcome'\n * });\n *\n * @Component({\n * template: `Home`,\n * standalone: true,\n * })\n * export default class HomeComponent {}\n * ```\n *\n * @param route\n * @returns\n */\nexport const defineRouteMeta = (route: RestrictedRoute) => {\n return route;\n};\n\n/**\n * Returns the instance of Angular Router\n *\n * @returns The router\n */\nexport const injectRouter = () => {\n return inject(Router);\n};\n\n/**\n * Returns the instance of the Activate Route for the component\n *\n * @returns The activated route\n */\nexport const injectActivatedRoute = () => {\n return inject(ActivatedRoute);\n};\n", "import {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n makeEnvironmentProviders,\n Provider,\n} from '@angular/core';\nimport { provideRouter, RouterFeatures } from '@angular/router';\n\nimport { routes } from './routes';\nimport { updateMetaTagsOnRouteChange } from './meta-tags';\n\n/**\n * Sets up providers for the Angular router, and registers\n * file-based routes. Additional features can be provided\n * to further configure the behavior of the router.\n *\n * @param features\n * @returns Providers and features to configure the router with routes\n */\nexport function provideFileRouter(\n ...features: RouterFeatures[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n // TODO: remove type casting after Angular >=15.1.1 upgrade\n // https://github.com/angular/angular/pull/48720\n (\n provideRouter(routes, ...features) as unknown as {\n ɵproviders: Provider[];\n }\n ).ɵproviders,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => updateMetaTagsOnRouteChange(),\n },\n ]);\n}\n", "import { Injector, inject } from '@angular/core';\nimport { ActivatedRoute, Data } from '@angular/router';\nimport { Observable, map } from 'rxjs';\n\nimport { PageServerLoad } from './route-types';\n\nexport function injectLoad<\n T extends (pageServerLoad: PageServerLoad) => Promise<any>\n>(options?: { injector?: Injector }): Observable<Awaited<ReturnType<T>>> {\n const injector = options?.injector ?? inject(Injector);\n const route = injector.get(ActivatedRoute);\n\n return route.data.pipe(\n map<Data, Awaited<ReturnType<T>>>((data) => data['load'])\n );\n}\n"],
5
- "mappings": "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",
6
- "names": ["inject", "routeConfig", "segment", "inject", "routes", "inject", "Router", "inject", "ActivatedRoute"]
7
- }
1
+ {"version":3,"file":"analogjs-router.mjs","sources":["../../../../packages/router/src/lib/meta-tags.ts","../../../../packages/router/src/lib/endpoints.ts","../../../../packages/router/src/lib/route-config.ts","../../../../packages/router/src/lib/markdown-helpers.ts","../../../../packages/router/src/lib/constants.ts","../../../../packages/router/src/lib/routes.ts","../../../../packages/router/src/lib/define-route.ts","../../../../packages/router/src/lib/provide-file-router.ts","../../../../packages/router/src/lib/inject-load.ts","../../../../packages/router/src/analogjs-router.ts"],"sourcesContent":["import { inject } from '@angular/core';\nimport { Meta, MetaDefinition as NgMetaTag } from '@angular/platform-browser';\nimport { ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\nexport const ROUTE_META_TAGS_KEY = Symbol(\n '@analogjs/router Route Meta Tags Key'\n);\n\nconst CHARSET_KEY = 'charset';\nconst HTTP_EQUIV_KEY = 'httpEquiv';\n// httpEquiv selector key needs to be in kebab case format\nconst HTTP_EQUIV_SELECTOR_KEY = 'http-equiv';\nconst NAME_KEY = 'name';\nconst PROPERTY_KEY = 'property';\nconst CONTENT_KEY = 'content';\n\nexport type MetaTag =\n | (CharsetMetaTag & ExcludeRestMetaTagKeys<typeof CHARSET_KEY>)\n | (HttpEquivMetaTag & ExcludeRestMetaTagKeys<typeof HTTP_EQUIV_KEY>)\n | (NameMetaTag & ExcludeRestMetaTagKeys<typeof NAME_KEY>)\n | (PropertyMetaTag & ExcludeRestMetaTagKeys<typeof PROPERTY_KEY>);\n\ntype CharsetMetaTag = { [CHARSET_KEY]: string };\ntype HttpEquivMetaTag = { [HTTP_EQUIV_KEY]: string; [CONTENT_KEY]: string };\ntype NameMetaTag = { [NAME_KEY]: string; [CONTENT_KEY]: string };\ntype PropertyMetaTag = { [PROPERTY_KEY]: string; [CONTENT_KEY]: string };\n\ntype MetaTagKey =\n | typeof CHARSET_KEY\n | typeof HTTP_EQUIV_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY;\ntype ExcludeRestMetaTagKeys<Key extends MetaTagKey> = {\n [K in Exclude<MetaTagKey, Key>]?: never;\n};\n\ntype MetaTagSelector =\n | typeof CHARSET_KEY\n | `${\n | typeof HTTP_EQUIV_SELECTOR_KEY\n | typeof NAME_KEY\n | typeof PROPERTY_KEY}=\"${string}\"`;\ntype MetaTagMap = Record<MetaTagSelector, MetaTag>;\n\nexport function updateMetaTagsOnRouteChange(): void {\n const router = inject(Router);\n const metaService = inject(Meta);\n\n router.events\n .pipe(filter((event) => event instanceof NavigationEnd))\n .subscribe(() => {\n const metaTagMap = getMetaTagMap(router.routerState.snapshot.root);\n\n for (const metaTagSelector in metaTagMap) {\n const metaTag = metaTagMap[\n metaTagSelector as MetaTagSelector\n ] as NgMetaTag;\n metaService.updateTag(metaTag, metaTagSelector);\n }\n });\n}\n\nfunction getMetaTagMap(route: ActivatedRouteSnapshot): MetaTagMap {\n const metaTagMap = {} as MetaTagMap;\n let currentRoute: ActivatedRouteSnapshot | null = route;\n\n while (currentRoute) {\n const metaTags: MetaTag[] = currentRoute.data[ROUTE_META_TAGS_KEY] ?? [];\n for (const metaTag of metaTags) {\n metaTagMap[getMetaTagSelector(metaTag)] = metaTag;\n }\n\n currentRoute = currentRoute.firstChild;\n }\n\n return metaTagMap;\n}\n\nfunction getMetaTagSelector(metaTag: MetaTag): MetaTagSelector {\n if (metaTag.name) {\n return `${NAME_KEY}=\"${metaTag.name}\"`;\n }\n\n if (metaTag.property) {\n return `${PROPERTY_KEY}=\"${metaTag.property}\"`;\n }\n\n if (metaTag.httpEquiv) {\n return `${HTTP_EQUIV_SELECTOR_KEY}=\"${metaTag.httpEquiv}\"`;\n }\n\n return CHARSET_KEY;\n}\n","export const ANALOG_META_KEY = Symbol(\n '@analogjs/router Analog Route Metadata Key'\n);\n\nexport const PAGE_ENDPOINTS = import.meta.glob([\n '/src/app/pages/**/*.server.ts',\n]);\n","import { inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Route } from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\n\nimport { RedirectRouteMeta, RouteConfig, RouteMeta } from './models';\nimport { ROUTE_META_TAGS_KEY } from './meta-tags';\nimport { PAGE_ENDPOINTS, ANALOG_META_KEY } from './endpoints';\n\nexport function toRouteConfig(routeMeta: RouteMeta | undefined): RouteConfig {\n if (routeMeta && isRedirectRouteMeta(routeMeta)) {\n return routeMeta;\n }\n\n let { meta, ...routeConfig } = routeMeta ?? {};\n\n if (Array.isArray(meta)) {\n routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };\n } else if (typeof meta === 'function') {\n routeConfig.resolve = {\n ...routeConfig.resolve,\n [ROUTE_META_TAGS_KEY]: meta,\n };\n }\n\n if (!routeConfig) {\n routeConfig = {};\n }\n\n routeConfig.resolve = {\n ...routeConfig.resolve,\n load: async (route) => {\n const routeConfig = route.routeConfig as Route & {\n [ANALOG_META_KEY]: { endpoint: string; endpointKey: string };\n };\n\n if (PAGE_ENDPOINTS[routeConfig[ANALOG_META_KEY].endpointKey]) {\n const { queryParams, fragment: hash, params, parent } = route;\n const segment =\n parent?.url.map((segment) => segment.path).join('/') || '';\n const url = new URL('', import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL']);\n url.pathname = `${\n url.pathname.endsWith('/') ? url.pathname : url.pathname + '/'\n }api/_analog${routeConfig[ANALOG_META_KEY].endpoint}`;\n url.search = `${new URLSearchParams(queryParams).toString()}`;\n url.hash = hash ?? '';\n\n Object.keys(params).forEach((param) => {\n url.pathname = url.pathname.replace(`[${param}]`, params[param]);\n });\n url.pathname = url.pathname.replace('**', segment);\n\n if ((globalThis as any).$fetch) {\n return (globalThis as any).$fetch(url.pathname);\n }\n\n const http = inject(HttpClient);\n return firstValueFrom(http.get(`${url.href}`));\n }\n\n return {};\n },\n };\n\n return routeConfig;\n}\n\nfunction isRedirectRouteMeta(\n routeMeta: RouteMeta\n): routeMeta is RedirectRouteMeta {\n return !!routeMeta.redirectTo;\n}\n","import { inject } from '@angular/core';\nimport { RouteExport } from './models';\n\ndeclare const Zone: any;\n\n// The Zone is currently enabled by default, so we wouldn't need this check.\n// However, leaving this open space will be useful if zone.js becomes optional\n// in the future. This means we won't have to modify the current code, and it will\n// continue to work seamlessly.\nconst isNgZoneEnabled = typeof Zone !== 'undefined' && !!Zone.root;\n\nexport function toMarkdownModule(\n markdownFileFactory: () => Promise<string>\n): () => Promise<RouteExport> {\n return async () => {\n const createLoader = () =>\n Promise.all([import('@analogjs/content'), markdownFileFactory()]);\n\n const [\n { parseRawContentFile, MarkdownRouteComponent, ContentRenderer },\n markdownFile,\n ]: [typeof import('@analogjs/content'), string] = await (isNgZoneEnabled\n ? // We are not able to use `runOutsideAngular` because we are not inside\n // an injection context to retrieve the `NgZone` instance.\n // The `Zone.root.run` is required when the code is running in the\n // browser since asynchronous tasks being scheduled in the current context\n // are a reason for unnecessary change detection cycles.\n Zone.root.run(createLoader)\n : createLoader());\n\n const { content, attributes } = parseRawContentFile(markdownFile);\n const { title, meta } = attributes;\n\n return {\n default: MarkdownRouteComponent,\n routeMeta: {\n data: { _analogContent: content },\n title,\n meta,\n resolve: {\n renderedAnalogContent: async () => {\n const contentRenderer = inject(ContentRenderer);\n return contentRenderer.render(content);\n },\n },\n },\n };\n };\n}\n","export const ENDPOINT_EXTENSION = '.server.ts';\nexport const APP_DIR = 'src/app';\n","/// <reference types=\"vite/client\" />\n\nimport type { Route } from '@angular/router';\n\nimport type { RouteExport, RouteMeta } from './models';\nimport { toRouteConfig } from './route-config';\nimport { toMarkdownModule } from './markdown-helpers';\nimport { APP_DIR, ENDPOINT_EXTENSION } from './constants';\nimport { ANALOG_META_KEY } from './endpoints';\n\nconst FILES = import.meta.glob<RouteExport>([\n '/app/routes/**/*.ts',\n '/src/app/routes/**/*.ts',\n '/src/app/pages/**/*.page.ts',\n '/src/app/pages/**/*.page.analog',\n]);\n\nconst CONTENT_FILES = import.meta.glob<string>(\n ['/src/app/routes/**/*.md', '/src/app/pages/**/*.md'],\n { query: '?raw', import: 'default' }\n);\n\nexport type Files = Record<string, () => Promise<RouteExport | string>>;\n\ntype RawRoute = {\n filename: string | null;\n rawSegment: string;\n ancestorRawSegments: string[];\n segment: string;\n level: number;\n children: RawRoute[];\n};\n\ntype RawRouteMap = Record<string, RawRoute>;\n\ntype RawRouteByLevelMap = Record<number, RawRouteMap>;\n\n/**\n * A function used to parse list of files and create configuration of routes.\n *\n * @param files\n * @returns Array of routes\n */\nexport function createRoutes(files: Files): Route[] {\n const filenames = Object.keys(files);\n\n if (filenames.length === 0) {\n return [];\n }\n\n // map filenames to raw routes and group them by level\n const rawRoutesByLevelMap = filenames.reduce((acc, filename) => {\n const rawPath = toRawPath(filename);\n const rawSegments = rawPath.split('/');\n // nesting level starts at 0\n // rawPath: /products => level: 0\n // rawPath: /products/:id => level: 1\n const level = rawSegments.length - 1;\n const rawSegment = rawSegments[level];\n const ancestorRawSegments = rawSegments.slice(0, level);\n\n return {\n ...acc,\n [level]: {\n ...acc[level],\n [rawPath]: {\n filename,\n rawSegment,\n ancestorRawSegments,\n segment: toSegment(rawSegment),\n level,\n children: [],\n },\n },\n };\n }, {} as RawRouteByLevelMap);\n\n const allLevels = Object.keys(rawRoutesByLevelMap).map(Number);\n const maxLevel = Math.max(...allLevels);\n\n // add each raw route to its parent's children array\n for (let level = maxLevel; level > 0; level--) {\n const rawRoutesMap = rawRoutesByLevelMap[level];\n const rawPaths = Object.keys(rawRoutesMap);\n\n for (const rawPath of rawPaths) {\n const rawRoute = rawRoutesMap[rawPath];\n const parentRawPath = rawRoute.ancestorRawSegments.join('/');\n const parentRawSegmentIndex = rawRoute.ancestorRawSegments.length - 1;\n const parentRawSegment =\n rawRoute.ancestorRawSegments[parentRawSegmentIndex];\n\n // create the parent level and/or raw route if it does not exist\n // parent route won't exist for nested routes that don't have a layout route\n rawRoutesByLevelMap[level - 1] ||= {};\n rawRoutesByLevelMap[level - 1][parentRawPath] ||= {\n filename: null,\n rawSegment: parentRawSegment,\n ancestorRawSegments: rawRoute.ancestorRawSegments.slice(\n 0,\n parentRawSegmentIndex\n ),\n segment: toSegment(parentRawSegment),\n level: level - 1,\n children: [],\n };\n\n rawRoutesByLevelMap[level - 1][parentRawPath].children.push(rawRoute);\n }\n }\n\n // only take raw routes from the root level\n // since they already contain nested routes as their children\n const rootRawRoutesMap = rawRoutesByLevelMap[0];\n const rawRoutes = Object.keys(rootRawRoutesMap).map(\n (segment) => rootRawRoutesMap[segment]\n );\n sortRawRoutes(rawRoutes);\n\n return toRoutes(rawRoutes, files);\n}\n\nfunction toRawPath(filename: string): string {\n return filename\n .replace(\n // convert to relative path and remove file extension\n /^\\/(.*?)\\/routes\\/|^\\/(.*?)\\/pages\\/|\\/app\\/routes\\/|(\\.page\\.(js|ts|analog)$)|(\\.(ts|md|analog)$)/g,\n ''\n )\n .replace(/\\[\\.{3}.+\\]/, '**') // [...not-found] => **\n .replace(/\\[([^\\]]+)\\]/g, ':$1'); // [id] => :id\n}\n\nfunction toSegment(rawSegment: string): string {\n return rawSegment\n .replace(/index|\\(.*?\\)/g, '') // replace named empty segments\n .replace(/\\.|\\/+/g, '/') // replace dots with slashes and remove redundant slashes\n .replace(/^\\/+|\\/+$/g, ''); // remove trailing slashes\n}\n\nfunction toRoutes(rawRoutes: RawRoute[], files: Files): Route[] {\n const routes: Route[] = [];\n\n for (const rawRoute of rawRoutes) {\n const children: Route[] | undefined =\n rawRoute.children.length > 0\n ? toRoutes(rawRoute.children, files)\n : undefined;\n let module: (() => Promise<RouteExport>) | undefined = undefined;\n let analogMeta: { endpoint: string; endpointKey: string } | undefined =\n undefined;\n\n if (rawRoute.filename) {\n const isMarkdownFile = rawRoute.filename.endsWith('.md');\n module = isMarkdownFile\n ? toMarkdownModule(files[rawRoute.filename] as () => Promise<string>)\n : (files[rawRoute.filename] as () => Promise<RouteExport>);\n\n const endpointKey = rawRoute.filename.replace(\n /\\.page\\.(ts|analog)$/,\n ENDPOINT_EXTENSION\n );\n\n // get endpoint path\n const rawEndpoint = rawRoute.filename\n .replace(/\\.page\\.(ts|analog)$/, '')\n .replace(/\\[\\.{3}.+\\]/, '**') // [...not-found] => **\n .split(APP_DIR)[1];\n\n // replace periods, remove (index) paths\n const endpoint = (rawEndpoint || '')\n .replace(/\\./g, '/')\n .replace(/\\/\\((.*?)\\)$/, '/-$1-');\n\n analogMeta = {\n endpoint,\n endpointKey,\n };\n }\n\n const route: Route & { meta?: typeof analogMeta } = module\n ? {\n path: rawRoute.segment,\n loadChildren: () =>\n module!().then((m) => [\n {\n path: '',\n component: m.default,\n ...toRouteConfig(m.routeMeta as RouteMeta | undefined),\n children,\n [ANALOG_META_KEY]: analogMeta,\n },\n ]),\n }\n : { path: rawRoute.segment, children };\n\n routes.push(route);\n }\n\n return routes;\n}\n\nfunction sortRawRoutes(rawRoutes: RawRoute[]): void {\n rawRoutes.sort((a, b) => {\n let segmentA = deprioritizeSegment(a.segment);\n let segmentB = deprioritizeSegment(b.segment);\n\n // prioritize routes with fewer children\n if (a.children.length > b.children.length) {\n segmentA = `~${segmentA}`;\n } else if (a.children.length < b.children.length) {\n segmentB = `~${segmentB}`;\n }\n\n return segmentA > segmentB ? 1 : -1;\n });\n\n for (const rawRoute of rawRoutes) {\n sortRawRoutes(rawRoute.children);\n }\n}\n\nfunction deprioritizeSegment(segment: string): string {\n // deprioritize param and wildcard segments\n return segment.replace(':', '~~').replace('**', '~~~~');\n}\n\nexport const routes: Route[] = createRoutes({ ...FILES, ...CONTENT_FILES });\n","import { inject } from '@angular/core';\nimport { Route as NgRoute, Router } from '@angular/router';\nimport { ActivatedRoute } from '@angular/router';\n\ntype RouteOmitted =\n | 'component'\n | 'loadComponent'\n | 'loadChildren'\n | 'path'\n | 'pathMatch';\n\ntype RestrictedRoute = Omit<NgRoute, RouteOmitted>;\n\n/**\n * @deprecated Use `RouteMeta` type instead.\n * For more info see: https://github.com/analogjs/analog/issues/223\n *\n * Defines additional route config metadata. This\n * object is merged into the route config with\n * the predefined file-based route.\n *\n * @usageNotes\n *\n * ```\n * import { Component } from '@angular/core';\n * import { defineRouteMeta } from '@analogjs/router';\n *\n * export const routeMeta = defineRouteMeta({\n * title: 'Welcome'\n * });\n *\n * @Component({\n * template: `Home`,\n * standalone: true,\n * })\n * export default class HomeComponent {}\n * ```\n *\n * @param route\n * @returns\n */\nexport const defineRouteMeta = (route: RestrictedRoute) => {\n return route;\n};\n\n/**\n * Returns the instance of Angular Router\n *\n * @returns The router\n */\nexport const injectRouter = () => {\n return inject(Router);\n};\n\n/**\n * Returns the instance of the Activate Route for the component\n *\n * @returns The activated route\n */\nexport const injectActivatedRoute = () => {\n return inject(ActivatedRoute);\n};\n","import {\n ENVIRONMENT_INITIALIZER,\n EnvironmentProviders,\n makeEnvironmentProviders,\n Provider,\n} from '@angular/core';\nimport { provideRouter, RouterFeatures } from '@angular/router';\n\nimport { routes } from './routes';\nimport { updateMetaTagsOnRouteChange } from './meta-tags';\n\n/**\n * Sets up providers for the Angular router, and registers\n * file-based routes. Additional features can be provided\n * to further configure the behavior of the router.\n *\n * @param features\n * @returns Providers and features to configure the router with routes\n */\nexport function provideFileRouter(\n ...features: RouterFeatures[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n // TODO: remove type casting after Angular >=15.1.1 upgrade\n // https://github.com/angular/angular/pull/48720\n (\n provideRouter(routes, ...features) as unknown as {\n ɵproviders: Provider[];\n }\n ).ɵproviders,\n {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useValue: () => updateMetaTagsOnRouteChange(),\n },\n ]);\n}\n","import { Injector, inject } from '@angular/core';\nimport { ActivatedRoute, Data } from '@angular/router';\nimport { Observable, map } from 'rxjs';\n\nimport { PageServerLoad } from './route-types';\n\nexport function injectLoad<\n T extends (pageServerLoad: PageServerLoad) => Promise<any>\n>(options?: { injector?: Injector }): Observable<Awaited<ReturnType<T>>> {\n const injector = options?.injector ?? inject(Injector);\n const route = injector.get(ActivatedRoute);\n\n return route.data.pipe(\n map<Data, Awaited<ReturnType<T>>>((data) => data['load'])\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/router",
3
- "version": "1.4.0-beta.1",
3
+ "version": "1.4.0-beta.10",
4
4
  "description": "Filesystem-based routing for Angular",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -20,24 +20,24 @@
20
20
  "url": "https://github.com/analogjs/analog.git"
21
21
  },
22
22
  "peerDependencies": {
23
- "@angular/core": ">=15.0.0 || ^18.0.0-rc.0",
24
- "@angular/router": ">=15.0.0 || ^18.0.0-rc.0"
23
+ "@angular/core": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
24
+ "@angular/router": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
25
25
  },
26
26
  "optionalDependencies": {
27
- "@analogjs/content": "^1.4.0-beta.1"
27
+ "@analogjs/content": "^1.4.0-beta.10"
28
28
  },
29
29
  "dependencies": {
30
30
  "tslib": "^2.0.0"
31
31
  },
32
32
  "ng-update": {
33
33
  "packageGroup": [
34
- "@analogjs/astro-angular",
35
34
  "@analogjs/platform",
36
35
  "@analogjs/content",
37
36
  "@analogjs/router",
38
37
  "@analogjs/trpc",
39
38
  "@analogjs/vite-plugin-angular",
40
- "@analogjs/vite-plugin-nitro"
39
+ "@analogjs/vite-plugin-nitro",
40
+ "@analogjs/vitest-angular"
41
41
  ],
42
42
  "migrations": "./migrations/migration.json"
43
43
  },