@stackbox/cms 0.0.5 → 0.1.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.
- package/README.md +158 -10
- package/dist/AGENTS.md +218 -0
- package/dist/blocks.d.ts +6 -13
- package/dist/blocks.d.ts.map +1 -1
- package/dist/blocks.js +2 -0
- package/dist/blocks.js.map +1 -1
- package/dist/build.d.ts +14 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +145 -0
- package/dist/build.js.map +1 -0
- package/dist/cache.d.ts +14 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +93 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/link.d.ts +3 -7
- package/dist/link.d.ts.map +1 -1
- package/dist/link.js +12 -19
- package/dist/link.js.map +1 -1
- package/dist/merge-hooks.d.ts +3 -0
- package/dist/merge-hooks.d.ts.map +1 -0
- package/dist/merge-hooks.js +54 -0
- package/dist/merge-hooks.js.map +1 -0
- package/dist/pages.d.ts +15 -46
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +2 -0
- package/dist/pages.js.map +1 -1
- package/dist/plugin.d.ts +22 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +156 -0
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/blog/index.d.ts +6 -5
- package/dist/plugins/blog/index.d.ts.map +1 -1
- package/dist/plugins/blog/index.js +16 -0
- package/dist/plugins/blog/index.js.map +1 -1
- package/dist/plugins/random-quote/assets/quotes.json +230 -0
- package/dist/plugins/random-quote/index.d.ts +3 -1
- package/dist/plugins/random-quote/index.d.ts.map +1 -1
- package/dist/plugins/random-quote/index.js +15 -1
- package/dist/plugins/random-quote/index.js.map +1 -1
- package/dist/plugins/sitemap/index.d.ts +14 -0
- package/dist/plugins/sitemap/index.d.ts.map +1 -0
- package/dist/plugins/sitemap/index.js +119 -0
- package/dist/plugins/sitemap/index.js.map +1 -0
- package/dist/render-head.d.ts +2 -2
- package/dist/render-head.d.ts.map +1 -1
- package/dist/render-page.d.ts +2 -4
- package/dist/render-page.d.ts.map +1 -1
- package/dist/render-page.js +7 -3
- package/dist/render-page.js.map +1 -1
- package/dist/site.d.ts +10 -17
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +155 -7
- package/dist/site.js.map +1 -1
- package/dist/slot-content.d.ts +3 -19
- package/dist/slot-content.d.ts.map +1 -1
- package/dist/slot-content.js.map +1 -1
- package/dist/slot-handle.d.ts +7 -25
- package/dist/slot-handle.d.ts.map +1 -1
- package/dist/slot-handle.js +29 -14
- package/dist/slot-handle.js.map +1 -1
- package/dist/stackbox/context.d.ts +2 -51
- package/dist/stackbox/context.d.ts.map +1 -1
- package/dist/stackbox/context.js.map +1 -1
- package/dist/templates.d.ts +7 -57
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +281 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +17 -6
- package/src/plugins/blog/AGENTS.md +5 -1
- package/src/plugins/blog/index.ts +22 -5
- package/src/plugins/random-quote/AGENTS.md +30 -7
- package/src/plugins/random-quote/index.ts +17 -1
- package/src/plugins/random-quote/public_assets/widget.css +5 -0
- package/src/plugins/sitemap/AGENTS.md +82 -0
- package/src/plugins/sitemap/index.ts +156 -0
- package/AGENTS.md +0 -87
- package/dist/modules/blog/module.d.ts +0 -20
- package/dist/modules/blog/module.d.ts.map +0 -1
- package/dist/modules/blog/module.js +0 -52
- package/dist/modules/blog/module.js.map +0 -1
- package/dist/modules/blog/posts.d.ts +0 -15
- package/dist/modules/blog/posts.d.ts.map +0 -1
- package/dist/modules/blog/posts.js +0 -46
- package/dist/modules/blog/posts.js.map +0 -1
- package/dist/modules.d.ts +0 -18
- package/dist/modules.d.ts.map +0 -1
- package/dist/modules.js +0 -25
- package/dist/modules.js.map +0 -1
- package/dist/plugins/blog/module.d.ts +0 -20
- package/dist/plugins/blog/module.d.ts.map +0 -1
- package/dist/plugins/blog/module.js +0 -52
- package/dist/plugins/blog/module.js.map +0 -1
- package/dist/plugins/blog/plugin.d.ts +0 -20
- package/dist/plugins/blog/plugin.d.ts.map +0 -1
- package/dist/plugins/blog/plugin.js +0 -52
- package/dist/plugins/blog/plugin.js.map +0 -1
- package/dist/plugins/random-quote/module.d.ts +0 -9
- package/dist/plugins/random-quote/module.d.ts.map +0 -1
- package/dist/plugins/random-quote/module.js +0 -31
- package/dist/plugins/random-quote/module.js.map +0 -1
- package/dist/plugins/random-quote/plugin.d.ts +0 -8
- package/dist/plugins/random-quote/plugin.d.ts.map +0 -1
- package/dist/plugins/random-quote/plugin.js +0 -31
- package/dist/plugins/random-quote/plugin.js.map +0 -1
- package/dist/plugins/random-quote/quotes.json +0 -230
- package/dist/public/_sb/plugins/random-quote/quotes.json +0 -230
- package/src/plugins/random-quote/public_assets/quotes.json +0 -230
- /package/{dist/plugins/random-quote/public_assets → src/plugins/random-quote/assets}/quotes.json +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/sitemap/index.ts"],"names":[],"mappings":"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"}
|
package/dist/render-head.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type HSHtml } from "@hyperspan/html";
|
|
2
|
-
import type {
|
|
2
|
+
import type { Stackbox as SB } from "./types.js";
|
|
3
3
|
export declare function renderStandardHead(input: {
|
|
4
4
|
title: string;
|
|
5
|
-
meta?: PageMeta;
|
|
5
|
+
meta?: SB.PageMeta;
|
|
6
6
|
}): HSHtml;
|
|
7
7
|
//# sourceMappingURL=render-head.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-head.d.ts","sourceRoot":"","sources":["../src/render-head.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"render-head.d.ts","sourceRoot":"","sources":["../src/render-head.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC;CACpB,GAAG,MAAM,CAyBT"}
|
package/dist/render-page.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { SiteConfig } from "./site.js";
|
|
3
|
-
import type { Stackbox } from "./stackbox/context.js";
|
|
1
|
+
import type { Stackbox as SB } from "./types.js";
|
|
4
2
|
export { RenderError } from "./slot-handle.js";
|
|
5
|
-
export declare function renderPage(page: SitePage, siteConfig: SiteConfig, ctx?:
|
|
3
|
+
export declare function renderPage(page: SB.SitePage, siteConfig: SB.SiteConfig, ctx?: SB.Context, hooks?: SB.SiteHooks): Promise<string>;
|
|
6
4
|
//# sourceMappingURL=render-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-page.d.ts","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-page.d.ts","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAa/C,wBAAsB,UAAU,CAC9B,IAAI,EAAE,EAAE,CAAC,QAAQ,EACjB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,GAAG,CAAC,EAAE,EAAE,CAAC,OAAO,EAChB,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,GACnB,OAAO,CAAC,MAAM,CAAC,CA0BjB"}
|
package/dist/render-page.js
CHANGED
|
@@ -12,19 +12,23 @@ function validateRequiredSlots(page) {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
-
export async function renderPage(page, siteConfig, ctx) {
|
|
15
|
+
export async function renderPage(page, siteConfig, ctx, hooks) {
|
|
16
16
|
validateRequiredSlots(page);
|
|
17
|
-
const renderCtx = { siteConfig, ctx };
|
|
17
|
+
const renderCtx = { siteConfig, ctx, page, hooks };
|
|
18
18
|
const slots = buildPageSlots(page, renderCtx);
|
|
19
19
|
const head = renderStandardHead({
|
|
20
20
|
title: page.template.formatPageTitle(page.title),
|
|
21
21
|
meta: page.meta,
|
|
22
22
|
});
|
|
23
|
-
|
|
23
|
+
let html = await renderAsync(page.template.render({
|
|
24
24
|
head,
|
|
25
25
|
siteConfig,
|
|
26
26
|
page: toPageRenderView(page),
|
|
27
27
|
slots,
|
|
28
28
|
}));
|
|
29
|
+
if (hooks?.afterRender) {
|
|
30
|
+
html = await hooks.afterRender(html, { page, ctx });
|
|
31
|
+
}
|
|
32
|
+
return html;
|
|
29
33
|
}
|
|
30
34
|
//# sourceMappingURL=render-page.js.map
|
package/dist/render-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-page.js","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"render-page.js","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAe,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,SAAS,qBAAqB,CAAC,IAAiB;IAC9C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAmC,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,mBAAmB,CAC3B,kBAAkB,QAAQ,yDAAyD,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAiB,EACjB,UAAyB,EACzB,GAAgB,EAChB,KAAoB;IAEpB,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAqB,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAErE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAE9C,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAChD,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;IAEH,IAAI,IAAI,GAAG,MAAM,WAAW,CAC1B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,UAAU;QACV,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC;QAC5B,KAAK;KACN,CAAC,CACH,CAAC;IAEF,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC;QACvB,IAAI,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/site.d.ts
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export type SiteConfig<T extends Record<string, unknown> = Record<string, unknown>> = {
|
|
3
|
-
readonly __kind: "siteConfig";
|
|
4
|
-
readonly config: T;
|
|
5
|
-
};
|
|
6
|
-
export type Site<T extends Record<string, unknown> = Record<string, unknown>> = {
|
|
7
|
-
readonly __kind: "site";
|
|
8
|
-
readonly siteConfig: SiteConfig<T>;
|
|
9
|
-
readonly pages: readonly SitePage[];
|
|
10
|
-
fetch(request: globalThis.Request, env?: Record<string, unknown>): Promise<globalThis.Response>;
|
|
11
|
-
};
|
|
1
|
+
import type { Stackbox as SB } from "./types.js";
|
|
12
2
|
export declare class SiteError extends Error {
|
|
13
3
|
constructor(message: string);
|
|
14
4
|
}
|
|
15
|
-
export declare function createSiteConfig<T extends Record<string, unknown>>(config: T): SiteConfig<T>;
|
|
16
|
-
export declare function isSiteConfig(value: unknown): value is SiteConfig;
|
|
17
|
-
export declare function createSite<T extends Record<string, unknown>>(siteConfig: SiteConfig<T>, options: {
|
|
18
|
-
pages: [SitePage, ...SitePage[]];
|
|
19
|
-
|
|
20
|
-
|
|
5
|
+
export declare function createSiteConfig<T extends Record<string, unknown>>(config: T): SB.SiteConfig<T>;
|
|
6
|
+
export declare function isSiteConfig(value: unknown): value is SB.SiteConfig;
|
|
7
|
+
export declare function createSite<T extends Record<string, unknown>>(siteConfig: SB.SiteConfig<T>, options: {
|
|
8
|
+
pages: [SB.SitePage, ...SB.SitePage[]];
|
|
9
|
+
plugins?: readonly SB.Plugin[];
|
|
10
|
+
cacheAdapter?: SB.CacheAdapter;
|
|
11
|
+
hooks?: SB.SiteHooks;
|
|
12
|
+
}): SB.Site<T>;
|
|
13
|
+
export declare function isSite(value: unknown): value is SB.Site;
|
|
21
14
|
//# sourceMappingURL=site.d.ts.map
|
package/dist/site.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAWD,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,MAAM,EAAE,CAAC,GACR,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAMlB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,UAAU,CASnE;AAoGD,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAC5B,OAAO,EAAE;IACP,KAAK,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC;IAC/B,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;CACtB,GACA,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAgNZ;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAUvD"}
|
package/dist/site.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { buildPageCacheKey, cacheControlFresh, cacheControlStale, collectPageCacheConfigs, createMemoryCache, isCacheEntryFresh, isPageCacheDisabled, isSuccessfulRender, resolvePageCacheTtlMs, } from "./cache.js";
|
|
1
2
|
import { isPage } from "./pages.js";
|
|
2
3
|
import { renderPage } from "./render-page.js";
|
|
3
4
|
import { servePluginAsset } from "./link.js";
|
|
5
|
+
import { assertPlugin, } from "./plugin.js";
|
|
6
|
+
import { mergeSiteHooks } from "./merge-hooks.js";
|
|
4
7
|
import { normalizePathname } from "./routing.js";
|
|
5
8
|
import { createContext } from "./stackbox/context.js";
|
|
6
9
|
export class SiteError extends Error {
|
|
@@ -49,6 +52,54 @@ function buildPageMap(pages) {
|
|
|
49
52
|
}
|
|
50
53
|
return map;
|
|
51
54
|
}
|
|
55
|
+
function assertUniquePluginNames(plugins) {
|
|
56
|
+
const seen = new Set();
|
|
57
|
+
for (const plugin of plugins) {
|
|
58
|
+
if (seen.has(plugin.name)) {
|
|
59
|
+
throw new SiteError(`createSite(siteConfig, options): duplicate plugin name "${plugin.name}"`);
|
|
60
|
+
}
|
|
61
|
+
seen.add(plugin.name);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function collectPluginRoutes(plugins, site, pagePaths) {
|
|
65
|
+
const routes = new Map();
|
|
66
|
+
for (const plugin of plugins) {
|
|
67
|
+
if (!plugin.routes) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const declared = plugin.routes({ site });
|
|
71
|
+
if (declared instanceof Promise) {
|
|
72
|
+
throw new SiteError(`createSite(siteConfig, options): plugin "${plugin.name}" routes must return synchronously`);
|
|
73
|
+
}
|
|
74
|
+
for (const route of declared) {
|
|
75
|
+
const path = normalizePathname(route.path);
|
|
76
|
+
if (pagePaths.has(path)) {
|
|
77
|
+
throw new SiteError(`createSite(siteConfig, options): plugin route "${path}" conflicts with a page path`);
|
|
78
|
+
}
|
|
79
|
+
if (routes.has(path)) {
|
|
80
|
+
throw new SiteError(`createSite(siteConfig, options): duplicate plugin route "${path}"`);
|
|
81
|
+
}
|
|
82
|
+
routes.set(path, route.fetch);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return routes;
|
|
86
|
+
}
|
|
87
|
+
function collectPluginHooks(plugins, site) {
|
|
88
|
+
const collected = [];
|
|
89
|
+
for (const plugin of plugins) {
|
|
90
|
+
if (!plugin.hooks) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const declared = plugin.hooks({ site });
|
|
94
|
+
if (declared instanceof Promise) {
|
|
95
|
+
throw new SiteError(`createSite(siteConfig, options): plugin "${plugin.name}" hooks must return synchronously`);
|
|
96
|
+
}
|
|
97
|
+
if (declared) {
|
|
98
|
+
collected.push(declared);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return collected;
|
|
102
|
+
}
|
|
52
103
|
export function createSite(siteConfig, options) {
|
|
53
104
|
if (!isSiteConfig(siteConfig)) {
|
|
54
105
|
throw new SiteError("createSite(siteConfig, options): siteConfig must be from createSiteConfig()");
|
|
@@ -62,32 +113,128 @@ export function createSite(siteConfig, options) {
|
|
|
62
113
|
throw new SiteError("createSite(siteConfig, options): every page must be from createPage()");
|
|
63
114
|
}
|
|
64
115
|
}
|
|
116
|
+
const plugins = options.plugins ?? [];
|
|
117
|
+
if (!Array.isArray(plugins)) {
|
|
118
|
+
throw new SiteError("createSite(siteConfig, options): plugins must be an array of createPlugin() results");
|
|
119
|
+
}
|
|
120
|
+
for (const plugin of plugins) {
|
|
121
|
+
try {
|
|
122
|
+
assertPlugin(plugin, "createSite(siteConfig, options)");
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
throw new SiteError(error instanceof Error ? error.message : String(error));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
assertUniquePluginNames(plugins);
|
|
65
129
|
assertUniquePaths(pages);
|
|
66
130
|
const pageMap = buildPageMap(pages);
|
|
131
|
+
const pagePaths = new Set(pageMap.keys());
|
|
132
|
+
const siteShell = {
|
|
133
|
+
__kind: "site",
|
|
134
|
+
siteConfig,
|
|
135
|
+
pages,
|
|
136
|
+
plugins,
|
|
137
|
+
async fetch() {
|
|
138
|
+
return new globalThis.Response("Site not ready", { status: 500 });
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
const pluginRoutes = collectPluginRoutes(plugins, siteShell, pagePaths);
|
|
142
|
+
const cacheAdapter = options.cacheAdapter ?? createMemoryCache();
|
|
143
|
+
const hooks = mergeSiteHooks(...collectPluginHooks(plugins, siteShell), options.hooks);
|
|
144
|
+
const inFlightRenders = new Map();
|
|
145
|
+
async function applyBeforeResponse(response, request, ctx, page) {
|
|
146
|
+
if (!hooks?.beforeResponse) {
|
|
147
|
+
return response;
|
|
148
|
+
}
|
|
149
|
+
return hooks.beforeResponse(response, { request, page, ctx });
|
|
150
|
+
}
|
|
151
|
+
async function renderAndStore(key, page, ctx, ttlMs) {
|
|
152
|
+
const existing = inFlightRenders.get(key);
|
|
153
|
+
if (existing) {
|
|
154
|
+
return existing;
|
|
155
|
+
}
|
|
156
|
+
const promise = (async () => {
|
|
157
|
+
const html = await renderPage(page, siteConfig, ctx, hooks);
|
|
158
|
+
if (isSuccessfulRender(html)) {
|
|
159
|
+
await cacheAdapter.set(key, {
|
|
160
|
+
html,
|
|
161
|
+
expiresAt: Date.now() + ttlMs,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return html;
|
|
165
|
+
})();
|
|
166
|
+
inFlightRenders.set(key, promise);
|
|
167
|
+
try {
|
|
168
|
+
return await promise;
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
if (inFlightRenders.get(key) === promise) {
|
|
172
|
+
inFlightRenders.delete(key);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function startBackgroundRefresh(key, page, ctx, ttlMs) {
|
|
177
|
+
if (inFlightRenders.has(key)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
void renderAndStore(key, page, ctx, ttlMs).catch(() => {
|
|
181
|
+
// Keep serving the last good HTML on refresh failure.
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
async function respondWithHtml(html, method, cacheControl, ctx) {
|
|
185
|
+
const headers = { "Cache-Control": cacheControl };
|
|
186
|
+
if (method === "HEAD") {
|
|
187
|
+
return ctx.res.html("", { status: 200, headers });
|
|
188
|
+
}
|
|
189
|
+
return ctx.res.html(html, { status: 200, headers });
|
|
190
|
+
}
|
|
67
191
|
return {
|
|
68
192
|
__kind: "site",
|
|
69
193
|
siteConfig,
|
|
70
194
|
pages,
|
|
195
|
+
plugins,
|
|
71
196
|
async fetch(request, env = {}) {
|
|
72
197
|
const ctx = createContext(request, env);
|
|
73
198
|
const method = ctx.req.method;
|
|
199
|
+
const pathname = normalizePathname(ctx.req.url.pathname);
|
|
200
|
+
const pluginRoute = pluginRoutes.get(pathname);
|
|
201
|
+
if (pluginRoute) {
|
|
202
|
+
return pluginRoute(request, ctx);
|
|
203
|
+
}
|
|
74
204
|
if (method !== "GET" && method !== "HEAD") {
|
|
75
205
|
return ctx.res.text("Method Not Allowed", { status: 405 });
|
|
76
206
|
}
|
|
77
|
-
const
|
|
78
|
-
const pluginAsset = servePluginAsset(pathname, method);
|
|
207
|
+
const pluginAsset = servePluginAsset(pathname, method, plugins);
|
|
79
208
|
if (pluginAsset) {
|
|
80
209
|
return pluginAsset;
|
|
81
210
|
}
|
|
82
211
|
const page = pageMap.get(pathname);
|
|
83
212
|
if (!page) {
|
|
84
|
-
return ctx.res.notFound();
|
|
213
|
+
return applyBeforeResponse(await ctx.res.notFound(), request, ctx);
|
|
214
|
+
}
|
|
215
|
+
const cacheKey = buildPageCacheKey(pathname, ctx.req.url.search);
|
|
216
|
+
const cacheConfigs = collectPageCacheConfigs(page, siteConfig);
|
|
217
|
+
const hookAllowsCache = hooks?.shouldCache
|
|
218
|
+
? hooks.shouldCache(request)
|
|
219
|
+
: true;
|
|
220
|
+
async function respondForPage(html, cacheControl) {
|
|
221
|
+
return applyBeforeResponse(await respondWithHtml(html, method, cacheControl, ctx), request, ctx, page);
|
|
222
|
+
}
|
|
223
|
+
if (isPageCacheDisabled(cacheConfigs) || !hookAllowsCache) {
|
|
224
|
+
const html = await renderPage(page, siteConfig, ctx, hooks);
|
|
225
|
+
return respondForPage(html, "no-store");
|
|
226
|
+
}
|
|
227
|
+
const ttlMs = resolvePageCacheTtlMs(cacheConfigs);
|
|
228
|
+
const cached = await cacheAdapter.get(cacheKey);
|
|
229
|
+
if (cached && isCacheEntryFresh(cached)) {
|
|
230
|
+
return respondForPage(cached.html, cacheControlFresh(ttlMs));
|
|
85
231
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return
|
|
232
|
+
if (cached) {
|
|
233
|
+
startBackgroundRefresh(cacheKey, page, ctx, ttlMs);
|
|
234
|
+
return respondForPage(cached.html, cacheControlStale(ttlMs));
|
|
89
235
|
}
|
|
90
|
-
|
|
236
|
+
const html = await renderAndStore(cacheKey, page, ctx, ttlMs);
|
|
237
|
+
return respondForPage(html, cacheControlFresh(ttlMs));
|
|
91
238
|
},
|
|
92
239
|
};
|
|
93
240
|
}
|
|
@@ -97,6 +244,7 @@ export function isSite(value) {
|
|
|
97
244
|
value.__kind === "site" &&
|
|
98
245
|
isSiteConfig(value.siteConfig) &&
|
|
99
246
|
Array.isArray(value.pages) &&
|
|
247
|
+
Array.isArray(value.plugins) &&
|
|
100
248
|
typeof value.fetch === "function");
|
|
101
249
|
}
|
|
102
250
|
//# sourceMappingURL=site.js.map
|
package/dist/site.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,MAAe,EAAE,KAAa;IAC1D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,oCAAoC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAS;IAET,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACzD,OAAO;QACL,MAAM,EAAE,YAAqB;QAC7B,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAuB,CAAC,MAAM,KAAK,YAAY;QAChD,OAAQ,KAAuB,CAAC,MAAM,KAAK,QAAQ;QAClD,KAAuB,CAAC,MAAM,KAAK,IAAI;QACxC,CAAC,KAAK,CAAC,OAAO,CAAE,KAAuB,CAAC,MAAM,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAoB;IAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CACjB,wBAAwB,IAAI,CAAC,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC,KAAK,GAAG,CACrE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA6B;IAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CACjB,2DAA2D,MAAM,CAAC,IAAI,GAAG,CAC1E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAA6B,EAC7B,IAAa,EACb,SAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,SAAS,CACjB,4CAA4C,MAAM,CAAC,IAAI,oCAAoC,CAC5F,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,SAAS,CACjB,kDAAkD,IAAI,8BAA8B,CACrF,CAAC;YACJ,CAAC;YACD,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,SAAS,CACjB,4DAA4D,IAAI,GAAG,CACpE,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CACzB,OAA6B,EAC7B,IAAa;IAEb,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,SAAS,CACjB,4CAA4C,MAAM,CAAC,IAAI,mCAAmC,CAC3F,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,UAA4B,EAC5B,OAKC;IAED,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CACjB,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,SAAS,CACjB,kEAAkE,CACnE,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,SAAS,CACjB,uEAAuE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,SAAS,CACjB,qFAAqF,CACtF,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,YAAY,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CACjB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEjC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,SAAS,GAAe;QAC5B,MAAM,EAAE,MAAe;QACvB,UAAU;QACV,KAAK;QACL,OAAO;QACP,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,CAAC;KACF,CAAC;IAEF,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,iBAAiB,EAAE,CAAC;IACjE,MAAM,KAAK,GAAG,cAAc,CAC1B,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EACzC,OAAO,CAAC,KAAK,CACd,CAAC;IACF,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE3D,KAAK,UAAU,mBAAmB,CAChC,QAA6B,EAC7B,OAA2B,EAC3B,GAAqC,EACrC,IAAkB;QAElB,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,IAAiB,EACjB,GAAqC,EACrC,KAAa;QAEb,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE;oBAC1B,IAAI;oBACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBAC9B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,EAAE,CAAC;QAEL,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;gBACzC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,sBAAsB,CAC7B,GAAW,EACX,IAAiB,EACjB,GAAqC,EACrC,KAAa;QAEb,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,KAAK,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACpD,sDAAsD;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,eAAe,CAC5B,IAAY,EACZ,MAAc,EACd,YAAoB,EACpB,GAAqC;QAErC,MAAM,OAAO,GAAG,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;QAClD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAe;QACvB,UAAU;QACV,KAAK;QACL,OAAO;QACP,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,EAAE;YAC3B,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEzD,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1C,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChE,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,mBAAmB,CACxB,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EACxB,OAAO,EACP,GAAG,CACJ,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC/D,MAAM,eAAe,GAAG,KAAK,EAAE,WAAW;gBACxC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;gBAC5B,CAAC,CAAC,IAAI,CAAC;YAET,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,YAAoB;gBAEpB,OAAO,mBAAmB,CACxB,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,EACtD,OAAO,EACP,GAAG,EACH,IAAI,CACL,CAAC;YACJ,CAAC;YAED,IAAI,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC5D,OAAO,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,KAAK,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEhD,IAAI,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,MAAM,EAAE,CAAC;gBACX,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnD,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,cAAc,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiB,CAAC,MAAM,KAAK,MAAM;QACpC,YAAY,CAAE,KAAiB,CAAC,UAAU,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAE,KAAiB,CAAC,KAAK,CAAC;QACvC,KAAK,CAAC,OAAO,CAAE,KAAiB,CAAC,OAAO,CAAC;QACzC,OAAQ,KAAiB,CAAC,KAAK,KAAK,UAAU,CAC/C,CAAC;AACJ,CAAC"}
|
package/dist/slot-content.d.ts
CHANGED
|
@@ -1,27 +1,11 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
import type { SlotDefinition, SlotNamesFrom } from "./templates.js";
|
|
4
|
-
export type DefaultSlotContent = Block | string;
|
|
2
|
+
import type { Stackbox as SB } from "./types.js";
|
|
5
3
|
/** Accepts any block or HTML string (default slot content). */
|
|
6
|
-
export declare const anySlotContentSchema: z.ZodType<DefaultSlotContent>;
|
|
4
|
+
export declare const anySlotContentSchema: z.ZodType<SB.DefaultSlotContent>;
|
|
7
5
|
/** Accepts only HTML strings. */
|
|
8
6
|
export declare const stringSlotContentSchema: z.ZodString;
|
|
9
7
|
/** Accepts only CMS blocks. */
|
|
10
|
-
export declare const blockSlotContentSchema: z.ZodType<Block>;
|
|
11
|
-
export type SlotContentFromDefinition<D extends SlotDefinition> = D extends {
|
|
12
|
-
options: {
|
|
13
|
-
schema: infer Schema extends z.ZodTypeAny;
|
|
14
|
-
};
|
|
15
|
-
} ? z.input<Schema> : DefaultSlotContent;
|
|
16
|
-
export type PageSlotsInput<S extends readonly SlotDefinition[], Required extends string> = {
|
|
17
|
-
[K in Required]: SlotContentFromDefinition<Extract<S[number], {
|
|
18
|
-
name: K;
|
|
19
|
-
}>>[];
|
|
20
|
-
} & Partial<{
|
|
21
|
-
[K in Exclude<SlotNamesFrom<S>, Required>]: SlotContentFromDefinition<Extract<S[number], {
|
|
22
|
-
name: K;
|
|
23
|
-
}>>[];
|
|
24
|
-
}>;
|
|
8
|
+
export declare const blockSlotContentSchema: z.ZodType<SB.Block>;
|
|
25
9
|
export declare function validateSlotContentItem(slotName: string, item: unknown, schema: z.ZodTypeAny | undefined): void;
|
|
26
10
|
export declare class SlotContentValidationError extends Error {
|
|
27
11
|
constructor(slotName: string, message: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-content.d.ts","sourceRoot":"","sources":["../src/slot-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"slot-content.d.ts","sourceRoot":"","sources":["../src/slot-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,YAAY,CAAC;AAEjD,+DAA+D;AAC/D,eAAO,MAAM,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,kBAAkB,CAGhE,CAAC;AAEH,iCAAiC;AACjC,eAAO,MAAM,uBAAuB,aAAe,CAAC;AAEpD,+BAA+B;AAC/B,eAAO,MAAM,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAEtD,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,GAC/B,IAAI,CAkBN;AAED,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI9C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAMxD"}
|
package/dist/slot-content.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-content.js","sourceRoot":"","sources":["../src/slot-content.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"slot-content.js","sourceRoot":"","sources":["../src/slot-content.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,+DAA+D;AAC/D,MAAM,CAAC,MAAM,oBAAoB,GAAqC,GAAG,CAAC,KAAK,CAAC;IAC9E,GAAG,CAAC,MAAM,EAAE;IACZ,GAAG,CAAC,MAAM,CAAW,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;CAChD,CAAC,CAAC;AAEH,iCAAiC;AACjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;AAEpD,+BAA+B;AAC/B,MAAM,CAAC,MAAM,sBAAsB,GAAwB,GAAG,CAAC,MAAM,CACnE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAC1B,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,QAAgB,EAChB,IAAa,EACb,MAAgC;IAEhC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,0BAA0B,CAClC,QAAQ,EACR,MAAM,CAAC,KAAK,CAAC,OAAO,CACrB,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,0BAA0B,CAClC,QAAQ,EACR,+BAA+B,CAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnD,YAAY,QAAgB,EAAE,OAAe;QAC3C,KAAK,CAAC,SAAS,QAAQ,gCAAgC,OAAO,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAgB;IAC7C,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,IAAI,EAAE,EAAE,CACP,OAAO,CAAC,IAAI,CAAC;QACb,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC"}
|
package/dist/slot-handle.d.ts
CHANGED
|
@@ -1,32 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type HSHtml } from "@hyperspan/html";
|
|
2
2
|
import type { z } from "zod";
|
|
3
|
-
import type {
|
|
4
|
-
import { type DefaultSlotContent, type SlotContentFromDefinition } from "./slot-content.js";
|
|
5
|
-
import type { SlotDefinition, SlotNamesFrom } from "./templates.js";
|
|
3
|
+
import type { Stackbox as SB } from "./types.js";
|
|
6
4
|
export declare class RenderError extends Error {
|
|
7
5
|
constructor(message: string);
|
|
8
6
|
}
|
|
9
7
|
export declare const SLOT_SENTINEL_PREFIX = "<!--__STACKBOX_SLOT__:";
|
|
10
8
|
export declare function slotSentinel(name: string): string;
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
readonly definition: D;
|
|
17
|
-
readonly content: readonly TContent[];
|
|
18
|
-
render(): SlotRenderValue;
|
|
19
|
-
};
|
|
20
|
-
export type TemplateSlotsFrom<S extends readonly SlotDefinition[]> = {
|
|
21
|
-
[K in SlotNamesFrom<S>]: Slot<SlotContentFromDefinition<Extract<S[number], {
|
|
22
|
-
name: K;
|
|
23
|
-
}>>, Extract<S[number], {
|
|
24
|
-
name: K;
|
|
25
|
-
}>>;
|
|
26
|
-
};
|
|
27
|
-
export declare function renderSlotContent(slotName: string, items: readonly unknown[], ctx: RenderContext, schema: z.ZodTypeAny | undefined): Promise<HSHtml>;
|
|
28
|
-
export declare function createStubSlot<D extends SlotDefinition>(definition: D): Slot<DefaultSlotContent, D>;
|
|
29
|
-
export declare function createPageSlot<D extends SlotDefinition>(definition: D, content: readonly SlotContentFromDefinition<D>[], ctx: RenderContext): Slot<SlotContentFromDefinition<D>, D>;
|
|
30
|
-
export declare function buildStubSlots<S extends readonly SlotDefinition[]>(definitions: S): TemplateSlotsFrom<S>;
|
|
31
|
-
export declare function buildPageSlots(page: SitePage, ctx: RenderContext): Record<string, Slot>;
|
|
9
|
+
export declare function renderSlotContent(slotName: string, items: readonly unknown[], ctx: SB.RenderContext, schema: z.ZodTypeAny | undefined): Promise<HSHtml>;
|
|
10
|
+
export declare function createStubSlot<D extends SB.SlotDefinition>(definition: D): SB.Slot<SB.DefaultSlotContent, D>;
|
|
11
|
+
export declare function createPageSlot<D extends SB.SlotDefinition>(definition: D, content: readonly SB.SlotContentFromDefinition<D>[], ctx: SB.RenderContext): SB.Slot<SB.SlotContentFromDefinition<D>, D>;
|
|
12
|
+
export declare function buildStubSlots<S extends readonly SB.SlotDefinition[]>(definitions: S): SB.TemplateSlotsFrom<S>;
|
|
13
|
+
export declare function buildPageSlots(page: SB.SitePage, ctx: SB.RenderContext): Record<string, SB.Slot>;
|
|
32
14
|
//# sourceMappingURL=slot-handle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-handle.d.ts","sourceRoot":"","sources":["../src/slot-handle.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"slot-handle.d.ts","sourceRoot":"","sources":["../src/slot-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,YAAY,CAAC;AAKjD,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAE7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AA0BD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,GAAG,EAAE,EAAE,CAAC,aAAa,EACrB,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,GAC/B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,wBAAgB,cAAc,CAC5B,CAAC,SAAS,EAAE,CAAC,cAAc,EAC3B,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,CASlD;AAED,wBAAgB,cAAc,CAC5B,CAAC,SAAS,EAAE,CAAC,cAAc,EAE3B,UAAU,EAAE,CAAC,EACb,OAAO,EAAE,SAAS,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EACnD,GAAG,EAAE,EAAE,CAAC,aAAa,GACpB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAU7C;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,cAAc,EAAE,EACnE,WAAW,EAAE,CAAC,GACb,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAQzB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,EAAE,CAAC,QAAQ,EACjB,GAAG,EAAE,EAAE,CAAC,aAAa,GACpB,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAUzB"}
|
package/dist/slot-handle.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { html } from "@hyperspan/html";
|
|
1
|
+
import { html, renderAsync } from "@hyperspan/html";
|
|
2
2
|
import { isBlock } from "./blocks.js";
|
|
3
3
|
import { validateSlotContentItem, } from "./slot-content.js";
|
|
4
4
|
export class RenderError extends Error {
|
|
@@ -11,21 +11,36 @@ export const SLOT_SENTINEL_PREFIX = "<!--__STACKBOX_SLOT__:";
|
|
|
11
11
|
export function slotSentinel(name) {
|
|
12
12
|
return `${SLOT_SENTINEL_PREFIX}${name}-->`;
|
|
13
13
|
}
|
|
14
|
+
async function renderSlotItemHtml(slotName, item, ctx, schema) {
|
|
15
|
+
try {
|
|
16
|
+
validateSlotContentItem(slotName, item, schema);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
throw new RenderError(err instanceof Error ? err.message : String(err));
|
|
20
|
+
}
|
|
21
|
+
if (typeof item === "string") {
|
|
22
|
+
return item;
|
|
23
|
+
}
|
|
24
|
+
if (isBlock(item)) {
|
|
25
|
+
const rendered = await item.render(ctx);
|
|
26
|
+
return renderAsync(rendered);
|
|
27
|
+
}
|
|
28
|
+
throw new RenderError("invalid slot content; expected block or HTML string");
|
|
29
|
+
}
|
|
14
30
|
export function renderSlotContent(slotName, items, ctx, schema) {
|
|
15
|
-
return Promise.all(items.map(async (item) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return item.render(ctx);
|
|
31
|
+
return Promise.all(items.map(async (item, index) => {
|
|
32
|
+
let htmlString = await renderSlotItemHtml(slotName, item, ctx, schema);
|
|
33
|
+
const hook = ctx.hooks?.renderSlotItem;
|
|
34
|
+
if (hook && ctx.page) {
|
|
35
|
+
htmlString = await hook(htmlString, {
|
|
36
|
+
item: item,
|
|
37
|
+
slot: slotName,
|
|
38
|
+
index,
|
|
39
|
+
page: ctx.page,
|
|
40
|
+
ctx: ctx.ctx,
|
|
41
|
+
});
|
|
27
42
|
}
|
|
28
|
-
|
|
43
|
+
return html.raw(htmlString);
|
|
29
44
|
})).then((chunks) => html `${chunks}`);
|
|
30
45
|
}
|
|
31
46
|
export function createStubSlot(definition) {
|
package/dist/slot-handle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slot-handle.js","sourceRoot":"","sources":["../src/slot-handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"slot-handle.js","sourceRoot":"","sources":["../src/slot-handle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
maxAge?: number;
|
|
4
|
-
domain?: string;
|
|
5
|
-
path?: string;
|
|
6
|
-
expires?: Date;
|
|
7
|
-
httpOnly?: boolean;
|
|
8
|
-
secure?: boolean;
|
|
9
|
-
sameSite?: "lax" | "strict" | true;
|
|
10
|
-
};
|
|
11
|
-
type Cookies = {
|
|
12
|
-
_req: globalThis.Request;
|
|
13
|
-
_responseHeaders: Headers | undefined;
|
|
14
|
-
_parsedCookies: Record<string, string>;
|
|
15
|
-
_encrypt: ((str: string) => string) | undefined;
|
|
16
|
-
_decrypt: ((str: string) => string) | undefined;
|
|
17
|
-
get: (name: string) => string | undefined;
|
|
18
|
-
set: (name: string, value: string, options?: CookieOptions) => void;
|
|
19
|
-
delete: (name: string) => void;
|
|
20
|
-
};
|
|
21
|
-
type Request = {
|
|
22
|
-
url: URL;
|
|
23
|
-
raw: globalThis.Request;
|
|
24
|
-
method: string;
|
|
25
|
-
headers: Headers;
|
|
26
|
-
query: URLSearchParams;
|
|
27
|
-
cookies: Cookies;
|
|
28
|
-
text: () => Promise<string>;
|
|
29
|
-
json: <T = unknown>() => Promise<T>;
|
|
30
|
-
formData: () => Promise<FormData>;
|
|
31
|
-
urlencoded: () => Promise<URLSearchParams>;
|
|
32
|
-
};
|
|
33
|
-
type Response = {
|
|
34
|
-
cookies: Cookies;
|
|
35
|
-
headers: Headers;
|
|
36
|
-
status: number | undefined;
|
|
37
|
-
html: (html: string, options?: ResponseInit) => Promise<globalThis.Response>;
|
|
38
|
-
json: (json: unknown, options?: ResponseInit) => Promise<globalThis.Response>;
|
|
39
|
-
text: (text: string, options?: ResponseInit) => Promise<globalThis.Response>;
|
|
40
|
-
redirect: (url: string, options?: ResponseInit) => Promise<globalThis.Response>;
|
|
41
|
-
error: (error: Error, options?: ResponseInit) => Promise<globalThis.Response>;
|
|
42
|
-
notFound: (options?: ResponseInit) => Promise<globalThis.Response>;
|
|
43
|
-
merge: (response: globalThis.Response) => Promise<globalThis.Response>;
|
|
44
|
-
};
|
|
45
|
-
interface Context<TEnv extends Record<string, unknown> = Record<string, unknown>> {
|
|
46
|
-
env: TEnv;
|
|
47
|
-
req: Request;
|
|
48
|
-
res: Response;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
export declare function createContext<TEnv extends Record<string, unknown> = Record<string, unknown>>(raw: globalThis.Request, env?: TEnv): Stackbox.Context<TEnv>;
|
|
1
|
+
import type { Stackbox as SB } from "../types.js";
|
|
2
|
+
export declare function createContext<TEnv extends Record<string, unknown> = Record<string, unknown>>(raw: globalThis.Request, env?: TEnv): SB.Context<TEnv>;
|
|
52
3
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/stackbox/context.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/stackbox/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,aAAa,CAAC;AA+JlD,wBAAgB,aAAa,CAC3B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAyBnE"}
|