@reckona/mreact-router 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/actions.d.ts +43 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +577 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/adapters/aws-lambda.d.ts +45 -0
  8. package/dist/adapters/aws-lambda.d.ts.map +1 -0
  9. package/dist/adapters/aws-lambda.js +168 -0
  10. package/dist/adapters/aws-lambda.js.map +1 -0
  11. package/dist/adapters/cloudflare.d.ts +94 -0
  12. package/dist/adapters/cloudflare.d.ts.map +1 -0
  13. package/dist/adapters/cloudflare.js +390 -0
  14. package/dist/adapters/cloudflare.js.map +1 -0
  15. package/dist/adapters/devtools.d.ts +4 -0
  16. package/dist/adapters/devtools.d.ts.map +1 -0
  17. package/dist/adapters/devtools.js +5 -0
  18. package/dist/adapters/devtools.js.map +1 -0
  19. package/dist/adapters/edge.d.ts +9 -0
  20. package/dist/adapters/edge.d.ts.map +1 -0
  21. package/dist/adapters/edge.js +53 -0
  22. package/dist/adapters/edge.js.map +1 -0
  23. package/dist/adapters/node.d.ts +26 -0
  24. package/dist/adapters/node.d.ts.map +1 -0
  25. package/dist/adapters/node.js +64 -0
  26. package/dist/adapters/node.js.map +1 -0
  27. package/dist/adapters/static.d.ts +10 -0
  28. package/dist/adapters/static.d.ts.map +1 -0
  29. package/dist/adapters/static.js +34 -0
  30. package/dist/adapters/static.js.map +1 -0
  31. package/dist/assets.d.ts +18 -0
  32. package/dist/assets.d.ts.map +1 -0
  33. package/dist/assets.js +67 -0
  34. package/dist/assets.js.map +1 -0
  35. package/dist/build.d.ts +36 -0
  36. package/dist/build.d.ts.map +1 -0
  37. package/dist/build.js +322 -0
  38. package/dist/build.js.map +1 -0
  39. package/dist/cache.d.ts +54 -0
  40. package/dist/cache.d.ts.map +1 -0
  41. package/dist/cache.js +221 -0
  42. package/dist/cache.js.map +1 -0
  43. package/dist/cli.d.ts +3 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +37 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/client.d.ts +105 -0
  48. package/dist/client.d.ts.map +1 -0
  49. package/dist/client.js +1268 -0
  50. package/dist/client.js.map +1 -0
  51. package/dist/config.d.ts +27 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +44 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/cookies.d.ts +14 -0
  56. package/dist/cookies.d.ts.map +1 -0
  57. package/dist/cookies.js +69 -0
  58. package/dist/cookies.js.map +1 -0
  59. package/dist/csp.d.ts +6 -0
  60. package/dist/csp.d.ts.map +1 -0
  61. package/dist/csp.js +70 -0
  62. package/dist/csp.js.map +1 -0
  63. package/dist/dev-server.d.ts +16 -0
  64. package/dist/dev-server.d.ts.map +1 -0
  65. package/dist/dev-server.js +103 -0
  66. package/dist/dev-server.js.map +1 -0
  67. package/dist/http.d.ts +23 -0
  68. package/dist/http.d.ts.map +1 -0
  69. package/dist/http.js +106 -0
  70. package/dist/http.js.map +1 -0
  71. package/dist/i18n.d.ts +15 -0
  72. package/dist/i18n.d.ts.map +1 -0
  73. package/dist/i18n.js +61 -0
  74. package/dist/i18n.js.map +1 -0
  75. package/dist/import-policy.d.ts +30 -0
  76. package/dist/import-policy.d.ts.map +1 -0
  77. package/dist/import-policy.js +105 -0
  78. package/dist/import-policy.js.map +1 -0
  79. package/dist/index.d.ts +60 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +34 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/logger.d.ts +47 -0
  84. package/dist/logger.d.ts.map +1 -0
  85. package/dist/logger.js +60 -0
  86. package/dist/logger.js.map +1 -0
  87. package/dist/module-runner.d.ts +9 -0
  88. package/dist/module-runner.d.ts.map +1 -0
  89. package/dist/module-runner.js +112 -0
  90. package/dist/module-runner.js.map +1 -0
  91. package/dist/native-escape.d.ts +2 -0
  92. package/dist/native-escape.d.ts.map +1 -0
  93. package/dist/native-escape.js +43 -0
  94. package/dist/native-escape.js.map +1 -0
  95. package/dist/native-route-matcher.d.ts +5 -0
  96. package/dist/native-route-matcher.d.ts.map +1 -0
  97. package/dist/native-route-matcher.js +91 -0
  98. package/dist/native-route-matcher.js.map +1 -0
  99. package/dist/navigation.d.ts +25 -0
  100. package/dist/navigation.d.ts.map +1 -0
  101. package/dist/navigation.js +125 -0
  102. package/dist/navigation.js.map +1 -0
  103. package/dist/prerender-store.d.ts +37 -0
  104. package/dist/prerender-store.d.ts.map +1 -0
  105. package/dist/prerender-store.js +158 -0
  106. package/dist/prerender-store.js.map +1 -0
  107. package/dist/render.d.ts +26 -0
  108. package/dist/render.d.ts.map +1 -0
  109. package/dist/render.js +1688 -0
  110. package/dist/render.js.map +1 -0
  111. package/dist/route-path.d.ts +2 -0
  112. package/dist/route-path.d.ts.map +1 -0
  113. package/dist/route-path.js +5 -0
  114. package/dist/route-path.js.map +1 -0
  115. package/dist/route-source.d.ts +9 -0
  116. package/dist/route-source.d.ts.map +1 -0
  117. package/dist/route-source.js +44 -0
  118. package/dist/route-source.js.map +1 -0
  119. package/dist/routes.d.ts +38 -0
  120. package/dist/routes.d.ts.map +1 -0
  121. package/dist/routes.js +168 -0
  122. package/dist/routes.js.map +1 -0
  123. package/dist/serve.d.ts +63 -0
  124. package/dist/serve.d.ts.map +1 -0
  125. package/dist/serve.js +445 -0
  126. package/dist/serve.js.map +1 -0
  127. package/dist/session.d.ts +25 -0
  128. package/dist/session.d.ts.map +1 -0
  129. package/dist/session.js +104 -0
  130. package/dist/session.js.map +1 -0
  131. package/dist/vite-config.d.ts +8 -0
  132. package/dist/vite-config.d.ts.map +1 -0
  133. package/dist/vite-config.js +17 -0
  134. package/dist/vite-config.js.map +1 -0
  135. package/dist/vite.d.ts +25 -0
  136. package/dist/vite.d.ts.map +1 -0
  137. package/dist/vite.js +150 -0
  138. package/dist/vite.js.map +1 -0
  139. package/package.json +91 -0
package/dist/build.js ADDED
@@ -0,0 +1,322 @@
1
+ import { createHash } from "node:crypto";
2
+ import { cp, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join, relative, sep } from "node:path";
4
+ import { transform } from "@reckona/mreact-compiler";
5
+ import { buildClientRouteOutput, clientScriptForPath, createClientRouteInferenceCache, detectClientNavigationHint, inferClientRouteModule, isClientRouteModule, routeIdForPath, } from "./client.js";
6
+ import { importAppRouterSourceModule } from "./module-runner.js";
7
+ import { scanAppRoutes } from "./routes.js";
8
+ import { resolveAppRouterProjectOptions, } from "./config.js";
9
+ import { renderAppRequest } from "./render.js";
10
+ import { hasGenerateStaticParamsExport, hasPrerenderExport, isStreamRouteSource, stripRouteBuildExports, stripRouteClientOnlyExports, } from "./route-source.js";
11
+ const nativeEscapeTransform = {
12
+ batchImportName: "escapeHtmlBatch",
13
+ batchImportSource: "@reckona/mreact-router/internal/native-escape",
14
+ };
15
+ export async function buildApp(options) {
16
+ const project = resolveAppRouterProjectOptions(options);
17
+ const routes = await scanAppRoutes({ appDir: project.routesDir });
18
+ const serverDir = join(options.outDir, "server");
19
+ const clientDir = join(options.outDir, "client");
20
+ await validateProductionRoutes(routes);
21
+ await rm(options.outDir, { force: true, recursive: true });
22
+ await mkdir(serverDir, { recursive: true });
23
+ await mkdir(clientDir, { recursive: true });
24
+ await mkdir(join(clientDir, ".vite"), { recursive: true });
25
+ await mkdir(join(clientDir, "assets", "routes"), { recursive: true });
26
+ await copyPublicAssets(project.publicDir, join(clientDir, "public"));
27
+ const files = await collectBuildFiles(project.projectRoot, project.allowedSourceDirs);
28
+ const clientRouteInferenceCache = createClientRouteInferenceCache();
29
+ const serverModules = await buildServerModuleArtifacts({
30
+ clientRouteInferenceCache,
31
+ files,
32
+ projectRoot: project.projectRoot,
33
+ routes,
34
+ });
35
+ const serverRoutes = routes.map((route) => ({
36
+ ...route,
37
+ file: relative(project.projectRoot, route.file),
38
+ }));
39
+ const clientRoutes = await Promise.all(routes.map((route) => writeClientRouteBundle(route, clientDir, clientRouteInferenceCache)));
40
+ const prerenderedRoutes = await prerenderStaticRoutes({
41
+ appDir: project.routesDir,
42
+ assetBaseUrl: project.assetBaseUrl,
43
+ clientRoutes,
44
+ routes,
45
+ });
46
+ await writeFile(join(serverDir, "manifest.json"), JSON.stringify({
47
+ allowedSourceDirs: project.allowedSourceDirs.map((directory) => relative(project.projectRoot, directory)),
48
+ ...(project.assetBaseUrl === undefined ? {} : { assetBaseUrl: project.assetBaseUrl }),
49
+ version: 1,
50
+ routes: serverRoutes,
51
+ routesDir: relative(project.projectRoot, project.routesDir),
52
+ files,
53
+ prerenderedRoutes,
54
+ ...(project.publicAssetBaseUrl === undefined
55
+ ? {}
56
+ : { publicAssetBaseUrl: project.publicAssetBaseUrl }),
57
+ serverModules,
58
+ }, null, 2));
59
+ await writeFile(join(clientDir, "manifest.json"), JSON.stringify({ routes: clientRoutes }, null, 2));
60
+ await writeFile(join(clientDir, ".vite", "manifest.json"), JSON.stringify(viteManifestFromClientRoutes(clientRoutes), null, 2));
61
+ return { routes };
62
+ }
63
+ async function copyPublicAssets(publicDir, outDir) {
64
+ try {
65
+ await cp(publicDir, outDir, { force: true, recursive: true });
66
+ }
67
+ catch (error) {
68
+ if (isNodeError(error) && error.code === "ENOENT") {
69
+ return;
70
+ }
71
+ throw error;
72
+ }
73
+ }
74
+ function isNodeError(error) {
75
+ return error instanceof Error && "code" in error;
76
+ }
77
+ async function prerenderStaticRoutes(options) {
78
+ const clientScripts = new Map(options.clientRoutes.flatMap((route) => route.client && route.script !== undefined ? [[route.path, route.script]] : []));
79
+ const prerendered = {};
80
+ for (const route of options.routes) {
81
+ if (route.kind !== "page") {
82
+ continue;
83
+ }
84
+ const source = await readFile(route.file, "utf8");
85
+ if (!hasPrerenderExport(source)) {
86
+ continue;
87
+ }
88
+ for (const pathname of await prerenderPathsForRoute(route, source)) {
89
+ const response = await renderAppRequest({
90
+ appDir: options.appDir,
91
+ assetBaseUrl: options.assetBaseUrl,
92
+ clientScripts,
93
+ request: new Request(`http://mreact.local${pathname}`),
94
+ });
95
+ const headers = {};
96
+ response.headers.forEach((value, key) => {
97
+ headers[key] = value;
98
+ });
99
+ prerendered[pathname] = {
100
+ headers,
101
+ html: await response.text(),
102
+ status: response.status,
103
+ };
104
+ }
105
+ }
106
+ return prerendered;
107
+ }
108
+ async function prerenderPathsForRoute(route, source) {
109
+ if (route.segments.every((segment) => segment.kind === "static")) {
110
+ return [route.path];
111
+ }
112
+ if (!hasGenerateStaticParamsExport(source)) {
113
+ return [];
114
+ }
115
+ const module = await importAppRouterSourceModule({
116
+ code: source,
117
+ label: `generate-static-params:${route.file}`,
118
+ resolveDir: dirname(route.file),
119
+ sourcefile: route.file,
120
+ });
121
+ const params = await module.generateStaticParams?.();
122
+ if (params === undefined) {
123
+ return [];
124
+ }
125
+ return Array.from(params, (entry) => routePathFromParams(route, entry));
126
+ }
127
+ function routePathFromParams(route, params) {
128
+ const parts = route.segments.flatMap((segment) => {
129
+ if (segment.kind === "static") {
130
+ return [segment.value];
131
+ }
132
+ const value = params[segment.name];
133
+ if (value === undefined) {
134
+ throw new Error(`${route.file}: generateStaticParams() is missing "${segment.name}".`);
135
+ }
136
+ if (segment.kind === "catch-all") {
137
+ const values = Array.isArray(value) ? value : String(value).split("/");
138
+ return values.map((part) => encodeURIComponent(String(part)));
139
+ }
140
+ return [encodeURIComponent(String(value))];
141
+ });
142
+ return `/${parts.join("/")}`;
143
+ }
144
+ async function buildServerModuleArtifacts(options) {
145
+ const routeByFile = new Map(options.routes.map((route) => [relative(options.projectRoot, route.file), route]));
146
+ const artifacts = {};
147
+ for (const [file, source] of Object.entries(options.files)) {
148
+ if (!isServerComponentFile(file)) {
149
+ continue;
150
+ }
151
+ const route = routeByFile.get(file);
152
+ const serverOutputs = route !== undefined && isStreamRouteSource(source)
153
+ ? ["stream", "string"]
154
+ : ["string"];
155
+ const code = route === undefined ? source : stripRouteBuildExports(source);
156
+ const clientBoundaryImports = route === undefined
157
+ ? []
158
+ : (await inferClientRouteModule({
159
+ cache: options.clientRouteInferenceCache,
160
+ code: stripRouteClientOnlyExports(source),
161
+ filename: join(options.projectRoot, file),
162
+ routePath: route.path,
163
+ })).clientBoundaryImports;
164
+ const artifact = {};
165
+ for (const serverOutput of serverOutputs) {
166
+ const output = transform({
167
+ code,
168
+ clientBoundaryImports,
169
+ dev: false,
170
+ filename: join(options.projectRoot, file),
171
+ serverEscape: nativeEscapeTransform,
172
+ serverOutput,
173
+ target: "server",
174
+ });
175
+ const fatalDiagnostics = output.diagnostics.filter((diagnostic) => diagnostic.code !== "MR_UNSUPPORTED_SERVER_EVENT_HANDLER");
176
+ if (fatalDiagnostics.length > 0) {
177
+ throw new Error(`${file}: ${fatalDiagnostics
178
+ .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)
179
+ .join("\n")}`);
180
+ }
181
+ artifact[serverOutput] = {
182
+ code: output.code,
183
+ metadata: output.metadata,
184
+ sourceHash: hashText(code),
185
+ };
186
+ }
187
+ artifacts[file] = artifact;
188
+ }
189
+ return artifacts;
190
+ }
191
+ function isServerComponentFile(file) {
192
+ return /(?:^|\/)(?:page|layout|template|loading|error|not-found)(?:\.mreact)?\.tsx$/.test(file);
193
+ }
194
+ function viteManifestFromClientRoutes(routes) {
195
+ const manifest = {};
196
+ for (const route of routes) {
197
+ if (!route.client || route.script === undefined || route.devScript === undefined) {
198
+ continue;
199
+ }
200
+ manifest[route.devScript] = {
201
+ file: route.script,
202
+ isEntry: true,
203
+ name: route.routeId ?? routeIdForPath(route.path),
204
+ src: route.devScript,
205
+ };
206
+ }
207
+ return manifest;
208
+ }
209
+ async function writeClientRouteBundle(route, clientDir, clientRouteInferenceCache) {
210
+ if (route.kind === "server") {
211
+ return { path: route.path, kind: route.kind, client: false };
212
+ }
213
+ const source = await readFile(route.file, "utf8");
214
+ const clientSource = stripRouteClientOnlyExports(source);
215
+ if (!(await isClientRouteModule({
216
+ cache: clientRouteInferenceCache,
217
+ code: clientSource,
218
+ filename: route.file,
219
+ routePath: route.path,
220
+ }))) {
221
+ return { path: route.path, kind: route.kind, client: false };
222
+ }
223
+ let output;
224
+ try {
225
+ output = await buildClientRouteOutput({
226
+ code: clientSource,
227
+ clientNavigation: detectClientNavigationHint(source),
228
+ filename: route.file,
229
+ minify: true,
230
+ routePath: route.path,
231
+ sourceMap: true,
232
+ });
233
+ }
234
+ catch (error) {
235
+ throw new Error(`Failed to build client bundle for ${route.path} (${route.file}).\n${errorMessage(error)}`, { cause: error });
236
+ }
237
+ const routeId = routeIdForPath(route.path);
238
+ const hash = createHash("sha256")
239
+ .update(output.code)
240
+ .update(output.map ?? "")
241
+ .digest("hex")
242
+ .slice(0, 8);
243
+ const script = `assets/routes/${routeId}.${hash}.js`;
244
+ const sourceMap = `${script}.map`;
245
+ const scriptBasename = script.split("/").pop() ?? "route.js";
246
+ const codeWithSourceMap = output.code.replace(/\/\/# sourceMappingURL=route\.js\.map\s*$/, `//# sourceMappingURL=${scriptBasename}.map`);
247
+ const code = output.map === undefined || codeWithSourceMap.includes("sourceMappingURL=")
248
+ ? codeWithSourceMap
249
+ : `${codeWithSourceMap}\n//# sourceMappingURL=${scriptBasename}.map`;
250
+ await mkdir(dirname(join(clientDir, script)), { recursive: true });
251
+ await writeFile(join(clientDir, script), code);
252
+ if (output.map !== undefined) {
253
+ await writeFile(join(clientDir, sourceMap), output.map);
254
+ }
255
+ return {
256
+ bytes: Buffer.byteLength(code),
257
+ path: route.path,
258
+ kind: route.kind,
259
+ client: true,
260
+ routeId,
261
+ script,
262
+ sourceMap,
263
+ devScript: clientScriptForPath(route.path),
264
+ };
265
+ }
266
+ async function validateProductionRoutes(routes) {
267
+ for (const route of routes) {
268
+ if (route.kind !== "page") {
269
+ continue;
270
+ }
271
+ const source = await readFile(route.file, "utf8");
272
+ const output = transform({
273
+ code: stripRouteBuildExports(source),
274
+ dev: false,
275
+ filename: route.file,
276
+ serverEscape: nativeEscapeTransform,
277
+ serverOutput: isStreamRouteSource(source) ? "stream" : "string",
278
+ target: "server",
279
+ });
280
+ const fatalDiagnostics = output.diagnostics.filter((diagnostic) => diagnostic.code !== "MR_UNSUPPORTED_SERVER_EVENT_HANDLER");
281
+ if (fatalDiagnostics.length > 0) {
282
+ throw new Error(`${route.file}: ${fatalDiagnostics
283
+ .map((diagnostic) => `${diagnostic.code}: ${diagnostic.message}`)
284
+ .join("\n")}`);
285
+ }
286
+ }
287
+ }
288
+ async function collectBuildFiles(projectRoot, allowedSourceDirs) {
289
+ const files = {};
290
+ for (const directory of allowedSourceDirs) {
291
+ for (const file of await collectFiles(directory)) {
292
+ const relativeFile = relative(projectRoot, file);
293
+ if (relativeFile === "" || relativeFile.startsWith("..") || relativeFile.startsWith(sep)) {
294
+ continue;
295
+ }
296
+ files[relativeFile] = await readFile(file, "utf8");
297
+ }
298
+ }
299
+ return files;
300
+ }
301
+ async function collectFiles(directory) {
302
+ const entries = await readdir(directory, { withFileTypes: true });
303
+ const files = [];
304
+ for (const entry of entries) {
305
+ const path = join(directory, entry.name);
306
+ if (entry.isDirectory()) {
307
+ files.push(...(await collectFiles(path)));
308
+ continue;
309
+ }
310
+ if (entry.isFile()) {
311
+ files.push(path);
312
+ }
313
+ }
314
+ return files;
315
+ }
316
+ function hashText(text) {
317
+ return createHash("sha256").update(text).digest("hex").slice(0, 16);
318
+ }
319
+ function errorMessage(error) {
320
+ return error instanceof Error ? error.message : String(error);
321
+ }
322
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export interface RouteCachePolicy {
2
+ cacheControl: string;
3
+ revalidateSeconds: number;
4
+ }
5
+ export interface CacheControlOptions {
6
+ maxAge?: number | undefined;
7
+ sMaxAge?: number | undefined;
8
+ staleWhileRevalidate?: boolean | number | undefined;
9
+ }
10
+ export interface AppRouterCacheEntry {
11
+ body: string;
12
+ cacheControl: string;
13
+ expiresAt: number;
14
+ path: string;
15
+ status: number;
16
+ }
17
+ export interface AppRouterCache {
18
+ deleteByPath(path: string): void | Promise<void>;
19
+ get(key: string): AppRouterCacheEntry | undefined | Promise<AppRouterCacheEntry | undefined>;
20
+ set(key: string, entry: AppRouterCacheEntry): void | Promise<void>;
21
+ }
22
+ export declare function createMemoryRouteCache(): AppRouterCache;
23
+ export declare function routeCachePolicyFromSource(code: string): RouteCachePolicy | undefined;
24
+ export declare function cacheControl(options: CacheControlOptions): void;
25
+ export declare function routeCachePolicyFromOptions(options: CacheControlOptions): RouteCachePolicy;
26
+ export declare function cachedRouteResponse(options: {
27
+ cache?: AppRouterCache | undefined;
28
+ key: string;
29
+ now?: number;
30
+ }): Promise<Response | undefined>;
31
+ export declare function cacheRouteResponse(options: {
32
+ cache?: AppRouterCache | undefined;
33
+ key: string;
34
+ now?: number;
35
+ path: string;
36
+ policy: RouteCachePolicy | undefined;
37
+ response: Response;
38
+ }): Promise<Response>;
39
+ export declare function revalidatePath(path: string): void;
40
+ export declare function consumeInvalidations(cache?: AppRouterCache): Promise<void>;
41
+ export declare function withRouteCacheContext<T>(cache: AppRouterCache | undefined, fn: () => T | Promise<T>): Promise<{
42
+ cachePolicy: RouteCachePolicy | undefined;
43
+ revalidatedPaths: string[];
44
+ value: T;
45
+ }>;
46
+ export declare function beginRouteCacheContext(cache: AppRouterCache | undefined): {
47
+ readonly cachePolicy: RouteCachePolicy | undefined;
48
+ dispose(): Promise<{
49
+ revalidatedPaths: string[];
50
+ }>;
51
+ };
52
+ export declare function routeCacheKey(appDir: string, routePath: string, url: URL): string;
53
+ export declare function stripRevalidateExport(code: string): string;
54
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/cache.js ADDED
@@ -0,0 +1,221 @@
1
+ const cacheState = (globalThis.__mreactAppRouterCache ??= {
2
+ activeContexts: [],
3
+ invalidatedPaths: new Set(),
4
+ memoryCache: createMemoryRouteCache(),
5
+ });
6
+ export function createMemoryRouteCache() {
7
+ const cachedRoutes = new Map();
8
+ const keysByPath = new Map();
9
+ return {
10
+ deleteByPath(path) {
11
+ const normalizedPath = normalizeRevalidationPath(path);
12
+ const keys = keysByPath.get(normalizedPath);
13
+ if (keys === undefined) {
14
+ return;
15
+ }
16
+ for (const key of keys) {
17
+ cachedRoutes.delete(key);
18
+ }
19
+ keysByPath.delete(normalizedPath);
20
+ },
21
+ get(key) {
22
+ return cachedRoutes.get(key);
23
+ },
24
+ set(key, entry) {
25
+ const previous = cachedRoutes.get(key);
26
+ if (previous !== undefined && previous.path !== entry.path) {
27
+ const previousKeys = keysByPath.get(previous.path);
28
+ previousKeys?.delete(key);
29
+ if (previousKeys?.size === 0) {
30
+ keysByPath.delete(previous.path);
31
+ }
32
+ }
33
+ cachedRoutes.set(key, entry);
34
+ const keys = keysByPath.get(entry.path);
35
+ if (keys === undefined) {
36
+ keysByPath.set(entry.path, new Set([key]));
37
+ return;
38
+ }
39
+ keys.add(key);
40
+ },
41
+ };
42
+ }
43
+ export function routeCachePolicyFromSource(code) {
44
+ const match = /^\s*export\s+const\s+revalidate\s*=\s*(?<seconds>\d+)\s*;?\s*$/m.exec(code);
45
+ const seconds = match?.groups?.seconds === undefined ? undefined : Number(match.groups.seconds);
46
+ if (seconds === undefined || !Number.isFinite(seconds)) {
47
+ return undefined;
48
+ }
49
+ return {
50
+ cacheControl: seconds === 0 ? "no-store" : `s-maxage=${seconds}, stale-while-revalidate`,
51
+ revalidateSeconds: seconds,
52
+ };
53
+ }
54
+ export function cacheControl(options) {
55
+ const activeContext = cacheState.activeContexts.at(-1);
56
+ if (activeContext === undefined) {
57
+ throw new Error("cacheControl() must be called during an app router request.");
58
+ }
59
+ activeContext.cachePolicy = routeCachePolicyFromOptions(options);
60
+ }
61
+ export function routeCachePolicyFromOptions(options) {
62
+ const directives = [];
63
+ const maxAge = cacheControlSeconds(options.maxAge, "maxAge");
64
+ const sMaxAge = cacheControlSeconds(options.sMaxAge, "sMaxAge");
65
+ if (maxAge !== undefined) {
66
+ directives.push(`max-age=${maxAge}`);
67
+ }
68
+ if (sMaxAge !== undefined) {
69
+ directives.push(`s-maxage=${sMaxAge}`);
70
+ }
71
+ if (options.staleWhileRevalidate !== undefined) {
72
+ directives.push(staleWhileRevalidateDirective(options.staleWhileRevalidate));
73
+ }
74
+ if (directives.length === 0) {
75
+ throw new Error("cacheControl() requires at least one cache directive.");
76
+ }
77
+ return {
78
+ cacheControl: directives.join(", "),
79
+ revalidateSeconds: sMaxAge ?? 0,
80
+ };
81
+ }
82
+ export function cachedRouteResponse(options) {
83
+ return Promise.resolve().then(async () => {
84
+ const cache = options.cache ?? cacheState.memoryCache;
85
+ await consumeInvalidations(cache);
86
+ const cached = await cache.get(options.key);
87
+ if (cached === undefined || cached.expiresAt <= (options.now ?? Date.now())) {
88
+ return undefined;
89
+ }
90
+ return new Response(cached.body, {
91
+ headers: {
92
+ "cache-control": cached.cacheControl,
93
+ "content-type": "text/html; charset=utf-8",
94
+ "x-mreact-cache": "HIT",
95
+ },
96
+ status: cached.status,
97
+ });
98
+ });
99
+ }
100
+ export async function cacheRouteResponse(options) {
101
+ if (options.policy === undefined) {
102
+ return options.response;
103
+ }
104
+ if (options.policy.revalidateSeconds === 0) {
105
+ options.response.headers.set("cache-control", options.policy.cacheControl);
106
+ return options.response;
107
+ }
108
+ const body = await options.response.text();
109
+ const cacheControl = options.policy.cacheControl;
110
+ const status = options.response.status;
111
+ await (options.cache ?? cacheState.memoryCache).set(options.key, {
112
+ body,
113
+ cacheControl,
114
+ expiresAt: (options.now ?? Date.now()) + options.policy.revalidateSeconds * 1000,
115
+ path: normalizeRevalidationPath(options.path),
116
+ status,
117
+ });
118
+ return new Response(body, {
119
+ headers: {
120
+ "cache-control": cacheControl,
121
+ "content-type": options.response.headers.get("content-type") ?? "text/html; charset=utf-8",
122
+ "x-mreact-cache": "MISS",
123
+ },
124
+ status,
125
+ });
126
+ }
127
+ export function revalidatePath(path) {
128
+ const normalizedPath = normalizeRevalidationPath(path);
129
+ const activeContext = cacheState.activeContexts.at(-1);
130
+ if (activeContext !== undefined) {
131
+ activeContext.revalidatedPaths.add(normalizedPath);
132
+ return;
133
+ }
134
+ cacheState.invalidatedPaths.add(normalizedPath);
135
+ }
136
+ export async function consumeInvalidations(cache = cacheState.memoryCache) {
137
+ if (cacheState.invalidatedPaths.size === 0) {
138
+ return;
139
+ }
140
+ for (const path of cacheState.invalidatedPaths) {
141
+ await cache.deleteByPath(path);
142
+ }
143
+ cacheState.invalidatedPaths.clear();
144
+ }
145
+ export async function withRouteCacheContext(cache, fn) {
146
+ const context = {
147
+ cache: cache ?? cacheState.memoryCache,
148
+ revalidatedPaths: new Set(),
149
+ };
150
+ cacheState.activeContexts.push(context);
151
+ try {
152
+ const value = await fn();
153
+ const cachePolicy = context.cachePolicy;
154
+ const revalidatedPaths = Array.from(context.revalidatedPaths);
155
+ for (const path of revalidatedPaths) {
156
+ await context.cache.deleteByPath(path);
157
+ }
158
+ return { cachePolicy, revalidatedPaths, value };
159
+ }
160
+ finally {
161
+ cacheState.activeContexts.pop();
162
+ }
163
+ }
164
+ export function beginRouteCacheContext(cache) {
165
+ const context = {
166
+ cache: cache ?? cacheState.memoryCache,
167
+ revalidatedPaths: new Set(),
168
+ };
169
+ cacheState.activeContexts.push(context);
170
+ return {
171
+ get cachePolicy() {
172
+ return context.cachePolicy;
173
+ },
174
+ async dispose() {
175
+ const revalidatedPaths = Array.from(context.revalidatedPaths);
176
+ for (const path of revalidatedPaths) {
177
+ await context.cache.deleteByPath(path);
178
+ }
179
+ const index = cacheState.activeContexts.lastIndexOf(context);
180
+ if (index !== -1) {
181
+ cacheState.activeContexts.splice(index, 1);
182
+ }
183
+ return { revalidatedPaths };
184
+ },
185
+ };
186
+ }
187
+ // Host is excluded from the cache key to prevent attacker-supplied Host
188
+ // headers from fragmenting / poisoning the cache (Issue 068). The Vary
189
+ // dimension is the request path + query; same-origin reverse proxies are
190
+ // expected to handle vhost separation at their layer.
191
+ export function routeCacheKey(appDir, routePath, url) {
192
+ return `${appDir}\0${normalizeRevalidationPath(routePath)}\0${url.pathname}${url.search}`;
193
+ }
194
+ export function stripRevalidateExport(code) {
195
+ return code.replace(/^\s*export\s+const\s+revalidate\s*=\s*\d+\s*;?\s*$/m, "");
196
+ }
197
+ function normalizeRevalidationPath(path) {
198
+ const pathname = path.startsWith("/") ? path : `/${path}`;
199
+ const withoutTrailing = pathname.length > 1 ? pathname.replace(/\/+$/, "") : pathname;
200
+ return withoutTrailing === "" ? "/" : withoutTrailing;
201
+ }
202
+ function cacheControlSeconds(value, name) {
203
+ if (value === undefined) {
204
+ return undefined;
205
+ }
206
+ if (!Number.isSafeInteger(value) || value < 0) {
207
+ throw new Error(`cacheControl() ${name} must be a non-negative integer.`);
208
+ }
209
+ return value;
210
+ }
211
+ function staleWhileRevalidateDirective(value) {
212
+ if (value === true) {
213
+ return "stale-while-revalidate";
214
+ }
215
+ if (value === false) {
216
+ throw new Error("cacheControl() staleWhileRevalidate must be true or a non-negative integer.");
217
+ }
218
+ const seconds = cacheControlSeconds(value, "staleWhileRevalidate");
219
+ return `stale-while-revalidate=${seconds}`;
220
+ }
221
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAqCA,MAAM,UAAU,GAAG,CACjB,UACD,CAAC,sBAAsB,KAAK;IAC3B,cAAc,EAAE,EAAE;IAClB,gBAAgB,EAAE,IAAI,GAAG,EAAE;IAC3B,WAAW,EAAE,sBAAsB,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB;IACpC,MAAM,YAAY,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;IAElD,OAAO;QACL,YAAY,CAAC,IAAI;YACf,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAE5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YAED,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACpC,CAAC;QACD,GAAG,CAAC,GAAG;YACL,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,GAAG,CAAC,GAAG,EAAE,KAAK;YACZ,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEvC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC3D,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnD,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBAE1B,IAAI,YAAY,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;oBAC7B,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAED,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAExC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,MAAM,KAAK,GAAG,iEAAiE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhG,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,YAAY,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,OAAO,0BAA0B;QACxF,iBAAiB,EAAE,OAAO;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,aAAa,CAAC,WAAW,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA4B;IACtE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEhE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,OAAO,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAC/C,UAAU,CAAC,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,iBAAiB,EAAE,OAAO,IAAI,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAInC;IACC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,WAAW,CAAC;QAEtD,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE5C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC5E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE;gBACP,eAAe,EAAE,MAAM,CAAC,YAAY;gBACpC,cAAc,EAAE,0BAA0B;gBAC1C,gBAAgB,EAAE,KAAK;aACxB;YACD,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAOxC;IACC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,iBAAiB,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3E,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;QAC/D,IAAI;QACJ,YAAY;QACZ,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI;QAChF,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,MAAM;KACP,CAAC,CAAC;IAEH,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE;YACP,eAAe,EAAE,YAAY;YAC7B,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,0BAA0B;YAC1F,gBAAgB,EAAE,MAAM;SACzB;QACD,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,aAAa,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,QAAwB,UAAU,CAAC,WAAW;IAE9C,IAAI,UAAU,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC/C,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAiC,EACjC,EAAwB;IAExB,MAAM,OAAO,GAAsB;QACjC,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC,WAAW;QACtC,gBAAgB,EAAE,IAAI,GAAG,EAAE;KAC5B,CAAC;IAEF,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAE9D,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAiC;IAItE,MAAM,OAAO,GAAsB;QACjC,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC,WAAW;QACtC,gBAAgB,EAAE,IAAI,GAAG,EAAE;KAC5B,CAAC;IAEF,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO;QACL,IAAI,WAAW;YACb,OAAO,OAAO,CAAC,WAAW,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAE9D,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;gBACpC,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,uEAAuE;AACvE,yEAAyE;AACzE,sDAAsD;AACtD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,SAAiB,EAAE,GAAQ;IACvE,OAAO,GAAG,MAAM,KAAK,yBAAyB,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC1D,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEtF,OAAO,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB,EAAE,IAAY;IAClE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,kCAAkC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAuB;IAC5D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;IACnE,OAAO,0BAA0B,OAAO,EAAE,CAAC;AAC7C,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}