@analogjs/router 0.2.0-beta.15 → 0.2.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm2022/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  export { routes } from './lib/routes';
2
2
  export { defineRouteMeta, injectActivatedRoute, injectRouter, } from './lib/define-route';
3
3
  export { provideFileRouter } from './lib/provide-file-router';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9yb3V0ZXIvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUNMLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyByb3V0ZXMgfSBmcm9tICcuL2xpYi9yb3V0ZXMnO1xuZXhwb3J0IHtcbiAgZGVmaW5lUm91dGVNZXRhLFxuICBpbmplY3RBY3RpdmF0ZWRSb3V0ZSxcbiAgaW5qZWN0Um91dGVyLFxufSBmcm9tICcuL2xpYi9kZWZpbmUtcm91dGUnO1xuZXhwb3J0IHsgUm91dGVNZXRhIH0gZnJvbSAnLi9saWIvbW9kZWxzJztcbmV4cG9ydCB7IHByb3ZpZGVGaWxlUm91dGVyIH0gZnJvbSAnLi9saWIvcHJvdmlkZS1maWxlLXJvdXRlcic7XG5leHBvcnQgeyBNZXRhVGFnIH0gZnJvbSAnLi9saWIvbWV0YS10YWdzJztcbiJdfQ==
4
+ export { injectLoad } from './lib/inject-load';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9yb3V0ZXIvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUNMLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgcm91dGVzIH0gZnJvbSAnLi9saWIvcm91dGVzJztcbmV4cG9ydCB7XG4gIGRlZmluZVJvdXRlTWV0YSxcbiAgaW5qZWN0QWN0aXZhdGVkUm91dGUsXG4gIGluamVjdFJvdXRlcixcbn0gZnJvbSAnLi9saWIvZGVmaW5lLXJvdXRlJztcbmV4cG9ydCB7IFJvdXRlTWV0YSB9IGZyb20gJy4vbGliL21vZGVscyc7XG5leHBvcnQgeyBwcm92aWRlRmlsZVJvdXRlciB9IGZyb20gJy4vbGliL3Byb3ZpZGUtZmlsZS1yb3V0ZXInO1xuZXhwb3J0IHsgTWV0YVRhZyB9IGZyb20gJy4vbGliL21ldGEtdGFncyc7XG5leHBvcnQgeyBQYWdlU2VydmVyTG9hZCwgTG9hZFJlc3VsdCB9IGZyb20gJy4vbGliL3JvdXRlLXR5cGVzJztcbmV4cG9ydCB7IGluamVjdExvYWQgfSBmcm9tICcuL2xpYi9pbmplY3QtbG9hZCc7XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export const ENDPOINT_EXTENSION = '.server.ts';
2
+ export const APP_DIR = 'src/app';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL3NyYy9saWIvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEVORFBPSU5UX0VYVEVOU0lPTiA9ICcuc2VydmVyLnRzJztcbmV4cG9ydCBjb25zdCBBUFBfRElSID0gJ3NyYy9hcHAnO1xuIl19
@@ -0,0 +1,5 @@
1
+ export const ANALOG_META_KEY = Symbol('@analogjs/router Analog Route Metadata Key');
2
+ export const PAGE_ENDPOINTS = import.meta.glob([
3
+ '/src/app/pages/**/*.server.ts',
4
+ ]);
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL3NyYy9saWIvZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQ25DLDRDQUE0QyxDQUM3QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzdDLCtCQUErQjtDQUNoQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQU5BTE9HX01FVEFfS0VZID0gU3ltYm9sKFxuICAnQGFuYWxvZ2pzL3JvdXRlciBBbmFsb2cgUm91dGUgTWV0YWRhdGEgS2V5J1xuKTtcblxuZXhwb3J0IGNvbnN0IFBBR0VfRU5EUE9JTlRTID0gaW1wb3J0Lm1ldGEuZ2xvYihbXG4gICcvc3JjL2FwcC9wYWdlcy8qKi8qLnNlcnZlci50cycsXG5dKTtcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { Injector, assertInInjectionContext, inject } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import { map } from 'rxjs';
4
+ export function injectLoad(options) {
5
+ !options?.injector && assertInInjectionContext(injectLoad);
6
+ const injector = options?.injector ?? inject(Injector);
7
+ const route = injector.get(ActivatedRoute);
8
+ return route.data.pipe(map((data) => data['load']));
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0LWxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9yb3V0ZXIvc3JjL2xpYi9pbmplY3QtbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFRLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUl2QyxNQUFNLFVBQVUsVUFBVSxDQUV4QixPQUFpQztJQUNqQyxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFM0QsTUFBTSxRQUFRLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUUzQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNwQixHQUFHLENBQStCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDMUQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBEYXRhIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBQYWdlU2VydmVyTG9hZCB9IGZyb20gJy4vcm91dGUtdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0TG9hZDxcbiAgVCBleHRlbmRzIChwYWdlU2VydmVyTG9hZDogUGFnZVNlcnZlckxvYWQpID0+IFByb21pc2U8YW55PlxuPihvcHRpb25zPzogeyBpbmplY3Rvcj86IEluamVjdG9yIH0pOiBPYnNlcnZhYmxlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4+IHtcbiAgIW9wdGlvbnM/LmluamVjdG9yICYmIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dChpbmplY3RMb2FkKTtcblxuICBjb25zdCBpbmplY3RvciA9IG9wdGlvbnM/LmluamVjdG9yID8/IGluamVjdChJbmplY3Rvcik7XG4gIGNvbnN0IHJvdXRlID0gaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcblxuICByZXR1cm4gcm91dGUuZGF0YS5waXBlKFxuICAgIG1hcDxEYXRhLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+PigoZGF0YSkgPT4gZGF0YVsnbG9hZCddKVxuICApO1xufVxuIl19
@@ -1,12 +1,13 @@
1
+ import { inject } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { firstValueFrom } from 'rxjs';
1
4
  import { ROUTE_META_TAGS_KEY } from './meta-tags';
5
+ import { PAGE_ENDPOINTS, ANALOG_META_KEY } from './endpoints';
2
6
  export function toRouteConfig(routeMeta) {
3
- if (!routeMeta) {
4
- return {};
5
- }
6
- if (isRedirectRouteMeta(routeMeta)) {
7
+ if (routeMeta && isRedirectRouteMeta(routeMeta)) {
7
8
  return routeMeta;
8
9
  }
9
- const { meta, ...routeConfig } = routeMeta;
10
+ let { meta, ...routeConfig } = routeMeta ?? {};
10
11
  if (Array.isArray(meta)) {
11
12
  routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };
12
13
  }
@@ -16,9 +17,34 @@ export function toRouteConfig(routeMeta) {
16
17
  [ROUTE_META_TAGS_KEY]: meta,
17
18
  };
18
19
  }
20
+ if (!routeConfig) {
21
+ routeConfig = {};
22
+ }
23
+ routeConfig.resolve = {
24
+ ...routeConfig.resolve,
25
+ load: async (route) => {
26
+ const routeConfig = route.routeConfig;
27
+ if (PAGE_ENDPOINTS[routeConfig[ANALOG_META_KEY].endpointKey]) {
28
+ const { queryParams, fragment: hash, params } = route;
29
+ const url = new URL('', import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL']);
30
+ url.pathname = `/api/_analog${routeConfig[ANALOG_META_KEY].endpoint}`;
31
+ url.search = `${new URLSearchParams(queryParams).toString()}`;
32
+ url.hash = hash ?? '';
33
+ Object.keys(params).forEach((param) => {
34
+ url.pathname = url.pathname.replace(`[${param}]`, params[param]);
35
+ });
36
+ if (globalThis.$fetch) {
37
+ return globalThis.$fetch(url.pathname);
38
+ }
39
+ const http = inject(HttpClient);
40
+ return firstValueFrom(http.get(`${url.href}`));
41
+ }
42
+ return {};
43
+ },
44
+ };
19
45
  return routeConfig;
20
46
  }
21
47
  function isRedirectRouteMeta(routeMeta) {
22
48
  return !!routeMeta.redirectTo;
23
49
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL3NyYy9saWIvcm91dGUtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWdDO0lBQzVELElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDZCxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsSUFBSSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNsQyxPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUM7SUFFM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZCLFdBQVcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0tBQ3pFO1NBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLEVBQUU7UUFDckMsV0FBVyxDQUFDLE9BQU8sR0FBRztZQUNwQixHQUFHLFdBQVcsQ0FBQyxPQUFPO1lBQ3RCLENBQUMsbUJBQW1CLENBQUMsRUFBRSxJQUFJO1NBQzVCLENBQUM7S0FDSDtJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixTQUFvQjtJQUVwQixPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWRpcmVjdFJvdXRlTWV0YSwgUm91dGVDb25maWcsIFJvdXRlTWV0YSB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IFJPVVRFX01FVEFfVEFHU19LRVkgfSBmcm9tICcuL21ldGEtdGFncyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JvdXRlQ29uZmlnKHJvdXRlTWV0YTogUm91dGVNZXRhIHwgdW5kZWZpbmVkKTogUm91dGVDb25maWcge1xuICBpZiAoIXJvdXRlTWV0YSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGlmIChpc1JlZGlyZWN0Um91dGVNZXRhKHJvdXRlTWV0YSkpIHtcbiAgICByZXR1cm4gcm91dGVNZXRhO1xuICB9XG5cbiAgY29uc3QgeyBtZXRhLCAuLi5yb3V0ZUNvbmZpZyB9ID0gcm91dGVNZXRhO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG1ldGEpKSB7XG4gICAgcm91dGVDb25maWcuZGF0YSA9IHsgLi4ucm91dGVDb25maWcuZGF0YSwgW1JPVVRFX01FVEFfVEFHU19LRVldOiBtZXRhIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIG1ldGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICByb3V0ZUNvbmZpZy5yZXNvbHZlID0ge1xuICAgICAgLi4ucm91dGVDb25maWcucmVzb2x2ZSxcbiAgICAgIFtST1VURV9NRVRBX1RBR1NfS0VZXTogbWV0YSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJvdXRlQ29uZmlnO1xufVxuXG5mdW5jdGlvbiBpc1JlZGlyZWN0Um91dGVNZXRhKFxuICByb3V0ZU1ldGE6IFJvdXRlTWV0YVxuKTogcm91dGVNZXRhIGlzIFJlZGlyZWN0Um91dGVNZXRhIHtcbiAgcmV0dXJuICEhcm91dGVNZXRhLnJlZGlyZWN0VG87XG59XG4iXX0=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL3NyYy9saWIvcm91dGUtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE1BQU0sVUFBVSxhQUFhLENBQUMsU0FBZ0M7SUFDNUQsSUFBSSxTQUFTLElBQUksbUJBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDL0MsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsV0FBVyxFQUFFLEdBQUcsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUUvQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdkIsV0FBVyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDekU7U0FBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUNyQyxXQUFXLENBQUMsT0FBTyxHQUFHO1lBQ3BCLEdBQUcsV0FBVyxDQUFDLE9BQU87WUFDdEIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUk7U0FDNUIsQ0FBQztLQUNIO0lBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNoQixXQUFXLEdBQUcsRUFBRSxDQUFDO0tBQ2xCO0lBRUQsV0FBVyxDQUFDLE9BQU8sR0FBRztRQUNwQixHQUFHLFdBQVcsQ0FBQyxPQUFPO1FBQ3RCLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBRXpCLENBQUM7WUFFRixJQUFJLGNBQWMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzVELE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7Z0JBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsZUFBZSxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO2dCQUM5RCxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3BDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSyxVQUFrQixDQUFDLE1BQU0sRUFBRTtvQkFDOUIsT0FBUSxVQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2pEO2dCQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDaEQ7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQzFCLFNBQW9CO0lBRXBCLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB0eXBlIHsgUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVkaXJlY3RSb3V0ZU1ldGEsIFJvdXRlQ29uZmlnLCBSb3V0ZU1ldGEgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBST1VURV9NRVRBX1RBR1NfS0VZIH0gZnJvbSAnLi9tZXRhLXRhZ3MnO1xuaW1wb3J0IHsgUEFHRV9FTkRQT0lOVFMsIEFOQUxPR19NRVRBX0tFWSB9IGZyb20gJy4vZW5kcG9pbnRzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRvUm91dGVDb25maWcocm91dGVNZXRhOiBSb3V0ZU1ldGEgfCB1bmRlZmluZWQpOiBSb3V0ZUNvbmZpZyB7XG4gIGlmIChyb3V0ZU1ldGEgJiYgaXNSZWRpcmVjdFJvdXRlTWV0YShyb3V0ZU1ldGEpKSB7XG4gICAgcmV0dXJuIHJvdXRlTWV0YTtcbiAgfVxuXG4gIGxldCB7IG1ldGEsIC4uLnJvdXRlQ29uZmlnIH0gPSByb3V0ZU1ldGEgPz8ge307XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobWV0YSkpIHtcbiAgICByb3V0ZUNvbmZpZy5kYXRhID0geyAuLi5yb3V0ZUNvbmZpZy5kYXRhLCBbUk9VVEVfTUVUQV9UQUdTX0tFWV06IG1ldGEgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbWV0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJvdXRlQ29uZmlnLnJlc29sdmUgPSB7XG4gICAgICAuLi5yb3V0ZUNvbmZpZy5yZXNvbHZlLFxuICAgICAgW1JPVVRFX01FVEFfVEFHU19LRVldOiBtZXRhLFxuICAgIH07XG4gIH1cblxuICBpZiAoIXJvdXRlQ29uZmlnKSB7XG4gICAgcm91dGVDb25maWcgPSB7fTtcbiAgfVxuXG4gIHJvdXRlQ29uZmlnLnJlc29sdmUgPSB7XG4gICAgLi4ucm91dGVDb25maWcucmVzb2x2ZSxcbiAgICBsb2FkOiBhc3luYyAocm91dGUpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcm91dGUucm91dGVDb25maWcgYXMgUm91dGUgJiB7XG4gICAgICAgIFtBTkFMT0dfTUVUQV9LRVldOiB7IGVuZHBvaW50OiBzdHJpbmc7IGVuZHBvaW50S2V5OiBzdHJpbmcgfTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChQQUdFX0VORFBPSU5UU1tyb3V0ZUNvbmZpZ1tBTkFMT0dfTUVUQV9LRVldLmVuZHBvaW50S2V5XSkge1xuICAgICAgICBjb25zdCB7IHF1ZXJ5UGFyYW1zLCBmcmFnbWVudDogaGFzaCwgcGFyYW1zIH0gPSByb3V0ZTtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgnJywgaW1wb3J0Lm1ldGEuZW52WydWSVRFX0FOQUxPR19QVUJMSUNfQkFTRV9VUkwnXSk7XG4gICAgICAgIHVybC5wYXRobmFtZSA9IGAvYXBpL19hbmFsb2cke3JvdXRlQ29uZmlnW0FOQUxPR19NRVRBX0tFWV0uZW5kcG9pbnR9YDtcbiAgICAgICAgdXJsLnNlYXJjaCA9IGAke25ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlQYXJhbXMpLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgdXJsLmhhc2ggPSBoYXNoID8/ICcnO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgICB1cmwucGF0aG5hbWUgPSB1cmwucGF0aG5hbWUucmVwbGFjZShgWyR7cGFyYW19XWAsIHBhcmFtc1twYXJhbV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoKGdsb2JhbFRoaXMgYXMgYW55KS4kZmV0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS4kZmV0Y2godXJsLnBhdGhuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShodHRwLmdldChgJHt1cmwuaHJlZn1gKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiByb3V0ZUNvbmZpZztcbn1cblxuZnVuY3Rpb24gaXNSZWRpcmVjdFJvdXRlTWV0YShcbiAgcm91dGVNZXRhOiBSb3V0ZU1ldGFcbik6IHJvdXRlTWV0YSBpcyBSZWRpcmVjdFJvdXRlTWV0YSB7XG4gIHJldHVybiAhIXJvdXRlTWV0YS5yZWRpcmVjdFRvO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9yb3V0ZXIvc3JjL2xpYi9yb3V0ZS10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIM0V2ZW50LCBIM0V2ZW50Q29udGV4dCB9IGZyb20gJ2gzJztcbmltcG9ydCB7ICRGZXRjaCB9IGZyb20gJ25pdHJvcGFjayc7XG5cbmV4cG9ydCB0eXBlIFBhZ2VTZXJ2ZXJMb2FkID0ge1xuICBwYXJhbXM6IEgzRXZlbnRDb250ZXh0WydwYXJhbXMnXTtcbiAgcmVxOiBIM0V2ZW50Wydub2RlJ11bJ3JlcSddO1xuICByZXM6IEgzRXZlbnRbJ25vZGUnXVsncmVzJ107XG4gIGZldGNoOiAkRmV0Y2g7XG59O1xuXG5leHBvcnQgdHlwZSBMb2FkUmVzdWx0PFxuICBBIGV4dGVuZHMgKHBhZ2VTZXJ2ZXJMb2FkOiBQYWdlU2VydmVyTG9hZCkgPT4gUHJvbWlzZTxhbnk+XG4+ID0gQXdhaXRlZDxSZXR1cm5UeXBlPEE+PjtcbiJdfQ==
@@ -1,6 +1,8 @@
1
1
  /// <reference types="vite/client" />
2
2
  import { toRouteConfig } from './route-config';
3
3
  import { toMarkdownModule } from './markdown-helpers';
4
+ import { APP_DIR, ENDPOINT_EXTENSION } from './constants';
5
+ import { ANALOG_META_KEY } from './endpoints';
4
6
  const FILES = import.meta.glob([
5
7
  '/app/routes/**/*.ts',
6
8
  '/src/app/routes/**/*.ts',
@@ -96,11 +98,25 @@ function toRoutes(rawRoutes, files) {
96
98
  ? toRoutes(rawRoute.children, files)
97
99
  : undefined;
98
100
  let module = undefined;
101
+ let analogMeta = undefined;
99
102
  if (rawRoute.filename) {
100
103
  const isMarkdownFile = rawRoute.filename.endsWith('.md');
101
104
  module = isMarkdownFile
102
105
  ? toMarkdownModule(files[rawRoute.filename])
103
106
  : files[rawRoute.filename];
107
+ const endpointKey = rawRoute.filename.replace(/\.page\.ts$/, ENDPOINT_EXTENSION);
108
+ // get endpoint path
109
+ const rawEndpoint = rawRoute.filename
110
+ .replace(/\.page\.ts$/, '')
111
+ .split(APP_DIR)[1];
112
+ // replace periods, remove (index) paths
113
+ const endpoint = (rawEndpoint || '')
114
+ .replace(/\./g, '/')
115
+ .replace(/\/\((.*?)\)$/, '/-$1-');
116
+ analogMeta = {
117
+ endpoint,
118
+ endpointKey,
119
+ };
104
120
  }
105
121
  const route = module
106
122
  ? {
@@ -111,6 +127,7 @@ function toRoutes(rawRoutes, files) {
111
127
  component: m.default,
112
128
  ...toRouteConfig(m.routeMeta),
113
129
  children,
130
+ [ANALOG_META_KEY]: analogMeta,
114
131
  },
115
132
  ]),
116
133
  }
@@ -141,4 +158,4 @@ function deprioritizeSegment(segment) {
141
158
  return segment.replace(':', '~~').replace('**', '~~~~');
142
159
  }
143
160
  export const routes = createRoutes({ ...FILES, ...CONTENT_FILES });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL3NyYy9saWIvcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUtyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWM7SUFDMUMscUJBQXFCO0lBQ3JCLHlCQUF5QjtJQUN6Qiw2QkFBNkI7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3BDLENBQUMseUJBQXlCLEVBQUUsd0JBQXdCLENBQUMsRUFDckQsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQ2QsQ0FBQztBQWlCRjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBWTtJQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXJDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDMUIsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELHNEQUFzRDtJQUN0RCxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7UUFDN0QsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsNEJBQTRCO1FBQzVCLGlDQUFpQztRQUNqQyxxQ0FBcUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFD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LENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFO1FBQ2hDLGFBQWEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDbEM7QUFDSCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxPQUFlO0lBQzFDLDJDQUEyQztJQUMzQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBWSxZQUFZLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGUvY2xpZW50XCIgLz5cblxuaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB0eXBlIHsgUm91dGVFeHBvcnQsIFJvdXRlTWV0YSB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IHRvUm91dGVDb25maWcgfSBmcm9tICcuL3JvdXRlLWNvbmZpZyc7XG5pbXBvcnQgeyB0b01hcmtkb3duTW9kdWxlIH0gZnJvbSAnLi9tYXJrZG93bi1oZWxwZXJzJztcblxuY29uc3QgRklMRVMgPSBpbXBvcnQubWV0YS5nbG9iPFJvdXRlRXhwb3J0PihbXG4gICcvYXBwL3JvdXRlcy8qKi8qLnRzJyxcbiAgJy9zcmMvYXBwL3JvdXRlcy8qKi8qLnRzJyxcbiAgJy9zcmMvYXBwL3BhZ2VzLyoqLyoucGFnZS50cycsXG5dKTtcblxuY29uc3QgQ09OVEVOVF9GSUxFUyA9IGltcG9ydC5tZXRhLmdsb2I8c3RyaW5nPihcbiAgWycvc3JjL2FwcC9yb3V0ZXMvKiovKi5tZCcsICcvc3JjL2FwcC9wYWdlcy8qKi8qLm1kJ10sXG4gIHsgYXM6ICdyYXcnIH1cbik7XG5cbmV4cG9ydCB0eXBlIEZpbGVzID0gUmVjb3JkPHN0cmluZywgKCkgPT4gUHJvbWlzZTxSb3V0ZUV4cG9ydCB8IHN0cmluZz4+O1xuXG50eXBlIFJhd1JvdXRlID0ge1xuICBmaWxlbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcmF3U2VnbWVudDogc3RyaW5nO1xuICBhbmNlc3RvclJhd1NlZ21lbnRzOiBzdHJpbmdbXTtcbiAgc2VnbWVudDogc3RyaW5nO1xuICBsZXZlbDogbnVtYmVyO1xuICBjaGlsZHJlbjogUmF3Um91dGVbXTtcbn07XG5cbnR5cGUgUmF3Um91dGVNYXAgPSBSZWNvcmQ8c3RyaW5nLCBSYXdSb3V0ZT47XG5cbnR5cGUgUmF3Um91dGVCeUxldmVsTWFwID0gUmVjb3JkPG51bWJlciwgUmF3Um91dGVNYXA+O1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdXNlZCB0byBwYXJzZSBsaXN0IG9mIGZpbGVzIGFuZCBjcmVhdGUgY29uZmlndXJhdGlvbiBvZiByb3V0ZXMuXG4gKlxuICogQHBhcmFtIGZpbGVzXG4gKiBAcmV0dXJucyBBcnJheSBvZiByb3V0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcyhmaWxlczogRmlsZXMpOiBSb3V0ZVtdIHtcbiAgY29uc3QgZmlsZW5hbWVzID0gT2JqZWN0LmtleXMoZmlsZXMpO1xuXG4gIGlmIChmaWxlbmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gbWFwIGZpbGVuYW1lcyB0byByYXcgcm91dGVzIGFuZCBncm91cCB0aGVtIGJ5IGxldmVsXG4gIGNvbnN0IHJhd1JvdXRlc0J5TGV2ZWxNYXAgPSBmaWxlbmFtZXMucmVkdWNlKChhY2MsIGZpbGVuYW1lKSA9PiB7XG4gICAgY29uc3QgcmF3UGF0aCA9IHRvUmF3UGF0aChmaWxlbmFtZSk7XG4gICAgY29uc3QgcmF3U2VnbWVudHMgPSByYXdQYXRoLnNwbGl0KCcvJyk7XG4gICAgLy8gbmVzdGluZyBsZXZlbCBzdGFydHMgYXQgMFxuICAgIC8vIHJhd1BhdGg6IC9wcm9kdWN0cyA9PiBsZXZlbDogMFxuICAgIC8vIHJhd1BhdGg6IC9wcm9kdWN0cy86aWQgPT4gbGV2ZWw6IDFcbiAgICBjb25zdCBsZXZlbCA9IHJhd1NlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgcmF3U2VnbWVudCA9IHJhd1NlZ21lbnRzW2xldmVsXTtcbiAgICBjb25zdCBhbmNlc3RvclJhd1NlZ21lbnRzID0gcmF3U2VnbWVudHMuc2xpY2UoMCwgbGV2ZWwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFjYyxcbiAgICAgIFtsZXZlbF06IHtcbiAgICAgICAgLi4uYWNjW2xldmVsXSxcbiAgICAgICAgW3Jhd1BhdGhdOiB7XG4gICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgcmF3U2VnbWVudCxcbiAgICAgICAgICBhbmNlc3RvclJhd1NlZ21lbnRzLFxuICAgICAgICAgIHNlZ21lbnQ6IHRvU2VnbWVudChyYXdTZWdtZW50KSxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH0sIHt9IGFzIFJhd1JvdXRlQnlMZXZlbE1hcCk7XG5cbiAgY29uc3QgYWxsTGV2ZWxzID0gT2JqZWN0LmtleXMocmF3Um91dGVzQnlMZXZlbE1hcCkubWFwKE51bWJlcik7XG4gIGNvbnN0IG1heExldmVsID0gTWF0aC5tYXgoLi4uYWxsTGV2ZWxzKTtcblxuICAvLyBhZGQgZWFjaCByYXcgcm91dGUgdG8gaXRzIHBhcmVudCdzIGNoaWxkcmVuIGFycmF5XG4gIGZvciAobGV0IGxldmVsID0gbWF4TGV2ZWw7IGxldmVsID4gMDsgbGV2ZWwtLSkge1xuICAgIGNvbnN0IHJhd1JvdXRlc01hcCA9IHJhd1JvdXRlc0J5TGV2ZWxNYXBbbGV2ZWxdO1xuICAgIGNvbnN0IHJhd1BhdGhzID0gT2JqZWN0LmtleXMocmF3Um91dGVzTWFwKTtcblxuICAgIGZvciAoY29uc3QgcmF3UGF0aCBvZiByYXdQYXRocykge1xuICAgICAgY29uc3QgcmF3Um91dGUgPSByYXdSb3V0ZXNNYXBbcmF3UGF0aF07XG4gICAgICBjb25zdCBwYXJlbnRSYXdQYXRoID0gcmF3Um91dGUuYW5jZXN0b3JSYXdTZWdtZW50cy5qb2luKCcvJyk7XG4gICAgICBjb25zdCBwYXJlbnRSYXdTZWdtZW50SW5kZXggPSByYXdSb3V0ZS5hbmNlc3RvclJhd1NlZ21lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBwYXJlbnRSYXdTZWdtZW50ID1cbiAgICAgICAgcmF3Um91dGUuYW5jZXN0b3JSYXdTZWdtZW50c1twYXJlbnRSYXdTZWdtZW50SW5kZXhdO1xuXG4gICAgICAvLyBjcmVhdGUgdGhlIHBhcmVudCBsZXZlbCBhbmQvb3IgcmF3IHJvdXRlIGlmIGl0IGRvZXMgbm90IGV4aXN0XG4gICAgICAvLyBwYXJlbnQgcm91dGUgd29uJ3QgZXhpc3QgZm9yIG5lc3RlZCByb3V0ZXMgdGhhdCBkb24ndCBoYXZlIGEgbGF5b3V0IHJvdXRlXG4gICAgICByYXdSb3V0ZXNCeUxldmVsTWFwW2xldmVsIC0gMV0gfHw9IHt9O1xuICAgICAgcmF3Um91dGVzQnlMZXZlbE1hcFtsZXZlbCAtIDFdW3BhcmVudFJhd1BhdGhdIHx8PSB7XG4gICAgICAgIGZpbGVuYW1lOiBudWxsLFxuICAgICAgICByYXdTZWdtZW50OiBwYXJlbnRSYXdTZWdtZW50LFxuICAgICAgICBhbmNlc3RvclJhd1NlZ21lbnRzOiByYXdSb3V0ZS5hbmNlc3RvclJhd1NlZ21lbnRzLnNsaWNlKFxuICAgICAgICAgIDAsXG4gICAgICAgICAgcGFyZW50UmF3U2VnbWVudEluZGV4XG4gICAgICAgICksXG4gICAgICAgIHNlZ21lbnQ6IHRvU2VnbWVudChwYXJlbnRSYXdTZWdtZW50KSxcbiAgICAgICAgbGV2ZWw6IGxldmVsIC0gMSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcblxuICAgICAgcmF3Um91dGVzQnlMZXZlbE1hcFtsZXZlbCAtIDFdW3BhcmVudFJhd1BhdGhdLmNoaWxkcmVuLnB1c2gocmF3Um91dGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG9ubHkgdGFrZSByYXcgcm91dGVzIGZyb20gdGhlIHJvb3QgbGV2ZWxcbiAgLy8gc2luY2UgdGhleSBhbHJlYWR5IGNvbnRhaW4gbmVzdGVkIHJvdXRlcyBhcyB0aGVpciBjaGlsZHJlblxuICBjb25zdCByb290UmF3Um91dGVzTWFwID0gcmF3Um91dGVzQnlMZXZlbE1hcFswXTtcbiAgY29uc3QgcmF3Um91dGVzID0gT2JqZWN0LmtleXMocm9vdFJhd1JvdXRlc01hcCkubWFwKFxuICAgIChzZWdtZW50KSA9PiByb290UmF3Um91dGVzTWFwW3NlZ21lbnRdXG4gICk7XG4gIHNvcnRSYXdSb3V0ZXMocmF3Um91dGVzKTtcblxuICByZXR1cm4gdG9Sb3V0ZXMocmF3Um91dGVzLCBmaWxlcyk7XG59XG5cbmZ1bmN0aW9uIHRvUmF3UGF0aChmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZpbGVuYW1lXG4gICAgLnJlcGxhY2UoXG4gICAgICAvLyBjb252ZXJ0IHRvIHJlbGF0aXZlIHBhdGggYW5kIHJlbW92ZSBmaWxlIGV4dGVuc2lvblxuICAgICAgL15cXC8oLio/KVxcL3JvdXRlc1xcL3xeXFwvKC4qPylcXC9wYWdlc1xcL3xcXC9hcHBcXC9yb3V0ZXNcXC98KFxcLnBhZ2VcXC4oanN8dHMpJCl8KFxcLih0c3xtZCkkKS9nLFxuICAgICAgJydcbiAgICApXG4gICAgLnJlcGxhY2UoL1xcW1xcLnszfS4rXFxdLywgJyoqJykgLy8gWy4uLm5vdC1mb3VuZF0gPT4gKipcbiAgICAucmVwbGFjZSgvXFxbKFteXFxdXSspXFxdL2csICc6JDEnKTsgLy8gW2lkXSA9PiA6aWRcbn1cblxuZnVuY3Rpb24gdG9TZWdtZW50KHJhd1NlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByYXdTZWdtZW50XG4gICAgLnJlcGxhY2UoL2luZGV4fFxcKC4qP1xcKS9nLCAnJykgLy8gcmVwbGFjZSBuYW1lZCBlbXB0eSBzZWdtZW50c1xuICAgIC5yZXBsYWNlKC9cXC58XFwvKy9nLCAnLycpIC8vIHJlcGxhY2UgZG90cyB3aXRoIHNsYXNoZXMgYW5kIHJlbW92ZSByZWR1bmRhbnQgc2xhc2hlc1xuICAgIC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCAnJyk7IC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzXG59XG5cbmZ1bmN0aW9uIHRvUm91dGVzKHJhd1JvdXRlczogUmF3Um91dGVbXSwgZmlsZXM6IEZpbGVzKTogUm91dGVbXSB7XG4gIGNvbnN0IHJvdXRlczogUm91dGVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcmF3Um91dGUgb2YgcmF3Um91dGVzKSB7XG4gICAgY29uc3QgY2hpbGRyZW46IFJvdXRlW10gfCB1bmRlZmluZWQgPVxuICAgICAgcmF3Um91dGUuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICA/IHRvUm91dGVzKHJhd1JvdXRlLmNoaWxkcmVuLCBmaWxlcylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgbGV0IG1vZHVsZTogKCgpID0+IFByb21pc2U8Um91dGVFeHBvcnQ+KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChyYXdSb3V0ZS5maWxlbmFtZSkge1xuICAgICAgY29uc3QgaXNNYXJrZG93bkZpbGUgPSByYXdSb3V0ZS5maWxlbmFtZS5lbmRzV2l0aCgnLm1kJyk7XG4gICAgICBtb2R1bGUgPSBpc01hcmtkb3duRmlsZVxuICAgICAgICA/IHRvTWFya2Rvd25Nb2R1bGUoZmlsZXNbcmF3Um91dGUuZmlsZW5hbWVdIGFzICgpID0+IFByb21pc2U8c3RyaW5nPilcbiAgICAgICAgOiAoZmlsZXNbcmF3Um91dGUuZmlsZW5hbWVdIGFzICgpID0+IFByb21pc2U8Um91dGVFeHBvcnQ+KTtcbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZTogUm91dGUgPSBtb2R1bGVcbiAgICAgID8ge1xuICAgICAgICAgIHBhdGg6IHJhd1JvdXRlLnNlZ21lbnQsXG4gICAgICAgICAgbG9hZENoaWxkcmVuOiAoKSA9PlxuICAgICAgICAgICAgbW9kdWxlISgpLnRoZW4oKG0pID0+IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGg6ICcnLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogbS5kZWZhdWx0LFxuICAgICAgICAgICAgICAgIC4uLnRvUm91dGVDb25maWcobS5yb3V0ZU1ldGEgYXMgUm91dGVNZXRhIHwgdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICB9XG4gICAgICA6IHsgcGF0aDogcmF3Um91dGUuc2VnbWVudCwgY2hpbGRyZW4gfTtcblxuICAgIHJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgfVxuXG4gIHJldHVybiByb3V0ZXM7XG59XG5cbmZ1bmN0aW9uIHNvcnRSYXdSb3V0ZXMocmF3Um91dGVzOiBSYXdSb3V0ZVtdKTogdm9pZCB7XG4gIHJhd1JvdXRlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgbGV0IHNlZ21lbnRBID0gZGVwcmlvcml0aXplU2VnbWVudChhLnNlZ21lbnQpO1xuICAgIGxldCBzZWdtZW50QiA9IGRlcHJpb3JpdGl6ZVNlZ21lbnQoYi5zZWdtZW50KTtcblxuICAgIC8vIHByaW9yaXRpemUgcm91dGVzIHdpdGggZmV3ZXIgY2hpbGRyZW5cbiAgICBpZiAoYS5jaGlsZHJlbi5sZW5ndGggPiBiLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgc2VnbWVudEEgPSBgfiR7c2VnbWVudEF9YDtcbiAgICB9IGVsc2UgaWYgKGEuY2hpbGRyZW4ubGVuZ3RoIDwgYi5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHNlZ21lbnRCID0gYH4ke3NlZ21lbnRCfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRBID4gc2VnbWVudEIgPyAxIDogLTE7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgcmF3Um91dGUgb2YgcmF3Um91dGVzKSB7XG4gICAgc29ydFJhd1JvdXRlcyhyYXdSb3V0ZS5jaGlsZHJlbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVwcmlvcml0aXplU2VnbWVudChzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBkZXByaW9yaXRpemUgcGFyYW0gYW5kIHdpbGRjYXJkIHNlZ21lbnRzXG4gIHJldHVybiBzZWdtZW50LnJlcGxhY2UoJzonLCAnfn4nKS5yZXBsYWNlKCcqKicsICd+fn5+Jyk7XG59XG5cbmV4cG9ydCBjb25zdCByb3V0ZXM6IFJvdXRlW10gPSBjcmVhdGVSb3V0ZXMoeyAuLi5GSUxFUywgLi4uQ09OVEVOVF9GSUxFUyB9KTtcbiJdfQ==
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcm91dGVyL3NyYy9saWIvcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUtyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFjO0lBQzFDLHFCQUFxQjtJQUNyQix5QkFBeUI7SUFDekIsNkJBQTZCO0NBQzlCLENBQUMsQ0FBQztBQUVILE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNwQyxDQUFDLHlCQUF5QixFQUFFLHdCQUF3QixDQUFDLEVBQ3JELEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUNkLENBQUM7QUFpQkY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQVk7SUFDdkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVyQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzFCLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFFRCxzREFBc0Q7SUFDdEQsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQzdELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcs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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZS9jbGllbnRcIiAvPlxuXG5pbXBvcnQgdHlwZSB7IFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBSb3V0ZUV4cG9ydCwgUm91dGVNZXRhIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgdG9Sb3V0ZUNvbmZpZyB9IGZyb20gJy4vcm91dGUtY29uZmlnJztcbmltcG9ydCB7IHRvTWFya2Rvd25Nb2R1bGUgfSBmcm9tICcuL21hcmtkb3duLWhlbHBlcnMnO1xuaW1wb3J0IHsgQVBQX0RJUiwgRU5EUE9JTlRfRVhURU5TSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQU5BTE9HX01FVEFfS0VZIH0gZnJvbSAnLi9lbmRwb2ludHMnO1xuXG5jb25zdCBGSUxFUyA9IGltcG9ydC5tZXRhLmdsb2I8Um91dGVFeHBvcnQ+KFtcbiAgJy9hcHAvcm91dGVzLyoqLyoudHMnLFxuICAnL3NyYy9hcHAvcm91dGVzLyoqLyoudHMnLFxuICAnL3NyYy9hcHAvcGFnZXMvKiovKi5wYWdlLnRzJyxcbl0pO1xuXG5jb25zdCBDT05URU5UX0ZJTEVTID0gaW1wb3J0Lm1ldGEuZ2xvYjxzdHJpbmc+KFxuICBbJy9zcmMvYXBwL3JvdXRlcy8qKi8qLm1kJywgJy9zcmMvYXBwL3BhZ2VzLyoqLyoubWQnXSxcbiAgeyBhczogJ3JhdycgfVxuKTtcblxuZXhwb3J0IHR5cGUgRmlsZXMgPSBSZWNvcmQ8c3RyaW5nLCAoKSA9PiBQcm9taXNlPFJvdXRlRXhwb3J0IHwgc3RyaW5nPj47XG5cbnR5cGUgUmF3Um91dGUgPSB7XG4gIGZpbGVuYW1lOiBzdHJpbmcgfCBudWxsO1xuICByYXdTZWdtZW50OiBzdHJpbmc7XG4gIGFuY2VzdG9yUmF3U2VnbWVudHM6IHN0cmluZ1tdO1xuICBzZWdtZW50OiBzdHJpbmc7XG4gIGxldmVsOiBudW1iZXI7XG4gIGNoaWxkcmVuOiBSYXdSb3V0ZVtdO1xufTtcblxudHlwZSBSYXdSb3V0ZU1hcCA9IFJlY29yZDxzdHJpbmcsIFJhd1JvdXRlPjtcblxudHlwZSBSYXdSb3V0ZUJ5TGV2ZWxNYXAgPSBSZWNvcmQ8bnVtYmVyLCBSYXdSb3V0ZU1hcD47XG5cbi8qKlxuICogQSBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIGxpc3Qgb2YgZmlsZXMgYW5kIGNyZWF0ZSBjb25maWd1cmF0aW9uIG9mIHJvdXRlcy5cbiAqXG4gKiBAcGFyYW0gZmlsZXNcbiAqIEByZXR1cm5zIEFycmF5IG9mIHJvdXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVzKGZpbGVzOiBGaWxlcyk6IFJvdXRlW10ge1xuICBjb25zdCBmaWxlbmFtZXMgPSBPYmplY3Qua2V5cyhmaWxlcyk7XG5cbiAgaWYgKGZpbGVuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBtYXAgZmlsZW5hbWVzIHRvIHJhdyByb3V0ZXMgYW5kIGdyb3VwIHRoZW0gYnkgbGV2ZWxcbiAgY29uc3QgcmF3Um91dGVzQnlMZXZlbE1hcCA9IGZpbGVuYW1lcy5yZWR1Y2UoKGFjYywgZmlsZW5hbWUpID0+IHtcbiAgICBjb25zdCByYXdQYXRoID0gdG9SYXdQYXRoKGZpbGVuYW1lKTtcbiAgICBjb25zdCByYXdTZWdtZW50cyA9IHJhd1BhdGguc3BsaXQoJy8nKTtcbiAgICAvLyBuZXN0aW5nIGxldmVsIHN0YXJ0cyBhdCAwXG4gICAgLy8gcmF3UGF0aDogL3Byb2R1Y3RzID0+IGxldmVsOiAwXG4gICAgLy8gcmF3UGF0aDogL3Byb2R1Y3RzLzppZCA9PiBsZXZlbDogMVxuICAgIGNvbnN0IGxldmVsID0gcmF3U2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCByYXdTZWdtZW50ID0gcmF3U2VnbWVudHNbbGV2ZWxdO1xuICAgIGNvbnN0IGFuY2VzdG9yUmF3U2VnbWVudHMgPSByYXdTZWdtZW50cy5zbGljZSgwLCBsZXZlbCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYWNjLFxuICAgICAgW2xldmVsXToge1xuICAgICAgICAuLi5hY2NbbGV2ZWxdLFxuICAgICAgICBbcmF3UGF0aF06IHtcbiAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICByYXdTZWdtZW50LFxuICAgICAgICAgIGFuY2VzdG9yUmF3U2VnbWVudHMsXG4gICAgICAgICAgc2VnbWVudDogdG9TZWdtZW50KHJhd1NlZ21lbnQpLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSwge30gYXMgUmF3Um91dGVCeUxldmVsTWFwKTtcblxuICBjb25zdCBhbGxMZXZlbHMgPSBPYmplY3Qua2V5cyhyYXdSb3V0ZXNCeUxldmVsTWFwKS5tYXAoTnVtYmVyKTtcbiAgY29uc3QgbWF4TGV2ZWwgPSBNYXRoLm1heCguLi5hbGxMZXZlbHMpO1xuXG4gIC8vIGFkZCBlYWNoIHJhdyByb3V0ZSB0byBpdHMgcGFyZW50J3MgY2hpbGRyZW4gYXJyYXlcbiAgZm9yIChsZXQgbGV2ZWwgPSBtYXhMZXZlbDsgbGV2ZWwgPiAwOyBsZXZlbC0tKSB7XG4gICAgY29uc3QgcmF3Um91dGVzTWFwID0gcmF3Um91dGVzQnlMZXZlbE1hcFtsZXZlbF07XG4gICAgY29uc3QgcmF3UGF0aHMgPSBPYmplY3Qua2V5cyhyYXdSb3V0ZXNNYXApO1xuXG4gICAgZm9yIChjb25zdCByYXdQYXRoIG9mIHJhd1BhdGhzKSB7XG4gICAgICBjb25zdCByYXdSb3V0ZSA9IHJhd1JvdXRlc01hcFtyYXdQYXRoXTtcbiAgICAgIGNvbnN0IHBhcmVudFJhd1BhdGggPSByYXdSb3V0ZS5hbmNlc3RvclJhd1NlZ21lbnRzLmpvaW4oJy8nKTtcbiAgICAgIGNvbnN0IHBhcmVudFJhd1NlZ21lbnRJbmRleCA9IHJhd1JvdXRlLmFuY2VzdG9yUmF3U2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IHBhcmVudFJhd1NlZ21lbnQgPVxuICAgICAgICByYXdSb3V0ZS5hbmNlc3RvclJhd1NlZ21lbnRzW3BhcmVudFJhd1NlZ21lbnRJbmRleF07XG5cbiAgICAgIC8vIGNyZWF0ZSB0aGUgcGFyZW50IGxldmVsIGFuZC9vciByYXcgcm91dGUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHBhcmVudCByb3V0ZSB3b24ndCBleGlzdCBmb3IgbmVzdGVkIHJvdXRlcyB0aGF0IGRvbid0IGhhdmUgYSBsYXlvdXQgcm91dGVcbiAgICAgIHJhd1JvdXRlc0J5TGV2ZWxNYXBbbGV2ZWwgLSAxXSB8fD0ge307XG4gICAgICByYXdSb3V0ZXNCeUxldmVsTWFwW2xldmVsIC0gMV1bcGFyZW50UmF3UGF0aF0gfHw9IHtcbiAgICAgICAgZmlsZW5hbWU6IG51bGwsXG4gICAgICAgIHJhd1NlZ21lbnQ6IHBhcmVudFJhd1NlZ21lbnQsXG4gICAgICAgIGFuY2VzdG9yUmF3U2VnbWVudHM6IHJhd1JvdXRlLmFuY2VzdG9yUmF3U2VnbWVudHMuc2xpY2UoXG4gICAgICAgICAgMCxcbiAgICAgICAgICBwYXJlbnRSYXdTZWdtZW50SW5kZXhcbiAgICAgICAgKSxcbiAgICAgICAgc2VnbWVudDogdG9TZWdtZW50KHBhcmVudFJhd1NlZ21lbnQpLFxuICAgICAgICBsZXZlbDogbGV2ZWwgLSAxLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuXG4gICAgICByYXdSb3V0ZXNCeUxldmVsTWFwW2xldmVsIC0gMV1bcGFyZW50UmF3UGF0aF0uY2hpbGRyZW4ucHVzaChyYXdSb3V0ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gb25seSB0YWtlIHJhdyByb3V0ZXMgZnJvbSB0aGUgcm9vdCBsZXZlbFxuICAvLyBzaW5jZSB0aGV5IGFscmVhZHkgY29udGFpbiBuZXN0ZWQgcm91dGVzIGFzIHRoZWlyIGNoaWxkcmVuXG4gIGNvbnN0IHJvb3RSYXdSb3V0ZXNNYXAgPSByYXdSb3V0ZXNCeUxldmVsTWFwWzBdO1xuICBjb25zdCByYXdSb3V0ZXMgPSBPYmplY3Qua2V5cyhyb290UmF3Um91dGVzTWFwKS5tYXAoXG4gICAgKHNlZ21lbnQpID0+IHJvb3RSYXdSb3V0ZXNNYXBbc2VnbWVudF1cbiAgKTtcbiAgc29ydFJhd1JvdXRlcyhyYXdSb3V0ZXMpO1xuXG4gIHJldHVybiB0b1JvdXRlcyhyYXdSb3V0ZXMsIGZpbGVzKTtcbn1cblxuZnVuY3Rpb24gdG9SYXdQYXRoKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZW5hbWVcbiAgICAucmVwbGFjZShcbiAgICAgIC8vIGNvbnZlcnQgdG8gcmVsYXRpdmUgcGF0aCBhbmQgcmVtb3ZlIGZpbGUgZXh0ZW5zaW9uXG4gICAgICAvXlxcLyguKj8pXFwvcm91dGVzXFwvfF5cXC8oLio/KVxcL3BhZ2VzXFwvfFxcL2FwcFxcL3JvdXRlc1xcL3woXFwucGFnZVxcLihqc3x0cykkKXwoXFwuKHRzfG1kKSQpL2csXG4gICAgICAnJ1xuICAgIClcbiAgICAucmVwbGFjZSgvXFxbXFwuezN9LitcXF0vLCAnKionKSAvLyBbLi4ubm90LWZvdW5kXSA9PiAqKlxuICAgIC5yZXBsYWNlKC9cXFsoW15cXF1dKylcXF0vZywgJzokMScpOyAvLyBbaWRdID0+IDppZFxufVxuXG5mdW5jdGlvbiB0b1NlZ21lbnQocmF3U2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhd1NlZ21lbnRcbiAgICAucmVwbGFjZSgvaW5kZXh8XFwoLio/XFwpL2csICcnKSAvLyByZXBsYWNlIG5hbWVkIGVtcHR5IHNlZ21lbnRzXG4gICAgLnJlcGxhY2UoL1xcLnxcXC8rL2csICcvJykgLy8gcmVwbGFjZSBkb3RzIHdpdGggc2xhc2hlcyBhbmQgcmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzXG4gICAgLnJlcGxhY2UoL15cXC8rfFxcLyskL2csICcnKTsgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXNcbn1cblxuZnVuY3Rpb24gdG9Sb3V0ZXMocmF3Um91dGVzOiBSYXdSb3V0ZVtdLCBmaWxlczogRmlsZXMpOiBSb3V0ZVtdIHtcbiAgY29uc3Qgcm91dGVzOiBSb3V0ZVtdID0gW107XG5cbiAgZm9yIChjb25zdCByYXdSb3V0ZSBvZiByYXdSb3V0ZXMpIHtcbiAgICBjb25zdCBjaGlsZHJlbjogUm91dGVbXSB8IHVuZGVmaW5lZCA9XG4gICAgICByYXdSb3V0ZS5jaGlsZHJlbi5sZW5ndGggPiAwXG4gICAgICAgID8gdG9Sb3V0ZXMocmF3Um91dGUuY2hpbGRyZW4sIGZpbGVzKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBsZXQgbW9kdWxlOiAoKCkgPT4gUHJvbWlzZTxSb3V0ZUV4cG9ydD4pIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBhbmFsb2dNZXRhOiB7IGVuZHBvaW50OiBzdHJpbmc7IGVuZHBvaW50S2V5OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCA9XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICBpZiAocmF3Um91dGUuZmlsZW5hbWUpIHtcbiAgICAgIGNvbnN0IGlzTWFya2Rvd25GaWxlID0gcmF3Um91dGUuZmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpO1xuICAgICAgbW9kdWxlID0gaXNNYXJrZG93bkZpbGVcbiAgICAgICAgPyB0b01hcmtkb3duTW9kdWxlKGZpbGVzW3Jhd1JvdXRlLmZpbGVuYW1lXSBhcyAoKSA9PiBQcm9taXNlPHN0cmluZz4pXG4gICAgICAgIDogKGZpbGVzW3Jhd1JvdXRlLmZpbGVuYW1lXSBhcyAoKSA9PiBQcm9taXNlPFJvdXRlRXhwb3J0Pik7XG5cbiAgICAgIGNvbnN0IGVuZHBvaW50S2V5ID0gcmF3Um91dGUuZmlsZW5hbWUucmVwbGFjZShcbiAgICAgICAgL1xcLnBhZ2VcXC50cyQvLFxuICAgICAgICBFTkRQT0lOVF9FWFRFTlNJT05cbiAgICAgICk7XG5cbiAgICAgIC8vIGdldCBlbmRwb2ludCBwYXRoXG4gICAgICBjb25zdCByYXdFbmRwb2ludCA9IHJhd1JvdXRlLmZpbGVuYW1lXG4gICAgICAgIC5yZXBsYWNlKC9cXC5wYWdlXFwudHMkLywgJycpXG4gICAgICAgIC5zcGxpdChBUFBfRElSKVsxXTtcblxuICAgICAgLy8gcmVwbGFjZSBwZXJpb2RzLCByZW1vdmUgKGluZGV4KSBwYXRoc1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSAocmF3RW5kcG9pbnQgfHwgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC4vZywgJy8nKVxuICAgICAgICAucmVwbGFjZSgvXFwvXFwoKC4qPylcXCkkLywgJy8tJDEtJyk7XG5cbiAgICAgIGFuYWxvZ01ldGEgPSB7XG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBlbmRwb2ludEtleSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGU6IFJvdXRlICYgeyBtZXRhPzogdHlwZW9mIGFuYWxvZ01ldGEgfSA9IG1vZHVsZVxuICAgICAgPyB7XG4gICAgICAgICAgcGF0aDogcmF3Um91dGUuc2VnbWVudCxcbiAgICAgICAgICBsb2FkQ2hpbGRyZW46ICgpID0+XG4gICAgICAgICAgICBtb2R1bGUhKCkudGhlbigobSkgPT4gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGF0aDogJycsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBtLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgLi4udG9Sb3V0ZUNvbmZpZyhtLnJvdXRlTWV0YSBhcyBSb3V0ZU1ldGEgfCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIFtBTkFMT0dfTUVUQV9LRVldOiBhbmFsb2dNZXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH1cbiAgICAgIDogeyBwYXRoOiByYXdSb3V0ZS5zZWdtZW50LCBjaGlsZHJlbiB9O1xuXG4gICAgcm91dGVzLnB1c2gocm91dGUpO1xuICB9XG5cbiAgcmV0dXJuIHJvdXRlcztcbn1cblxuZnVuY3Rpb24gc29ydFJhd1JvdXRlcyhyYXdSb3V0ZXM6IFJhd1JvdXRlW10pOiB2b2lkIHtcbiAgcmF3Um91dGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBsZXQgc2VnbWVudEEgPSBkZXByaW9yaXRpemVTZWdtZW50KGEuc2VnbWVudCk7XG4gICAgbGV0IHNlZ21lbnRCID0gZGVwcmlvcml0aXplU2VnbWVudChiLnNlZ21lbnQpO1xuXG4gICAgLy8gcHJpb3JpdGl6ZSByb3V0ZXMgd2l0aCBmZXdlciBjaGlsZHJlblxuICAgIGlmIChhLmNoaWxkcmVuLmxlbmd0aCA+IGIuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBzZWdtZW50QSA9IGB+JHtzZWdtZW50QX1gO1xuICAgIH0gZWxzZSBpZiAoYS5jaGlsZHJlbi5sZW5ndGggPCBiLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgc2VnbWVudEIgPSBgfiR7c2VnbWVudEJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VnbWVudEEgPiBzZWdtZW50QiA/IDEgOiAtMTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCByYXdSb3V0ZSBvZiByYXdSb3V0ZXMpIHtcbiAgICBzb3J0UmF3Um91dGVzKHJhd1JvdXRlLmNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXByaW9yaXRpemVTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGRlcHJpb3JpdGl6ZSBwYXJhbSBhbmQgd2lsZGNhcmQgc2VnbWVudHNcbiAgcmV0dXJuIHNlZ21lbnQucmVwbGFjZSgnOicsICd+ficpLnJlcGxhY2UoJyoqJywgJ35+fn4nKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdXRlczogUm91dGVbXSA9IGNyZWF0ZVJvdXRlcyh7IC4uLkZJTEVTLCAuLi5DT05URU5UX0ZJTEVTIH0pO1xuIl19
@@ -1,4 +1,6 @@
1
- import { inject, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER } from '@angular/core';
1
+ import { inject, makeEnvironmentProviders, ENVIRONMENT_INITIALIZER, assertInInjectionContext, Injector } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { firstValueFrom, map } from 'rxjs';
2
4
  import { Meta } from '@angular/platform-browser';
3
5
  import { Router, NavigationEnd, ActivatedRoute, provideRouter } from '@angular/router';
4
6
  import { filter } from 'rxjs/operators';
@@ -49,14 +51,16 @@ function getMetaTagSelector(metaTag) {
49
51
  return CHARSET_KEY;
50
52
  }
51
53
 
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',
57
+ ]);
58
+
52
59
  function toRouteConfig(routeMeta) {
53
- if (!routeMeta) {
54
- return {};
55
- }
56
- if (isRedirectRouteMeta(routeMeta)) {
60
+ if (routeMeta && isRedirectRouteMeta(routeMeta)) {
57
61
  return routeMeta;
58
62
  }
59
- const { meta, ...routeConfig } = routeMeta;
63
+ let { meta, ...routeConfig } = routeMeta ?? {};
60
64
  if (Array.isArray(meta)) {
61
65
  routeConfig.data = { ...routeConfig.data, [ROUTE_META_TAGS_KEY]: meta };
62
66
  }
@@ -66,6 +70,31 @@ function toRouteConfig(routeMeta) {
66
70
  [ROUTE_META_TAGS_KEY]: meta,
67
71
  };
68
72
  }
73
+ if (!routeConfig) {
74
+ routeConfig = {};
75
+ }
76
+ routeConfig.resolve = {
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 } = route;
82
+ const url = new URL('', import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL']);
83
+ url.pathname = `/api/_analog${routeConfig[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
+ if (globalThis.$fetch) {
90
+ return globalThis.$fetch(url.pathname);
91
+ }
92
+ const http = inject(HttpClient);
93
+ return firstValueFrom(http.get(`${url.href}`));
94
+ }
95
+ return {};
96
+ },
97
+ };
69
98
  return routeConfig;
70
99
  }
71
100
  function isRedirectRouteMeta(routeMeta) {
@@ -93,6 +122,9 @@ function toMarkdownModule(markdownFileFactory) {
93
122
  });
94
123
  }
95
124
 
125
+ const ENDPOINT_EXTENSION = '.server.ts';
126
+ const APP_DIR = 'src/app';
127
+
96
128
  /// <reference types="vite/client" />
97
129
  const FILES = import.meta.glob([
98
130
  '/app/routes/**/*.ts',
@@ -189,11 +221,25 @@ function toRoutes(rawRoutes, files) {
189
221
  ? toRoutes(rawRoute.children, files)
190
222
  : undefined;
191
223
  let module = undefined;
224
+ let analogMeta = undefined;
192
225
  if (rawRoute.filename) {
193
226
  const isMarkdownFile = rawRoute.filename.endsWith('.md');
194
227
  module = isMarkdownFile
195
228
  ? toMarkdownModule(files[rawRoute.filename])
196
229
  : files[rawRoute.filename];
230
+ const endpointKey = rawRoute.filename.replace(/\.page\.ts$/, ENDPOINT_EXTENSION);
231
+ // get endpoint path
232
+ const rawEndpoint = rawRoute.filename
233
+ .replace(/\.page\.ts$/, '')
234
+ .split(APP_DIR)[1];
235
+ // replace periods, remove (index) paths
236
+ const endpoint = (rawEndpoint || '')
237
+ .replace(/\./g, '/')
238
+ .replace(/\/\((.*?)\)$/, '/-$1-');
239
+ analogMeta = {
240
+ endpoint,
241
+ endpointKey,
242
+ };
197
243
  }
198
244
  const route = module
199
245
  ? {
@@ -204,6 +250,7 @@ function toRoutes(rawRoutes, files) {
204
250
  component: m.default,
205
251
  ...toRouteConfig(m.routeMeta),
206
252
  children,
253
+ [ANALOG_META_KEY]: analogMeta,
207
254
  },
208
255
  ]),
209
256
  }
@@ -304,9 +351,16 @@ function provideFileRouter(...features) {
304
351
  ]);
305
352
  }
306
353
 
354
+ function injectLoad(options) {
355
+ !options?.injector && assertInInjectionContext(injectLoad);
356
+ const injector = options?.injector ?? inject(Injector);
357
+ const route = injector.get(ActivatedRoute);
358
+ return route.data.pipe(map((data) => data['load']));
359
+ }
360
+
307
361
  /**
308
362
  * Generated bundle index. Do not edit.
309
363
  */
310
364
 
311
- export { defineRouteMeta, injectActivatedRoute, injectRouter, provideFileRouter, routes };
365
+ export { defineRouteMeta, injectActivatedRoute, injectLoad, injectRouter, provideFileRouter, routes };
312
366
  //# sourceMappingURL=analogjs-router.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"analogjs-router.mjs","sources":["../../../../packages/router/src/lib/meta-tags.ts","../../../../packages/router/src/lib/route-config.ts","../../../../packages/router/src/lib/markdown-helpers.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/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","import { RedirectRouteMeta, RouteConfig, RouteMeta } from './models';\nimport { ROUTE_META_TAGS_KEY } from './meta-tags';\n\nexport function toRouteConfig(routeMeta: RouteMeta | undefined): RouteConfig {\n if (!routeMeta) {\n return {};\n }\n\n if (isRedirectRouteMeta(routeMeta)) {\n return routeMeta;\n }\n\n const { 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 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\nexport function toMarkdownModule(\n markdownFileFactory: () => Promise<string>\n): () => Promise<RouteExport> {\n return () =>\n Promise.all([import('@analogjs/content'), markdownFileFactory()]).then(\n ([\n { parseRawContentFile, MarkdownRouteComponent, ContentRenderer },\n markdownFile,\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}\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';\n\nconst FILES = import.meta.glob<RouteExport>([\n '/app/routes/**/*.ts',\n '/src/app/routes/**/*.ts',\n '/src/app/pages/**/*.page.ts',\n]);\n\nconst CONTENT_FILES = import.meta.glob<string>(\n ['/src/app/routes/**/*.md', '/src/app/pages/**/*.md'],\n { as: 'raw' }\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)$)|(\\.(ts|md)$)/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\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\n const route: Route = 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 },\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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAKO,MAAM,mBAAmB,GAAG,MAAM,CACvC,sCAAsC,CACvC,CAAC;AAEF,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,cAAc,GAAG,WAAW,CAAC;AACnC;AACA,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,WAAW,GAAG,SAAS,CAAC;SA8Bd,2BAA2B,GAAA;AACzC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9B,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAEjC,IAAA,MAAM,CAAC,MAAM;AACV,SAAA,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,CAAC;SACvD,SAAS,CAAC,MAAK;AACd,QAAA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnE,QAAA,KAAK,MAAM,eAAe,IAAI,UAAU,EAAE;AACxC,YAAA,MAAM,OAAO,GAAG,UAAU,CACxB,eAAkC,CACtB,CAAC;AACf,YAAA,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACjD,SAAA;AACH,KAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,aAAa,CAAC,KAA6B,EAAA;IAClD,MAAM,UAAU,GAAG,EAAgB,CAAC;IACpC,IAAI,YAAY,GAAkC,KAAK,CAAC;AAExD,IAAA,OAAO,YAAY,EAAE;QACnB,MAAM,QAAQ,GAAc,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;AACzE,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;AACnD,SAAA;AAED,QAAA,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC;AACxC,KAAA;AAED,IAAA,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB,EAAA;IAC1C,IAAI,OAAO,CAAC,IAAI,EAAE;AAChB,QAAA,OAAO,GAAG,QAAQ,CAAA,EAAA,EAAK,OAAO,CAAC,IAAI,GAAG,CAAC;AACxC,KAAA;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE;AACpB,QAAA,OAAO,GAAG,YAAY,CAAA,EAAA,EAAK,OAAO,CAAC,QAAQ,GAAG,CAAC;AAChD,KAAA;IAED,IAAI,OAAO,CAAC,SAAS,EAAE;AACrB,QAAA,OAAO,GAAG,uBAAuB,CAAA,EAAA,EAAK,OAAO,CAAC,SAAS,GAAG,CAAC;AAC5D,KAAA;AAED,IAAA,OAAO,WAAW,CAAC;AACrB;;AC1FM,SAAU,aAAa,CAAC,SAAgC,EAAA;IAC5D,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AAED,IAAA,IAAI,mBAAmB,CAAC,SAAS,CAAC,EAAE;AAClC,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC;AAE3C,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,QAAA,WAAW,CAAC,IAAI,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,mBAAmB,GAAG,IAAI,EAAE,CAAC;AACzE,KAAA;AAAM,SAAA,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;QACrC,WAAW,CAAC,OAAO,GAAG;YACpB,GAAG,WAAW,CAAC,OAAO;YACtB,CAAC,mBAAmB,GAAG,IAAI;SAC5B,CAAC;AACH,KAAA;AAED,IAAA,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAoB,EAAA;AAEpB,IAAA,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;AAChC;;AC3BM,SAAU,gBAAgB,CAC9B,mBAA0C,EAAA;AAE1C,IAAA,OAAO,MACL,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CACpE,CAAC,CACC,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,eAAe,EAAE,EAChE,YAAY,EACb,KAAI;QACH,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;AAClE,QAAA,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QAEnC,OAAO;AACL,YAAA,OAAO,EAAE,sBAAsB;AAC/B,YAAA,SAAS,EAAE;AACT,gBAAA,IAAI,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;gBACjC,KAAK;gBACL,IAAI;AACJ,gBAAA,OAAO,EAAE;oBACP,qBAAqB,EAAE,YAAW;AAChC,wBAAA,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAChD,wBAAA,OAAO,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;qBACxC;AACF,iBAAA;AACF,aAAA;SACF,CAAC;AACJ,KAAC,CACF,CAAC;AACN;;AC/BA;AAQA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAc;IAC1C,qBAAqB;IACrB,yBAAyB;IACzB,6BAA6B;AAC9B,CAAA,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CACpC,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,EACrD,EAAE,EAAE,EAAE,KAAK,EAAE,CACd,CAAC;AAiBF;;;;;AAKG;AACG,SAAU,YAAY,CAAC,KAAY,EAAA;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAErC,IAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;;IAGD,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAI;AAC7D,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;;;AAIvC,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AACrC,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,mBAAmB,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAExD,OAAO;AACL,YAAA,GAAG,GAAG;YACN,CAAC,KAAK,GAAG;gBACP,GAAG,GAAG,CAAC,KAAK,CAAC;gBACb,CAAC,OAAO,GAAG;oBACT,QAAQ;oBACR,UAAU;oBACV,mBAAmB;AACnB,oBAAA,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC;oBAC9B,KAAK;AACL,oBAAA,QAAQ,EAAE,EAAE;AACb,iBAAA;AACF,aAAA;SACF,CAAC;KACH,EAAE,EAAwB,CAAC,CAAC;AAE7B,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;;IAGxC,KAAK,IAAI,KAAK,GAAG,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;AAC7C,QAAA,MAAM,YAAY,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAE3C,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,qBAAqB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;YACtE,MAAM,gBAAgB,GACpB,QAAQ,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;;;AAItD,YAAA,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;YACtC,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK;AAChD,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,UAAU,EAAE,gBAAgB;gBAC5B,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CACrD,CAAC,EACD,qBAAqB,CACtB;AACD,gBAAA,OAAO,EAAE,SAAS,CAAC,gBAAgB,CAAC;gBACpC,KAAK,EAAE,KAAK,GAAG,CAAC;AAChB,gBAAA,QAAQ,EAAE,EAAE;aACb,CAAC;AAEF,YAAA,mBAAmB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACvE,SAAA;AACF,KAAA;;;AAID,IAAA,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CACjD,CAAC,OAAO,KAAK,gBAAgB,CAAC,OAAO,CAAC,CACvC,CAAC;IACF,aAAa,CAAC,SAAS,CAAC,CAAC;AAEzB,IAAA,OAAO,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAA;AACjC,IAAA,OAAO,QAAQ;SACZ,OAAO;;IAEN,uFAAuF,EACvF,EAAE,CACH;AACA,SAAA,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC;AAC5B,SAAA,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB,EAAA;AACnC,IAAA,OAAO,UAAU;AACd,SAAA,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;AAC7B,SAAA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACvB,SAAA,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,QAAQ,CAAC,SAAqB,EAAE,KAAY,EAAA;IACnD,MAAM,MAAM,GAAY,EAAE,CAAC;AAE3B,IAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;QAChC,MAAM,QAAQ,GACZ,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;cACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;cAClC,SAAS,CAAC;QAChB,IAAI,MAAM,GAA6C,SAAS,CAAC;QAEjE,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACrB,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzD,YAAA,MAAM,GAAG,cAAc;kBACnB,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAA0B,CAAC;AACrE,kBAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAgC,CAAC;AAC9D,SAAA;QAED,MAAM,KAAK,GAAU,MAAM;AACzB,cAAE;gBACE,IAAI,EAAE,QAAQ,CAAC,OAAO;AACtB,gBAAA,YAAY,EAAE,MACZ,MAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;AACpB,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;wBACR,SAAS,EAAE,CAAC,CAAC,OAAO;AACpB,wBAAA,GAAG,aAAa,CAAC,CAAC,CAAC,SAAkC,CAAC;wBACtD,QAAQ;AACT,qBAAA;iBACF,CAAC;AACL,aAAA;cACD,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;AAEzC,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpB,KAAA;AAED,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,SAAqB,EAAA;IAC1C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;QACtB,IAAI,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;;QAG9C,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE;AACzC,YAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAC;AAC3B,SAAA;aAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE;AAChD,YAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAC;AAC3B,SAAA;AAED,QAAA,OAAO,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,KAAC,CAAC,CAAC;AAEH,IAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;AAChC,QAAA,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,KAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe,EAAA;;AAE1C,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAEM,MAAM,MAAM,GAAY,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,aAAa,EAAE;;AC3L1E;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;AACU,MAAA,eAAe,GAAG,CAAC,KAAsB,KAAI;AACxD,IAAA,OAAO,KAAK,CAAC;AACf,EAAE;AAEF;;;;AAIG;AACI,MAAM,YAAY,GAAG,MAAK;AAC/B,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,EAAE;AAEF;;;;AAIG;AACI,MAAM,oBAAoB,GAAG,MAAK;AACvC,IAAA,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC;AAChC;;AClDA;;;;;;;AAOG;AACa,SAAA,iBAAiB,CAC/B,GAAG,QAA0B,EAAA;AAE7B,IAAA,OAAO,wBAAwB,CAAC;;;AAI5B,QAAA,aAAa,CAAC,MAAM,EAAE,GAAG,QAAQ,CAGlC,CAAC,UAAU;AACZ,QAAA;AACE,YAAA,OAAO,EAAE,uBAAuB;AAChC,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE,MAAM,2BAA2B,EAAE;AAC9C,SAAA;AACF,KAAA,CAAC,CAAC;AACL;;ACpCA;;AAEG;;;;"}
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 } = route;\n const url = new URL('', import.meta.env['VITE_ANALOG_PUBLIC_BASE_URL']);\n url.pathname = `/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\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\nexport function toMarkdownModule(\n markdownFileFactory: () => Promise<string>\n): () => Promise<RouteExport> {\n return () =>\n Promise.all([import('@analogjs/content'), markdownFileFactory()]).then(\n ([\n { parseRawContentFile, MarkdownRouteComponent, ContentRenderer },\n markdownFile,\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}\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]);\n\nconst CONTENT_FILES = import.meta.glob<string>(\n ['/src/app/routes/**/*.md', '/src/app/pages/**/*.md'],\n { as: 'raw' }\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)$)|(\\.(ts|md)$)/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$/,\n ENDPOINT_EXTENSION\n );\n\n // get endpoint path\n const rawEndpoint = rawRoute.filename\n .replace(/\\.page\\.ts$/, '')\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, assertInInjectionContext, 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 !options?.injector && assertInInjectionContext(injectLoad);\n\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/index.d.ts CHANGED
@@ -3,3 +3,5 @@ export { defineRouteMeta, injectActivatedRoute, injectRouter, } from './lib/defi
3
3
  export { RouteMeta } from './lib/models';
4
4
  export { provideFileRouter } from './lib/provide-file-router';
5
5
  export { MetaTag } from './lib/meta-tags';
6
+ export { PageServerLoad, LoadResult } from './lib/route-types';
7
+ export { injectLoad } from './lib/inject-load';
@@ -0,0 +1,2 @@
1
+ export declare const ENDPOINT_EXTENSION = ".server.ts";
2
+ export declare const APP_DIR = "src/app";
@@ -0,0 +1,2 @@
1
+ export declare const ANALOG_META_KEY: unique symbol;
2
+ export declare const PAGE_ENDPOINTS: Record<string, () => Promise<unknown>>;
@@ -0,0 +1,6 @@
1
+ import { Injector } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { PageServerLoad } from './route-types';
4
+ export declare function injectLoad<T extends (pageServerLoad: PageServerLoad) => Promise<any>>(options?: {
5
+ injector?: Injector;
6
+ }): Observable<Awaited<ReturnType<T>>>;
@@ -0,0 +1,9 @@
1
+ import type { H3Event, H3EventContext } from 'h3';
2
+ import { $Fetch } from 'nitropack';
3
+ export type PageServerLoad = {
4
+ params: H3EventContext['params'];
5
+ req: H3Event['node']['req'];
6
+ res: H3Event['node']['res'];
7
+ fetch: $Fetch;
8
+ };
9
+ export type LoadResult<A extends (pageServerLoad: PageServerLoad) => Promise<any>> = Awaited<ReturnType<A>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/router",
3
- "version": "0.2.0-beta.15",
3
+ "version": "0.2.0-beta.16",
4
4
  "description": "Filesystem-based routing for Angular",
5
5
  "author": "Brandon Roberts <robertsbt@gmail.com>",
6
6
  "keywords": [
@@ -23,7 +23,7 @@
23
23
  "@angular/router": "^15.0.0 || ^16.0.0"
24
24
  },
25
25
  "optionalDependencies": {
26
- "@analogjs/content": "^0.2.0-beta.15"
26
+ "@analogjs/content": "^0.2.0-beta.16"
27
27
  },
28
28
  "dependencies": {
29
29
  "tslib": "^2.0.0"