@demiurgejs/core 0.0.0 → 0.1.0
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/LICENSE +21 -0
- package/README.md +75 -2
- package/dist/adapter/index.d.ts +20 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/browser/file-router.d.ts +30 -0
- package/dist/browser/file-router.d.ts.map +1 -0
- package/dist/browser/index.d.ts +3 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/chunks/index-BnX9Qxbm.js +44 -0
- package/dist/chunks/index-BnX9Qxbm.js.map +1 -0
- package/dist/chunks/ssr-O3d7Q73U.js +273 -0
- package/dist/chunks/ssr-O3d7Q73U.js.map +1 -0
- package/dist/chunks/streaming-27pwhjGC.js +343 -0
- package/dist/chunks/streaming-27pwhjGC.js.map +1 -0
- package/dist/chunks/testing-BBnJ5WUR.js +2871 -0
- package/dist/chunks/testing-BBnJ5WUR.js.map +1 -0
- package/dist/data/cache.d.ts +95 -0
- package/dist/data/cache.d.ts.map +1 -0
- package/dist/data/idempotency.d.ts +24 -0
- package/dist/data/idempotency.d.ts.map +1 -0
- package/dist/data/index.d.ts +5 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/testing.d.ts +7 -0
- package/dist/data/testing.d.ts.map +1 -0
- package/dist/data/testing.js +134 -0
- package/dist/data/testing.js.map +1 -0
- package/dist/document/hydration.d.ts +13 -0
- package/dist/document/hydration.d.ts.map +1 -0
- package/dist/document/index.d.ts +13 -0
- package/dist/document/index.d.ts.map +1 -0
- package/dist/document/links.d.ts +17 -0
- package/dist/document/links.d.ts.map +1 -0
- package/dist/document/metadata.d.ts +62 -0
- package/dist/document/metadata.d.ts.map +1 -0
- package/dist/document/render.d.ts +28 -0
- package/dist/document/render.d.ts.map +1 -0
- package/dist/document/scripts.d.ts +24 -0
- package/dist/document/scripts.d.ts.map +1 -0
- package/dist/document/seo.d.ts +42 -0
- package/dist/document/seo.d.ts.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1318 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/testing.d.ts +3 -0
- package/dist/internal/testing.d.ts.map +1 -0
- package/dist/internal/testing.js +22 -0
- package/dist/internal/testing.js.map +1 -0
- package/dist/node/http.d.ts +28 -0
- package/dist/node/http.d.ts.map +1 -0
- package/dist/node/index.d.ts +45 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +385 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/static.d.ts +9 -0
- package/dist/node/static.d.ts.map +1 -0
- package/dist/node/streaming.d.ts +5 -0
- package/dist/node/streaming.d.ts.map +1 -0
- package/dist/package-name.d.ts +2 -0
- package/dist/package-name.d.ts.map +1 -0
- package/dist/platform/analytics.d.ts +20 -0
- package/dist/platform/analytics.d.ts.map +1 -0
- package/dist/platform/fonts.d.ts +35 -0
- package/dist/platform/fonts.d.ts.map +1 -0
- package/dist/platform/images.d.ts +49 -0
- package/dist/platform/images.d.ts.map +1 -0
- package/dist/platform/index.d.ts +9 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/observability.d.ts +60 -0
- package/dist/platform/observability.d.ts.map +1 -0
- package/dist/route/action.d.ts +33 -0
- package/dist/route/action.d.ts.map +1 -0
- package/dist/route/http-error.d.ts +24 -0
- package/dist/route/http-error.d.ts.map +1 -0
- package/dist/route/index.d.ts +10 -0
- package/dist/route/index.d.ts.map +1 -0
- package/dist/route/page.d.ts +5 -0
- package/dist/route/page.d.ts.map +1 -0
- package/dist/route/response.d.ts +100 -0
- package/dist/route/response.d.ts.map +1 -0
- package/dist/route/types.d.ts +186 -0
- package/dist/route/types.d.ts.map +1 -0
- package/dist/route/webhook.d.ts +25 -0
- package/dist/route/webhook.d.ts.map +1 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/manifest.d.ts +117 -0
- package/dist/router/manifest.d.ts.map +1 -0
- package/dist/router/navigation-data.d.ts +9 -0
- package/dist/router/navigation-data.d.ts.map +1 -0
- package/dist/routing/generate.d.ts +14 -0
- package/dist/routing/generate.d.ts.map +1 -0
- package/dist/routing/index.d.ts +3 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/types.d.ts +38 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/security/audit.d.ts +16 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/cors.d.ts +7 -0
- package/dist/security/cors.d.ts.map +1 -0
- package/dist/security/csrf.d.ts +15 -0
- package/dist/security/csrf.d.ts.map +1 -0
- package/dist/security/env.d.ts +69 -0
- package/dist/security/env.d.ts.map +1 -0
- package/dist/security/index.d.ts +17 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/policy.d.ts +18 -0
- package/dist/security/policy.d.ts.map +1 -0
- package/dist/security/rate-limit.d.ts +6 -0
- package/dist/security/rate-limit.d.ts.map +1 -0
- package/dist/security/report.d.ts +13 -0
- package/dist/security/report.d.ts.map +1 -0
- package/dist/security/request.d.ts +11 -0
- package/dist/security/request.d.ts.map +1 -0
- package/dist/security/types.d.ts +137 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/upload.d.ts +23 -0
- package/dist/security/upload.d.ts.map +1 -0
- package/dist/security/websocket.d.ts +13 -0
- package/dist/security/websocket.d.ts.map +1 -0
- package/dist/server/errors.d.ts +13 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/failure-site.d.ts +2 -0
- package/dist/server/failure-site.d.ts.map +1 -0
- package/dist/server/fallbacks.d.ts +10 -0
- package/dist/server/fallbacks.d.ts.map +1 -0
- package/dist/server/index.d.ts +14 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/negotiate.d.ts +3 -0
- package/dist/server/negotiate.d.ts.map +1 -0
- package/dist/server/not-found.d.ts +11 -0
- package/dist/server/not-found.d.ts.map +1 -0
- package/dist/server/problem.d.ts +18 -0
- package/dist/server/problem.d.ts.map +1 -0
- package/dist/server/render-tree.d.ts +4 -0
- package/dist/server/render-tree.d.ts.map +1 -0
- package/dist/server/request-handler.d.ts +40 -0
- package/dist/server/request-handler.d.ts.map +1 -0
- package/dist/server/request-metadata.d.ts +7 -0
- package/dist/server/request-metadata.d.ts.map +1 -0
- package/dist/server/ssr.d.ts +17 -0
- package/dist/server/ssr.d.ts.map +1 -0
- package/dist/static/index.d.ts +23 -0
- package/dist/static/index.d.ts.map +1 -0
- package/dist/static/index.js +256 -0
- package/dist/static/index.js.map +1 -0
- package/dist/vite/index.d.ts +4 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +580 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/plugin.d.ts +37 -0
- package/dist/vite/plugin.d.ts.map +1 -0
- package/package.json +90 -4
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const PROBLEM_CONTENT_TYPE = "application/problem+json";
|
|
2
|
+
export type ProblemDetails = {
|
|
3
|
+
detail?: string;
|
|
4
|
+
instance?: string;
|
|
5
|
+
status: number;
|
|
6
|
+
title: string;
|
|
7
|
+
type?: string;
|
|
8
|
+
[extension: string]: unknown;
|
|
9
|
+
};
|
|
10
|
+
export declare function createProblemDetails({ detail, instance, status, title, type, ...extensions }: ProblemDetails): {
|
|
11
|
+
instance?: string | undefined;
|
|
12
|
+
detail?: string | undefined;
|
|
13
|
+
type: string;
|
|
14
|
+
title: string;
|
|
15
|
+
status: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function createProblemResponse(problem: ProblemDetails, init?: ResponseInit): Response;
|
|
18
|
+
//# sourceMappingURL=problem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"problem.d.ts","sourceRoot":"","sources":["../../src/server/problem.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B,CAAC;AAKF,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,IAAoB,EACpB,GAAG,UAAU,EACd,EAAE,cAAc;;;;;;EAShB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,IAAI,CAAC,EAAE,YAAY,YAepB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-tree.d.ts","sourceRoot":"","sources":["../../src/server/render-tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,aAgB3D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type LoadedRouteMatch, type RouteManifest } from "../router";
|
|
2
|
+
import { type CacheDuration, type CacheNamespace, type CacheStore } from "../data";
|
|
3
|
+
import { type RouteImporter } from "../route";
|
|
4
|
+
import { type SsrOptions, type SsrRenderOptions } from "./ssr";
|
|
5
|
+
import type { FailureSite } from "./failure-site";
|
|
6
|
+
import { type RateLimitStore } from "../security";
|
|
7
|
+
export type RequestErrorReporter = (error: unknown, context: {
|
|
8
|
+
pathname: string;
|
|
9
|
+
site: FailureSite;
|
|
10
|
+
}) => void;
|
|
11
|
+
export type RequestHandlerOptions = {
|
|
12
|
+
cacheStore?: RequestCacheStoreOptions;
|
|
13
|
+
onError?: RequestErrorReporter;
|
|
14
|
+
renderPage?: PageRenderer;
|
|
15
|
+
rateLimitStore?: RateLimitStore;
|
|
16
|
+
routes: Record<string, RouteImporter>;
|
|
17
|
+
ssr?: SsrOptions;
|
|
18
|
+
};
|
|
19
|
+
export type RequestCacheStoreOptions = {
|
|
20
|
+
namespace: CacheNamespace;
|
|
21
|
+
onBackgroundError?: (error: unknown) => void;
|
|
22
|
+
refreshLeaseTtl?: CacheDuration;
|
|
23
|
+
store: CacheStore;
|
|
24
|
+
waitUntil?: (promise: Promise<void>) => void;
|
|
25
|
+
};
|
|
26
|
+
type RequestRuntimeOptions = {
|
|
27
|
+
cacheStore?: RequestCacheStoreOptions;
|
|
28
|
+
dev?: boolean;
|
|
29
|
+
onError?: RequestErrorReporter;
|
|
30
|
+
renderPage?: PageRenderer;
|
|
31
|
+
rateLimitStore?: RateLimitStore;
|
|
32
|
+
ssr?: SsrOptions;
|
|
33
|
+
transformDocument?: (html: string) => string | Promise<string>;
|
|
34
|
+
};
|
|
35
|
+
export type RequestHandler = (request: Request) => Promise<Response>;
|
|
36
|
+
export type PageRenderer = (match: LoadedRouteMatch, options: SsrRenderOptions) => Response | Promise<Response>;
|
|
37
|
+
export declare function createRequestHandler(options: RequestHandlerOptions): (request: Request) => Promise<Response>;
|
|
38
|
+
export declare function handleRequestWithManifest(manifest: RouteManifest, request: Request, options?: RequestRuntimeOptions): Promise<Response>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=request-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../../src/server/request-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAEnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAML,KAAK,aAAa,EAGnB,MAAM,UAAU,CAAC;AAElB,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACtB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EASL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAWrB,MAAM,MAAM,oBAAoB,GAAG,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,KAC7C,IAAI,CAAC;AAEV,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,cAAc,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;CAC9C,CAAC;AAMF,KAAK,qBAAqB,GAAG;IAC3B,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAErE,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,gBAAgB,KACtB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAclC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,IAQ7B,SAAS,OAAO,uBASrD;AAED,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,qBAER,qBAqFF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type RequestConnectionMetadata = {
|
|
2
|
+
clientIp: string;
|
|
3
|
+
};
|
|
4
|
+
export declare function getRequestConnectionMetadata(request: Request): RequestConnectionMetadata | undefined;
|
|
5
|
+
export declare function setRequestConnectionMetadata(request: Request, metadata: RequestConnectionMetadata): void;
|
|
6
|
+
export declare function copyRequestConnectionMetadata(from: Request, to: Request): void;
|
|
7
|
+
//# sourceMappingURL=request-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-metadata.d.ts","sourceRoot":"","sources":["../../src/server/request-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAIF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,yCAE5D;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,yBAAyB,QAGpC;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,QAMvE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { LoadedRouteMatch } from "../router";
|
|
2
|
+
export type SsrOptions = {
|
|
3
|
+
clientEntry?: string;
|
|
4
|
+
lang?: string;
|
|
5
|
+
navigation?: "document";
|
|
6
|
+
styles?: string[];
|
|
7
|
+
title?: string;
|
|
8
|
+
};
|
|
9
|
+
export type SsrRenderOptions = SsrOptions & {
|
|
10
|
+
nonce?: string;
|
|
11
|
+
onStreamError?: (error: unknown) => void;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
transformDocument?: (html: string) => string | Promise<string>;
|
|
14
|
+
};
|
|
15
|
+
export declare function renderPageDocument(match: LoadedRouteMatch, options?: SsrRenderOptions): string;
|
|
16
|
+
export declare function renderPageResponse(match: LoadedRouteMatch, options?: SsrRenderOptions): Response;
|
|
17
|
+
//# sourceMappingURL=ssr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../../src/server/ssr.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGlD,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChE,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,gBAAqB,UAqB/B;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,gBAAqB,YAS/B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RouteImporter } from "../route";
|
|
2
|
+
import { type RequestErrorReporter, type SsrOptions } from "../server";
|
|
3
|
+
export declare const staticAdapter: import("..").Adapter;
|
|
4
|
+
export type StaticOutputEntry = {
|
|
5
|
+
file: string;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
pathname: string;
|
|
8
|
+
status: 200 | 404;
|
|
9
|
+
};
|
|
10
|
+
export type StaticOutputManifest = {
|
|
11
|
+
adapter: "static";
|
|
12
|
+
entries: StaticOutputEntry[];
|
|
13
|
+
version: 1;
|
|
14
|
+
};
|
|
15
|
+
export type GenerateStaticOutputOptions = {
|
|
16
|
+
onError?: RequestErrorReporter;
|
|
17
|
+
origin?: string;
|
|
18
|
+
outDir: string;
|
|
19
|
+
routes: Record<string, RouteImporter>;
|
|
20
|
+
ssr?: SsrOptions;
|
|
21
|
+
};
|
|
22
|
+
export declare function generateStaticOutput(options: GenerateStaticOutputOptions): Promise<StaticOutputManifest>;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/static/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAKnB,eAAO,MAAM,aAAa,sBAKxB,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB,CAAC;AAMF,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,oBAAoB,CAAC,CAuD/B"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { mkdir as d, mkdtemp as b, writeFile as m, cp as C, rm as y, readFile as R } from "node:fs/promises";
|
|
2
|
+
import { resolve as w, dirname as g, join as S, relative as x, sep as P } from "node:path";
|
|
3
|
+
import { d as T } from "../chunks/index-BnX9Qxbm.js";
|
|
4
|
+
import { c as L, a as M, b as q, h as A, r as k, d as W } from "../chunks/testing-BBnJ5WUR.js";
|
|
5
|
+
import "react-dom/server";
|
|
6
|
+
import "react";
|
|
7
|
+
import "react/jsx-runtime";
|
|
8
|
+
const N = "demiurge-static-manifest.json", it = T({
|
|
9
|
+
name: "static",
|
|
10
|
+
capabilities: {
|
|
11
|
+
staticOutput: !0
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
async function nt(t) {
|
|
15
|
+
const e = j(t.origin), i = w(t.outDir), r = L(t.routes), n = await M(r);
|
|
16
|
+
H(r, n.length);
|
|
17
|
+
const s = I(n.map((u) => u.pathname)), c = q(), o = [], a = { ...t.ssr, navigation: "document" };
|
|
18
|
+
for (const u of s) {
|
|
19
|
+
const l = O(e, u.pathname), F = await A(r, l, {
|
|
20
|
+
onError: t.onError,
|
|
21
|
+
rateLimitStore: c,
|
|
22
|
+
ssr: a
|
|
23
|
+
});
|
|
24
|
+
o.push(await E(u, F, 200));
|
|
25
|
+
}
|
|
26
|
+
const f = await k(
|
|
27
|
+
r,
|
|
28
|
+
O(e, "/404"),
|
|
29
|
+
{
|
|
30
|
+
...a,
|
|
31
|
+
onError: (u, l) => t.onError?.(u, { pathname: "/404", site: l })
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
o.push(
|
|
35
|
+
await E(
|
|
36
|
+
{
|
|
37
|
+
file: "404.html",
|
|
38
|
+
pathname: "*"
|
|
39
|
+
},
|
|
40
|
+
f,
|
|
41
|
+
404
|
|
42
|
+
)
|
|
43
|
+
), o.sort((u, l) => u.file.localeCompare(l.file));
|
|
44
|
+
const p = {
|
|
45
|
+
adapter: "static",
|
|
46
|
+
entries: o.map(({ html: u, ...l }) => l),
|
|
47
|
+
version: 1
|
|
48
|
+
};
|
|
49
|
+
return await K(i, o, p), p;
|
|
50
|
+
}
|
|
51
|
+
function j(t) {
|
|
52
|
+
let e;
|
|
53
|
+
try {
|
|
54
|
+
e = new URL(t ?? "http://demiurge.local");
|
|
55
|
+
} catch {
|
|
56
|
+
throw new Error(
|
|
57
|
+
`Static output origin must be an absolute HTTP(S) origin: ${JSON.stringify(t)}.`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (e.protocol !== "http:" && e.protocol !== "https:" || e.username || e.password || e.pathname !== "/" || e.search || e.hash)
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Static output origin must be an HTTP(S) origin without credentials, a path, query, or hash: ${JSON.stringify(t)}.`
|
|
63
|
+
);
|
|
64
|
+
return e.origin;
|
|
65
|
+
}
|
|
66
|
+
function H(t, e) {
|
|
67
|
+
if (e === 0)
|
|
68
|
+
throw new Error("Static output requires at least one page route.");
|
|
69
|
+
if (!t.fallbacks.notFound.some(
|
|
70
|
+
(r) => r.fileSegments.length === 0
|
|
71
|
+
))
|
|
72
|
+
throw new Error(
|
|
73
|
+
"Static output requires a root @not-found.tsx so 404.html is app-owned."
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
function I(t) {
|
|
77
|
+
const e = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set();
|
|
78
|
+
return t.map((r) => {
|
|
79
|
+
if (i.has(r))
|
|
80
|
+
throw new Error(`Static output collected duplicate pathname ${JSON.stringify(r)}.`);
|
|
81
|
+
i.add(r);
|
|
82
|
+
const n = U(r), s = n.toLocaleLowerCase("en-US"), c = e.get(s);
|
|
83
|
+
if (c)
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Static paths ${JSON.stringify(c)} and ${JSON.stringify(r)} map to the same portable output file ${JSON.stringify(n)}.`
|
|
86
|
+
);
|
|
87
|
+
return e.set(s, r), { file: n, pathname: r };
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function U(t) {
|
|
91
|
+
if (!t.startsWith("/") || t.includes("?") || t.includes("#"))
|
|
92
|
+
throw new Error(`Static output received invalid pathname ${JSON.stringify(t)}.`);
|
|
93
|
+
return t === "/" ? "index.html" : [...t.split("/").slice(1).map((i) => {
|
|
94
|
+
let r;
|
|
95
|
+
try {
|
|
96
|
+
r = decodeURIComponent(i);
|
|
97
|
+
} catch {
|
|
98
|
+
throw new Error(`Static output pathname is not valid UTF-8: ${JSON.stringify(t)}.`);
|
|
99
|
+
}
|
|
100
|
+
return _(r, t), r;
|
|
101
|
+
}), "index.html"].join("/");
|
|
102
|
+
}
|
|
103
|
+
function _(t, e) {
|
|
104
|
+
const i = /[<>:"|?*]/.test(t) || [...t].some((r) => r.charCodeAt(0) <= 31) || /[. ]$/.test(t) || /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(t);
|
|
105
|
+
if (!t || t === "." || t === ".." || t.includes("/") || t.includes("\\") || i)
|
|
106
|
+
throw new Error(
|
|
107
|
+
`Static pathname ${JSON.stringify(e)} contains a segment that is unsafe or not portable as a file name: ${JSON.stringify(t)}.`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
function O(t, e) {
|
|
111
|
+
return new Request(`${t}${e}`, {
|
|
112
|
+
headers: { accept: "text/html" }
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async function E(t, e, i) {
|
|
116
|
+
if (e.status !== i)
|
|
117
|
+
throw new Error(
|
|
118
|
+
`Static output for ${JSON.stringify(t.pathname)} returned status ${e.status}; expected ${i}.`
|
|
119
|
+
);
|
|
120
|
+
const r = e.headers.get("content-type");
|
|
121
|
+
if (!r?.toLowerCase().startsWith("text/html"))
|
|
122
|
+
throw new Error(
|
|
123
|
+
`Static output for ${JSON.stringify(t.pathname)} returned ${JSON.stringify(r)} instead of text/html.`
|
|
124
|
+
);
|
|
125
|
+
if (e.headers.has("set-cookie"))
|
|
126
|
+
throw new Error(
|
|
127
|
+
`Static output for ${JSON.stringify(t.pathname)} attempted to set a cookie. Build artifacts cannot contain per-user response state.`
|
|
128
|
+
);
|
|
129
|
+
const n = await e.text();
|
|
130
|
+
return await B(t.pathname, n, e.headers), {
|
|
131
|
+
...t,
|
|
132
|
+
headers: G(e.headers),
|
|
133
|
+
html: n,
|
|
134
|
+
status: i
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async function B(t, e, i) {
|
|
138
|
+
const r = i.get("content-security-policy");
|
|
139
|
+
if (!r)
|
|
140
|
+
return;
|
|
141
|
+
if (/'nonce-[^']+'/i.test(r) || /\snonce\s*=/i.test(e))
|
|
142
|
+
throw new Error(
|
|
143
|
+
`Static output for ${JSON.stringify(t)} uses a nonce-backed CSP. Use security.static() with stable hashes or a runtime adapter that injects a fresh nonce.`
|
|
144
|
+
);
|
|
145
|
+
const n = z(r);
|
|
146
|
+
await $(
|
|
147
|
+
t,
|
|
148
|
+
e,
|
|
149
|
+
"script",
|
|
150
|
+
h(n, "script-src")
|
|
151
|
+
), await $(
|
|
152
|
+
t,
|
|
153
|
+
e,
|
|
154
|
+
"style",
|
|
155
|
+
h(n, "style-src")
|
|
156
|
+
);
|
|
157
|
+
const s = h(n, "style-src");
|
|
158
|
+
if (/\sstyle\s*=/i.test(e) && !s.includes("'unsafe-inline'"))
|
|
159
|
+
throw new Error(
|
|
160
|
+
`Static output for ${JSON.stringify(t)} contains an inline style attribute that its CSP does not allow. Move the style into a stylesheet or explicitly allow inline styles.`
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
function z(t) {
|
|
164
|
+
const e = /* @__PURE__ */ new Map();
|
|
165
|
+
for (const i of t.split(";")) {
|
|
166
|
+
const [r, ...n] = i.trim().split(/\s+/);
|
|
167
|
+
r && e.set(r.toLowerCase(), n);
|
|
168
|
+
}
|
|
169
|
+
return e;
|
|
170
|
+
}
|
|
171
|
+
function h(t, e) {
|
|
172
|
+
return t.get(e) ?? t.get("default-src") ?? [];
|
|
173
|
+
}
|
|
174
|
+
async function $(t, e, i, r) {
|
|
175
|
+
if (!r.includes("'unsafe-inline'"))
|
|
176
|
+
for (const n of D(e, i)) {
|
|
177
|
+
if (i === "script" && /(?:^|\s)src\s*=/i.test(n.attributes) || !n.content)
|
|
178
|
+
continue;
|
|
179
|
+
const s = await W(n.content);
|
|
180
|
+
if (!r.includes(s))
|
|
181
|
+
throw new Error(
|
|
182
|
+
`Static output for ${JSON.stringify(t)} contains an inline ${i} without the required CSP hash ${s}.`
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function D(t, e) {
|
|
187
|
+
const i = t.toLowerCase(), r = [], n = `<${e}`, s = `</${e}`;
|
|
188
|
+
let c = 0;
|
|
189
|
+
for (; c < t.length; ) {
|
|
190
|
+
const o = i.indexOf(n, c);
|
|
191
|
+
if (o === -1)
|
|
192
|
+
break;
|
|
193
|
+
const a = i.indexOf(">", o + n.length), f = a === -1 ? -1 : i.indexOf(s, a + 1), p = f === -1 ? -1 : i.indexOf(">", f + s.length);
|
|
194
|
+
if (a === -1 || f === -1 || p === -1)
|
|
195
|
+
throw new Error(`Static output contains an unclosed <${e}> element.`);
|
|
196
|
+
r.push({
|
|
197
|
+
attributes: t.slice(o + n.length, a),
|
|
198
|
+
content: t.slice(a + 1, f)
|
|
199
|
+
}), c = p + 1;
|
|
200
|
+
}
|
|
201
|
+
return r;
|
|
202
|
+
}
|
|
203
|
+
function G(t) {
|
|
204
|
+
return Object.fromEntries(
|
|
205
|
+
[...t.entries()].sort(([e], [i]) => e.localeCompare(i))
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
async function K(t, e, i) {
|
|
209
|
+
const r = g(t);
|
|
210
|
+
await d(r, { recursive: !0 });
|
|
211
|
+
const n = await b(S(r, ".demiurge-static-"));
|
|
212
|
+
try {
|
|
213
|
+
for (const o of e) {
|
|
214
|
+
const a = v(n, o.file);
|
|
215
|
+
await d(g(a), { recursive: !0 }), await m(a, o.html);
|
|
216
|
+
}
|
|
217
|
+
await m(
|
|
218
|
+
S(n, N),
|
|
219
|
+
`${JSON.stringify(i, null, 2)}
|
|
220
|
+
`
|
|
221
|
+
);
|
|
222
|
+
const s = await Q(t);
|
|
223
|
+
await d(t, { recursive: !0 }), await C(n, t, { recursive: !0, force: !0 });
|
|
224
|
+
const c = new Set(e.map((o) => o.file));
|
|
225
|
+
for (const o of s)
|
|
226
|
+
c.has(o) || await y(v(t, o), { force: !0 });
|
|
227
|
+
} finally {
|
|
228
|
+
await y(n, { force: !0, recursive: !0 });
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async function Q(t) {
|
|
232
|
+
try {
|
|
233
|
+
const e = await R(S(t, N), "utf8"), i = JSON.parse(e);
|
|
234
|
+
return i.adapter !== "static" || i.version !== 1 || !Array.isArray(i.entries) ? [] : i.entries.flatMap(
|
|
235
|
+
(r) => typeof r.file == "string" && r.file.endsWith(".html") && J(r.file) ? [r.file] : []
|
|
236
|
+
);
|
|
237
|
+
} catch {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function v(t, e) {
|
|
242
|
+
if (!J(e))
|
|
243
|
+
throw new Error(`Static output file must stay inside the output directory: ${JSON.stringify(e)}.`);
|
|
244
|
+
const i = w(t), r = w(i, e);
|
|
245
|
+
if (x(i, r).split(P).includes(".."))
|
|
246
|
+
throw new Error(`Static output file escaped the output directory: ${JSON.stringify(e)}.`);
|
|
247
|
+
return r;
|
|
248
|
+
}
|
|
249
|
+
function J(t) {
|
|
250
|
+
return !!t && !t.startsWith("/") && !t.startsWith("\\") && !t.split(/[\\/]/).includes("..");
|
|
251
|
+
}
|
|
252
|
+
export {
|
|
253
|
+
nt as generateStaticOutput,
|
|
254
|
+
it as staticAdapter
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/static/index.ts"],"sourcesContent":["import {\n cp,\n mkdir,\n mkdtemp,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { defineAdapter } from \"../adapter\";\nimport {\n collectStaticRoutePaths,\n createRouteManifest,\n type RouteManifest,\n} from \"../router\";\nimport type { RouteImporter } from \"../route\";\nimport {\n handleRequestWithManifest,\n renderNotFoundResponse,\n type RequestErrorReporter,\n type SsrOptions,\n} from \"../server\";\nimport { createMemoryRateLimitStore, cspHash } from \"../security\";\n\nconst STATIC_MANIFEST_FILE = \"demiurge-static-manifest.json\";\n\nexport const staticAdapter = defineAdapter({\n name: \"static\",\n capabilities: {\n staticOutput: true,\n },\n});\n\nexport type StaticOutputEntry = {\n file: string;\n headers: Record<string, string>;\n pathname: string;\n status: 200 | 404;\n};\n\nexport type StaticOutputManifest = {\n adapter: \"static\";\n entries: StaticOutputEntry[];\n version: 1;\n};\n\nexport type GenerateStaticOutputOptions = {\n onError?: RequestErrorReporter;\n origin?: string;\n outDir: string;\n routes: Record<string, RouteImporter>;\n ssr?: SsrOptions;\n};\n\ntype PendingOutput = StaticOutputEntry & {\n html: string;\n};\n\nexport async function generateStaticOutput(\n options: GenerateStaticOutputOptions,\n): Promise<StaticOutputManifest> {\n const origin = normalizeOrigin(options.origin);\n const outDir = resolve(options.outDir);\n const manifest = createRouteManifest(options.routes);\n const paths = await collectStaticRoutePaths(manifest);\n\n assertStaticPageApp(manifest, paths.length);\n\n const outputEntries = planOutputEntries(paths.map((path) => path.pathname));\n const rateLimitStore = createMemoryRateLimitStore();\n const pending: PendingOutput[] = [];\n const ssr = { ...options.ssr, navigation: \"document\" as const };\n\n for (const entry of outputEntries) {\n const request = createDocumentRequest(origin, entry.pathname);\n const response = await handleRequestWithManifest(manifest, request, {\n onError: options.onError,\n rateLimitStore,\n ssr,\n });\n\n pending.push(await prepareOutput(entry, response, 200));\n }\n\n const notFoundResponse = await renderNotFoundResponse(\n manifest,\n createDocumentRequest(origin, \"/404\"),\n {\n ...ssr,\n onError: (error, site) =>\n options.onError?.(error, { pathname: \"/404\", site }),\n },\n );\n pending.push(\n await prepareOutput(\n {\n file: \"404.html\",\n pathname: \"*\",\n },\n notFoundResponse,\n 404,\n ),\n );\n\n pending.sort((left, right) => left.file.localeCompare(right.file));\n\n const outputManifest: StaticOutputManifest = {\n adapter: \"static\",\n entries: pending.map(({ html: _html, ...entry }) => entry),\n version: 1,\n };\n\n await writeOutput(outDir, pending, outputManifest);\n\n return outputManifest;\n}\n\nfunction normalizeOrigin(value: string | undefined) {\n let origin: URL;\n\n try {\n origin = new URL(value ?? \"http://demiurge.local\");\n } catch {\n throw new Error(\n `Static output origin must be an absolute HTTP(S) origin: ${JSON.stringify(value)}.`,\n );\n }\n\n if (\n (origin.protocol !== \"http:\" && origin.protocol !== \"https:\") ||\n origin.username ||\n origin.password ||\n origin.pathname !== \"/\" ||\n origin.search ||\n origin.hash\n ) {\n throw new Error(\n `Static output origin must be an HTTP(S) origin without credentials, a path, query, or hash: ${JSON.stringify(value)}.`,\n );\n }\n\n return origin.origin;\n}\n\nfunction assertStaticPageApp(manifest: RouteManifest, pageCount: number) {\n if (pageCount === 0) {\n throw new Error(\"Static output requires at least one page route.\");\n }\n\n const hasRootNotFound = manifest.fallbacks.notFound.some(\n (fallback) => fallback.fileSegments.length === 0,\n );\n\n if (!hasRootNotFound) {\n throw new Error(\n \"Static output requires a root @not-found.tsx so 404.html is app-owned.\",\n );\n }\n}\n\nfunction planOutputEntries(pathnames: string[]) {\n const seenFiles = new Map<string, string>();\n const seenPathnames = new Set<string>();\n\n return pathnames.map((pathname) => {\n if (seenPathnames.has(pathname)) {\n throw new Error(`Static output collected duplicate pathname ${JSON.stringify(pathname)}.`);\n }\n\n seenPathnames.add(pathname);\n\n const file = pathnameToFile(pathname);\n const portableFile = file.toLocaleLowerCase(\"en-US\");\n const conflictingPathname = seenFiles.get(portableFile);\n\n if (conflictingPathname) {\n throw new Error(\n `Static paths ${JSON.stringify(conflictingPathname)} and ${JSON.stringify(pathname)} map to the same portable output file ${JSON.stringify(file)}.`,\n );\n }\n\n seenFiles.set(portableFile, pathname);\n\n return { file, pathname };\n });\n}\n\nfunction pathnameToFile(pathname: string) {\n if (!pathname.startsWith(\"/\") || pathname.includes(\"?\") || pathname.includes(\"#\")) {\n throw new Error(`Static output received invalid pathname ${JSON.stringify(pathname)}.`);\n }\n\n if (pathname === \"/\") {\n return \"index.html\";\n }\n\n const segments = pathname.split(\"/\").slice(1).map((segment) => {\n let decoded: string;\n\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n throw new Error(`Static output pathname is not valid UTF-8: ${JSON.stringify(pathname)}.`);\n }\n\n assertPortableSegment(decoded, pathname);\n return decoded;\n });\n\n return [...segments, \"index.html\"].join(\"/\");\n}\n\nfunction assertPortableSegment(segment: string, pathname: string) {\n const invalidWindowsName = /[<>:\"|?*]/.test(segment) ||\n [...segment].some((character) => character.charCodeAt(0) <= 31) ||\n /[. ]$/.test(segment) ||\n /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\\.|$)/i.test(segment);\n\n if (\n !segment ||\n segment === \".\" ||\n segment === \"..\" ||\n segment.includes(\"/\") ||\n segment.includes(\"\\\\\") ||\n invalidWindowsName\n ) {\n throw new Error(\n `Static pathname ${JSON.stringify(pathname)} contains a segment that is unsafe or not portable as a file name: ${JSON.stringify(segment)}.`,\n );\n }\n}\n\nfunction createDocumentRequest(origin: string, pathname: string) {\n return new Request(`${origin}${pathname}`, {\n headers: { accept: \"text/html\" },\n });\n}\n\nasync function prepareOutput(\n entry: { file: string; pathname: string },\n response: Response,\n expectedStatus: 200 | 404,\n): Promise<PendingOutput> {\n if (response.status !== expectedStatus) {\n throw new Error(\n `Static output for ${JSON.stringify(entry.pathname)} returned status ${response.status}; expected ${expectedStatus}.`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\");\n\n if (!contentType?.toLowerCase().startsWith(\"text/html\")) {\n throw new Error(\n `Static output for ${JSON.stringify(entry.pathname)} returned ${JSON.stringify(contentType)} instead of text/html.`,\n );\n }\n\n if (response.headers.has(\"set-cookie\")) {\n throw new Error(\n `Static output for ${JSON.stringify(entry.pathname)} attempted to set a cookie. Build artifacts cannot contain per-user response state.`,\n );\n }\n\n const html = await response.text();\n await validateStaticCsp(entry.pathname, html, response.headers);\n\n return {\n ...entry,\n headers: sortedHeaders(response.headers),\n html,\n status: expectedStatus,\n };\n}\n\nasync function validateStaticCsp(\n pathname: string,\n html: string,\n headers: Headers,\n) {\n const csp = headers.get(\"content-security-policy\");\n\n if (!csp) {\n return;\n }\n\n if (/'nonce-[^']+'/i.test(csp) || /\\snonce\\s*=/i.test(html)) {\n throw new Error(\n `Static output for ${JSON.stringify(pathname)} uses a nonce-backed CSP. Use security.static() with stable hashes or a runtime adapter that injects a fresh nonce.`,\n );\n }\n\n const directives = parseCsp(csp);\n\n await validateInlineElements(\n pathname,\n html,\n \"script\",\n effectiveSources(directives, \"script-src\"),\n );\n await validateInlineElements(\n pathname,\n html,\n \"style\",\n effectiveSources(directives, \"style-src\"),\n );\n\n const styleSources = effectiveSources(directives, \"style-src\");\n\n if (/\\sstyle\\s*=/i.test(html) && !styleSources.includes(\"'unsafe-inline'\")) {\n throw new Error(\n `Static output for ${JSON.stringify(pathname)} contains an inline style attribute that its CSP does not allow. Move the style into a stylesheet or explicitly allow inline styles.`,\n );\n }\n}\n\nfunction parseCsp(value: string) {\n const directives = new Map<string, string[]>();\n\n for (const rawDirective of value.split(\";\")) {\n const [name, ...sources] = rawDirective.trim().split(/\\s+/);\n\n if (name) {\n directives.set(name.toLowerCase(), sources);\n }\n }\n\n return directives;\n}\n\nfunction effectiveSources(directives: Map<string, string[]>, name: string) {\n return directives.get(name) ?? directives.get(\"default-src\") ?? [];\n}\n\nasync function validateInlineElements(\n pathname: string,\n html: string,\n tagName: \"script\" | \"style\",\n sources: string[],\n) {\n if (sources.includes(\"'unsafe-inline'\")) {\n return;\n }\n\n for (const element of findRawTextElements(html, tagName)) {\n if (tagName === \"script\" && /(?:^|\\s)src\\s*=/i.test(element.attributes)) {\n continue;\n }\n\n if (!element.content) {\n continue;\n }\n\n const hash = await cspHash(element.content);\n\n if (!sources.includes(hash)) {\n throw new Error(\n `Static output for ${JSON.stringify(pathname)} contains an inline ${tagName} without the required CSP hash ${hash}.`,\n );\n }\n }\n}\n\nfunction findRawTextElements(html: string, tagName: \"script\" | \"style\") {\n const lowerHtml = html.toLowerCase();\n const elements: Array<{ attributes: string; content: string }> = [];\n const opening = `<${tagName}`;\n const closing = `</${tagName}`;\n let cursor = 0;\n\n while (cursor < html.length) {\n const start = lowerHtml.indexOf(opening, cursor);\n\n if (start === -1) {\n break;\n }\n\n const openEnd = lowerHtml.indexOf(\">\", start + opening.length);\n const closeStart = openEnd === -1\n ? -1\n : lowerHtml.indexOf(closing, openEnd + 1);\n const closeEnd = closeStart === -1\n ? -1\n : lowerHtml.indexOf(\">\", closeStart + closing.length);\n\n if (openEnd === -1 || closeStart === -1 || closeEnd === -1) {\n throw new Error(`Static output contains an unclosed <${tagName}> element.`);\n }\n\n elements.push({\n attributes: html.slice(start + opening.length, openEnd),\n content: html.slice(openEnd + 1, closeStart),\n });\n cursor = closeEnd + 1;\n }\n\n return elements;\n}\n\nfunction sortedHeaders(headers: Headers) {\n return Object.fromEntries(\n [...headers.entries()].sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nasync function writeOutput(\n outDir: string,\n entries: PendingOutput[],\n manifest: StaticOutputManifest,\n) {\n const parent = dirname(outDir);\n await mkdir(parent, { recursive: true });\n const staging = await mkdtemp(join(parent, \".demiurge-static-\"));\n\n try {\n for (const entry of entries) {\n const file = resolveContained(staging, entry.file);\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, entry.html);\n }\n\n await writeFile(\n join(staging, STATIC_MANIFEST_FILE),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n );\n\n const previousFiles = await readPreviousOutputFiles(outDir);\n await mkdir(outDir, { recursive: true });\n await cp(staging, outDir, { recursive: true, force: true });\n\n const currentFiles = new Set(entries.map((entry) => entry.file));\n\n for (const file of previousFiles) {\n if (!currentFiles.has(file)) {\n await rm(resolveContained(outDir, file), { force: true });\n }\n }\n } finally {\n await rm(staging, { force: true, recursive: true });\n }\n}\n\nasync function readPreviousOutputFiles(outDir: string) {\n try {\n const source = await readFile(join(outDir, STATIC_MANIFEST_FILE), \"utf8\");\n const value = JSON.parse(source) as {\n adapter?: unknown;\n entries?: Array<{ file?: unknown }>;\n version?: unknown;\n };\n\n if (\n value.adapter !== \"static\" ||\n value.version !== 1 ||\n !Array.isArray(value.entries)\n ) {\n return [];\n }\n\n return value.entries.flatMap((entry) =>\n typeof entry.file === \"string\" &&\n entry.file.endsWith(\".html\") &&\n isSafeRelativeFile(entry.file)\n ? [entry.file]\n : []\n );\n } catch {\n return [];\n }\n}\n\nfunction resolveContained(root: string, file: string) {\n if (!isSafeRelativeFile(file)) {\n throw new Error(`Static output file must stay inside the output directory: ${JSON.stringify(file)}.`);\n }\n\n const resolvedRoot = resolve(root);\n const resolvedFile = resolve(resolvedRoot, file);\n\n if (relative(resolvedRoot, resolvedFile).split(sep).includes(\"..\")) {\n throw new Error(`Static output file escaped the output directory: ${JSON.stringify(file)}.`);\n }\n\n return resolvedFile;\n}\n\nfunction isSafeRelativeFile(file: string) {\n return Boolean(file) &&\n !file.startsWith(\"/\") &&\n !file.startsWith(\"\\\\\") &&\n !file.split(/[\\\\/]/).includes(\"..\");\n}\n"],"names":["STATIC_MANIFEST_FILE","staticAdapter","defineAdapter","generateStaticOutput","options","origin","normalizeOrigin","outDir","resolve","manifest","createRouteManifest","paths","collectStaticRoutePaths","assertStaticPageApp","outputEntries","planOutputEntries","path","rateLimitStore","createMemoryRateLimitStore","pending","ssr","entry","request","createDocumentRequest","response","handleRequestWithManifest","prepareOutput","notFoundResponse","renderNotFoundResponse","error","site","left","right","outputManifest","_html","writeOutput","value","pageCount","fallback","pathnames","seenFiles","seenPathnames","pathname","file","pathnameToFile","portableFile","conflictingPathname","segment","decoded","assertPortableSegment","invalidWindowsName","character","expectedStatus","contentType","html","validateStaticCsp","sortedHeaders","headers","csp","directives","parseCsp","validateInlineElements","effectiveSources","styleSources","rawDirective","name","sources","tagName","element","findRawTextElements","hash","cspHash","lowerHtml","elements","opening","closing","cursor","start","openEnd","closeStart","closeEnd","entries","parent","dirname","mkdir","staging","mkdtemp","join","resolveContained","writeFile","previousFiles","readPreviousOutputFiles","cp","currentFiles","rm","source","readFile","isSafeRelativeFile","root","resolvedRoot","resolvedFile","relative","sep"],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { demiurge } from "./plugin";
|
|
2
|
+
export { assertRootNotFoundRoute as unstable_assertRootNotFoundRoute, declaresPageRoute as unstable_declaresPageRoute, createClientEntrySource as unstable_createClientEntrySource, createServerEntrySource as unstable_createServerEntrySource, createDocumentHtml as unstable_createDocumentHtml, createDevRouteImporters as unstable_createDevRouteImporters, handleDevRequest as unstable_handleDevRequest, stripClientPageData as unstable_stripClientPageData, } from "./plugin";
|
|
3
|
+
export type { DemiurgeVitePluginOptions } from "./plugin";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EACL,uBAAuB,IAAI,gCAAgC,EAC3D,iBAAiB,IAAI,0BAA0B,EAC/C,uBAAuB,IAAI,gCAAgC,EAC3D,uBAAuB,IAAI,gCAAgC,EAC3D,kBAAkB,IAAI,2BAA2B,EACjD,uBAAuB,IAAI,gCAAgC,EAC3D,gBAAgB,IAAI,yBAAyB,EAC7C,mBAAmB,IAAI,4BAA4B,GACpD,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC"}
|