acrylblends 0.6.3 → 0.6.4
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 +3 -2
- package/docs/framework/README.md +2 -2
- package/docs/framework/UPSTREAM.md +1 -1
- package/docs/framework/guides/jsx.md +24 -0
- package/docs/framework/helpers/ssg.md +3 -6
- package/docs/framework/middleware/builtin/jsx-renderer.md +0 -3
- package/docs/framework/upstream.json +2 -2
- package/lib/accepts.d.ts +1 -1
- package/lib/acryl-base.d.ts +1 -1
- package/lib/adapter.d.ts +1 -1
- package/lib/{app-wFwpg-bt.d.ts → app-D8riatvv.d.ts} +1 -1
- package/lib/basic-auth.d.ts +1 -1
- package/lib/bearer-auth.d.ts +1 -1
- package/lib/body-limit.d.ts +1 -1
- package/lib/cache.d.ts +1 -1
- package/lib/cache.js +4 -4
- package/lib/{client-BHTr318g.js → client-DDLXwhBo.js} +2 -125
- package/lib/client.d.ts +2 -2
- package/lib/client.js +2 -1
- package/lib/combine.d.ts +1 -1
- package/lib/{components-Ce5FRyHU.js → components-0o0CBYNv.js} +2 -2
- package/lib/{components-DYZdxJIJ.js → components-DdI7-ns7.js} +1 -1
- package/lib/compress.d.ts +1 -1
- package/lib/conninfo.d.ts +2 -2
- package/lib/{context-DVQBjuns.d.ts → context-DS3fYyG-.d.ts} +1 -1
- package/lib/context-storage.d.ts +1 -1
- package/lib/cookie.d.ts +1 -1
- package/lib/cors.d.ts +1 -1
- package/lib/csrf.d.ts +1 -1
- package/lib/dev.d.ts +2 -2
- package/lib/etag.d.ts +1 -1
- package/lib/factory.d.ts +2 -2
- package/lib/{hooks-Bq5q9IMl.js → hooks-BMw6BAyP.js} +5 -5
- package/lib/{index-CUTfU69R.d.ts → index-Bb7YJKCq.d.ts} +2 -2
- package/lib/{index-CsvB-F9j.d.ts → index-BvFh1Gfx.d.ts} +1 -1
- package/lib/{index-Cqcdluyn.d.ts → index-CTy4N7ng.d.ts} +2 -2
- package/lib/index.d.ts +4 -4
- package/lib/ip-restriction.d.ts +2 -2
- package/lib/jsx/dom/client.js +1 -1
- package/lib/jsx/dom/jsx-dev-runtime.js +1 -1
- package/lib/jsx/dom/jsx-runtime.js +1 -1
- package/lib/jsx/dom/server.js +1 -1
- package/lib/jsx/dom.js +3 -3
- package/lib/jsx/streaming.js +1 -1
- package/lib/{jsx-dev-runtime-kAhR_4C7.js → jsx-dev-runtime-D18Y35TI.js} +1 -1
- package/lib/jsx-renderer.d.ts +75 -0
- package/lib/jsx-renderer.js +99 -0
- package/lib/jsx.js +3 -3
- package/lib/jwk.d.ts +1 -1
- package/lib/jwt.d.ts +1 -1
- package/lib/language.d.ts +1 -1
- package/lib/logger.d.ts +1 -1
- package/lib/loopback-only.d.ts +1 -1
- package/lib/method-not-allowed.d.ts +2 -2
- package/lib/method-override.d.ts +2 -2
- package/lib/mount.d.ts +1 -1
- package/lib/node-server/conninfo.d.ts +1 -1
- package/lib/node-server/serve-static.d.ts +1 -1
- package/lib/node-server/serve-static.js +1 -1
- package/lib/node-server.d.ts +1 -1
- package/lib/node-server.js +1 -1
- package/lib/powered-by.d.ts +1 -1
- package/lib/pretty-json.d.ts +1 -1
- package/lib/quick.d.ts +1 -1
- package/lib/request-id.d.ts +1 -1
- package/lib/request.d.ts +1 -1
- package/lib/route.d.ts +1 -1
- package/lib/schema-validator.d.ts +1 -1
- package/lib/secure-headers.d.ts +1 -1
- package/lib/{serve-static-Cw23shXv.js → serve-static-B14MF1Va.js} +1 -0
- package/lib/serve-static.d.ts +1 -1
- package/lib/ssg-BwjcA-Ge.js +389 -0
- package/lib/ssg.d.ts +156 -0
- package/lib/ssg.js +2 -0
- package/lib/streaming.d.ts +1 -1
- package/lib/testing.d.ts +3 -3
- package/lib/testing.js +1 -1
- package/lib/timeout.d.ts +1 -1
- package/lib/timing.d.ts +1 -1
- package/lib/tiny.d.ts +1 -1
- package/lib/trailing-slash.d.ts +1 -1
- package/lib/{types-nEL8VPDC.d.ts → types-Dv_nV2cv.d.ts} +1 -1
- package/lib/{types-CQiGmsWW.d.ts → types-zNxyEpG2.d.ts} +2 -2
- package/lib/types.d.ts +1 -1
- package/lib/utils/body.d.ts +1 -1
- package/lib/utils/ipaddr.d.ts +1 -1
- package/lib/utils-Cx61GFMC.js +125 -0
- package/lib/validator.d.ts +1 -1
- package/lib/ws.d.ts +1 -1
- package/package.json +9 -1
- package/plugins/acryl-inspect/upstream.json +1 -1
- package/plugins/acryl-node-server/upstream.json +1 -1
- package/plugins/acryl-router/src/core/helper/ssg/index.ts +14 -0
- package/plugins/acryl-router/src/core/helper/ssg/middleware.ts +83 -0
- package/plugins/acryl-router/src/core/helper/ssg/plugins.ts +72 -0
- package/plugins/acryl-router/src/core/helper/ssg/ssg.ts +471 -0
- package/plugins/acryl-router/src/core/helper/ssg/utils.ts +118 -0
- package/plugins/acryl-router/src/core/jsx/dom/render.ts +6 -6
- package/plugins/acryl-router/src/core/middleware/cache/index.ts +4 -4
- package/plugins/acryl-router/src/core/middleware/jsx-renderer/index.ts +162 -0
- package/plugins/acryl-router/src/helpers/index.ts +1 -0
- package/plugins/acryl-router/src/middleware/index.ts +1 -0
- package/plugins/acryl-router/upstream.json +2 -2
- package/plugins/acryl-router-http/upstream.json +1 -1
- package/plugins/acryl-state/upstream.json +1 -1
- package/plugins/desktop/upstream.json +1 -1
- package/plugins/desktop-web/upstream.json +1 -1
- package/plugins/extensions/resolve.ts +4 -0
- package/shared/AGENTS.core.md +4 -0
- package/templates/agent/tsconfig.json +7 -1
- package/templates/todo/upstream.json +1 -1
- package/plugins/acryl-inspect/tests/report.spec.ts +0 -69
- package/plugins/acryl-inspect/tests/service.spec.ts +0 -121
- package/plugins/acryl-node-server/tests/adapter/app.ts +0 -76
- package/plugins/acryl-node-server/tests/adapter/assets/.static/plain.txt +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/favicon.ico +0 -0
- package/plugins/acryl-node-server/tests/adapter/assets/secret.txt +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/admin/secret.txt +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/data.json +0 -5
- package/plugins/acryl-node-server/tests/adapter/assets/static/extensionless +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/foo..bar.txt +0 -0
- package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static/plain.txt +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-context-path/plain.txt +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.bin.br +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.br +0 -1
- package/plugins/acryl-node-server/tests/adapter/assets/static-with-precompressed/hello.txt.zst +0 -1
- package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +0 -34
- package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +0 -248
- package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +0 -457
- package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-cert.pem +0 -23
- package/plugins/acryl-node-server/tests/adapter/fixtures/keys/agent1-key.pem +0 -27
- package/plugins/acryl-node-server/tests/adapter/headers.test.ts +0 -252
- package/plugins/acryl-node-server/tests/adapter/helpers/request.ts +0 -190
- package/plugins/acryl-node-server/tests/adapter/listener.test.ts +0 -727
- package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +0 -189
- package/plugins/acryl-node-server/tests/adapter/request.test.ts +0 -1230
- package/plugins/acryl-node-server/tests/adapter/response.test.ts +0 -285
- package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +0 -849
- package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +0 -790
- package/plugins/acryl-node-server/tests/adapter/server.test.ts +0 -1312
- package/plugins/acryl-node-server/tests/adapter/setup.ts +0 -16
- package/plugins/acryl-node-server/tests/adapter/url.test.ts +0 -76
- package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +0 -23
- package/plugins/acryl-node-server/tests/adapter/utils/stream.test.ts +0 -75
- package/plugins/acryl-node-server/tests/adapter/utils.test.ts +0 -235
- package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +0 -260
- package/plugins/acryl-node-server/tests/server.spec.ts +0 -141
- package/plugins/acryl-router/src/core/app.test.ts +0 -3833
- package/plugins/acryl-router/src/core/client/client.test.ts +0 -2313
- package/plugins/acryl-router/src/core/client/types.test.ts +0 -149
- package/plugins/acryl-router/src/core/client/utils.test.ts +0 -405
- package/plugins/acryl-router/src/core/compose.test.ts +0 -751
- package/plugins/acryl-router/src/core/context.test.ts +0 -629
- package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +0 -344
- package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +0 -55
- package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +0 -510
- package/plugins/acryl-router/src/core/helper/css/common.case.test.tsx +0 -506
- package/plugins/acryl-router/src/core/helper/css/index.test.tsx +0 -678
- package/plugins/acryl-router/src/core/helper/dev/index.test.ts +0 -181
- package/plugins/acryl-router/src/core/helper/factory/index.test.ts +0 -434
- package/plugins/acryl-router/src/core/helper/html/index.test.ts +0 -78
- package/plugins/acryl-router/src/core/helper/proxy/index.test.ts +0 -356
- package/plugins/acryl-router/src/core/helper/route/index.test.ts +0 -259
- package/plugins/acryl-router/src/core/helper/streaming/sse.test.tsx +0 -557
- package/plugins/acryl-router/src/core/helper/streaming/stream.test.ts +0 -128
- package/plugins/acryl-router/src/core/helper/streaming/text.test.ts +0 -34
- package/plugins/acryl-router/src/core/helper/testing/index.test.ts +0 -42
- package/plugins/acryl-router/src/core/helper/websocket/index.test.ts +0 -124
- package/plugins/acryl-router/src/core/http-exception.test.ts +0 -45
- package/plugins/acryl-router/src/core/jsx/base.test.tsx +0 -97
- package/plugins/acryl-router/src/core/jsx/children.test.ts +0 -52
- package/plugins/acryl-router/src/core/jsx/components.test.tsx +0 -936
- package/plugins/acryl-router/src/core/jsx/context-isolation.test.ts +0 -655
- package/plugins/acryl-router/src/core/jsx/dom/client.test.tsx +0 -128
- package/plugins/acryl-router/src/core/jsx/dom/components.test.tsx +0 -330
- package/plugins/acryl-router/src/core/jsx/dom/context.test.tsx +0 -184
- package/plugins/acryl-router/src/core/jsx/dom/css.test.tsx +0 -149
- package/plugins/acryl-router/src/core/jsx/dom/hooks/index.test.tsx +0 -172
- package/plugins/acryl-router/src/core/jsx/dom/index.test.tsx +0 -3681
- package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.test.tsx +0 -1344
- package/plugins/acryl-router/src/core/jsx/dom/server.test.tsx +0 -199
- package/plugins/acryl-router/src/core/jsx/hooks/dom.test.tsx +0 -859
- package/plugins/acryl-router/src/core/jsx/hooks/string.test.tsx +0 -40
- package/plugins/acryl-router/src/core/jsx/index.test.tsx +0 -1744
- package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.test.tsx +0 -666
- package/plugins/acryl-router/src/core/jsx/jsx-runtime.test.tsx +0 -85
- package/plugins/acryl-router/src/core/jsx/streaming.test.tsx +0 -1281
- package/plugins/acryl-router/src/core/jsx/utils.test.ts +0 -366
- package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +0 -434
- package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +0 -1018
- package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +0 -273
- package/plugins/acryl-router/src/core/middleware/cache/index.test.ts +0 -1211
- package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +0 -355
- package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +0 -535
- package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +0 -43
- package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +0 -532
- package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +0 -534
- package/plugins/acryl-router/src/core/middleware/etag/digest.test.ts +0 -21
- package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +0 -503
- package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +0 -217
- package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +0 -1135
- package/plugins/acryl-router/src/core/middleware/jwk/keys.test.json +0 -48
- package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +0 -802
- package/plugins/acryl-router/src/core/middleware/language/index.test.ts +0 -552
- package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +0 -204
- package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +0 -292
- package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +0 -221
- package/plugins/acryl-router/src/core/middleware/mount/index.test.ts +0 -334
- package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +0 -37
- package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +0 -218
- package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +0 -168
- package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +0 -671
- package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +0 -450
- package/plugins/acryl-router/src/core/middleware/serve-static/path.test.ts +0 -50
- package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +0 -70
- package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +0 -310
- package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +0 -381
- package/plugins/acryl-router/src/core/preset/quick.test.ts +0 -42
- package/plugins/acryl-router/src/core/preset/tiny.test.ts +0 -42
- package/plugins/acryl-router/src/core/request.test.ts +0 -751
- package/plugins/acryl-router/src/core/router/common.case.test.ts +0 -1132
- package/plugins/acryl-router/src/core/router/linear-router/router.test.ts +0 -80
- package/plugins/acryl-router/src/core/router/pattern-router/router.test.ts +0 -46
- package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.test.ts +0 -154
- package/plugins/acryl-router/src/core/router/reg-exp-router/router.test.ts +0 -265
- package/plugins/acryl-router/src/core/router/smart-router/router.test.ts +0 -13
- package/plugins/acryl-router/src/core/router/trie-router/node.test.ts +0 -896
- package/plugins/acryl-router/src/core/router/trie-router/router.test.ts +0 -8
- package/plugins/acryl-router/src/core/types.test.ts +0 -4134
- package/plugins/acryl-router/src/core/utils/accept.test.ts +0 -299
- package/plugins/acryl-router/src/core/utils/basic-auth.test.ts +0 -56
- package/plugins/acryl-router/src/core/utils/body.test.ts +0 -496
- package/plugins/acryl-router/src/core/utils/buffer.test.ts +0 -147
- package/plugins/acryl-router/src/core/utils/color.test.ts +0 -23
- package/plugins/acryl-router/src/core/utils/concurrent.test.ts +0 -69
- package/plugins/acryl-router/src/core/utils/cookie.test.ts +0 -460
- package/plugins/acryl-router/src/core/utils/crypto.test.ts +0 -43
- package/plugins/acryl-router/src/core/utils/encode.test.ts +0 -61
- package/plugins/acryl-router/src/core/utils/filepath.test.ts +0 -78
- package/plugins/acryl-router/src/core/utils/html.test.ts +0 -16
- package/plugins/acryl-router/src/core/utils/ipaddr.test.ts +0 -149
- package/plugins/acryl-router/src/core/utils/jwt/jwa.test.ts +0 -86
- package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +0 -1788
- package/plugins/acryl-router/src/core/utils/mime.test.ts +0 -64
- package/plugins/acryl-router/src/core/utils/stream.test.ts +0 -212
- package/plugins/acryl-router/src/core/utils/types.test.ts +0 -295
- package/plugins/acryl-router/src/core/utils/url.test.ts +0 -384
- package/plugins/acryl-router/src/core/validator/utils.test.ts +0 -82
- package/plugins/acryl-router/src/core/validator/validator.test.ts +0 -1488
- package/plugins/acryl-router/tests/docs-examples.spec.ts +0 -152
- package/plugins/acryl-router/tests/jsx.spec.tsx +0 -63
- package/plugins/acryl-router/tests/live-install.spec.ts +0 -64
- package/plugins/acryl-router/tests/loader.spec.ts +0 -72
- package/plugins/acryl-router/tests/loopback-only.spec.ts +0 -80
- package/plugins/acryl-router/tests/no-dom/consumer.ts +0 -11
- package/plugins/acryl-router/tests/no-dom/tsconfig.json +0 -13
- package/plugins/acryl-router/tests/service.spec.ts +0 -426
- package/plugins/acryl-router/tests/shadow-state.spec.ts +0 -79
- package/plugins/acryl-router-http/tests/adapter.spec.ts +0 -174
- package/plugins/acryl-router-http/tests/stream.spec.ts +0 -133
- package/plugins/acryl-router-http/tests/surfaces.spec.ts +0 -101
- package/plugins/acryl-state/src/react.ts +0 -11
- package/plugins/acryl-state/tests/cell.spec.ts +0 -71
- package/plugins/acryl-state/tests/react.spec.ts +0 -39
- package/plugins/acryl-state/tests/service.spec.ts +0 -132
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import "./router.js";
|
|
2
|
+
import { html } from "./html.js";
|
|
3
|
+
import { getExtension } from "./utils/mime.js";
|
|
4
|
+
import { findTargetHandler, isMiddleware } from "./utils/handler.js";
|
|
5
|
+
import { o as replaceUrlParam } from "./utils-Cx61GFMC.js";
|
|
6
|
+
import { createPool } from "./utils/concurrent.js";
|
|
7
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/utils.ts
|
|
8
|
+
/**
|
|
9
|
+
* Get dirname
|
|
10
|
+
* @param path File Path
|
|
11
|
+
* @returns Parent dir path
|
|
12
|
+
*/
|
|
13
|
+
const dirname = (path) => {
|
|
14
|
+
return path.split(/[\/\\]/).slice(0, -1).join("/");
|
|
15
|
+
};
|
|
16
|
+
const normalizePath = (path) => {
|
|
17
|
+
return path.replace(/(\\)/g, "/").replace(/\/$/g, "");
|
|
18
|
+
};
|
|
19
|
+
const getUncRoot = (path) => {
|
|
20
|
+
const uncRoot = path.replace(/\\/g, "/").match(/^\/\/([^/]+)\/([^/]+)/);
|
|
21
|
+
if (uncRoot) return `${uncRoot[1].toLowerCase()}/${uncRoot[2].toLowerCase()}`;
|
|
22
|
+
};
|
|
23
|
+
const handleParent = (resultPaths) => {
|
|
24
|
+
if (resultPaths.length === 0 || resultPaths[resultPaths.length - 1] === "..") resultPaths.push("..");
|
|
25
|
+
else resultPaths.pop();
|
|
26
|
+
};
|
|
27
|
+
const handleNonDot = (path, resultPaths) => {
|
|
28
|
+
path = path.replace(/^\.(?!.)/, "");
|
|
29
|
+
if (path !== "") resultPaths.push(path);
|
|
30
|
+
};
|
|
31
|
+
const handleSegments = (paths, resultPaths) => {
|
|
32
|
+
for (const path of paths) if (path === "..") handleParent(resultPaths);
|
|
33
|
+
else handleNonDot(path, resultPaths);
|
|
34
|
+
};
|
|
35
|
+
const joinPaths = (...paths) => {
|
|
36
|
+
const hasUncPrefix = getUncRoot(paths[0]) !== void 0;
|
|
37
|
+
paths = paths.map(normalizePath);
|
|
38
|
+
const resultPaths = [];
|
|
39
|
+
handleSegments(paths.join("/").split("/"), resultPaths);
|
|
40
|
+
return (hasUncPrefix ? "//" : paths[0][0] === "/" ? "/" : "") + resultPaths.join("/");
|
|
41
|
+
};
|
|
42
|
+
const filterStaticGenerateRoutes = (acryl) => {
|
|
43
|
+
return acryl.routes.reduce((acc, { method, handler, path }) => {
|
|
44
|
+
const targetHandler = findTargetHandler(handler);
|
|
45
|
+
if (["GET", "ALL"].includes(method) && !isMiddleware(targetHandler)) acc.push({ path });
|
|
46
|
+
return acc;
|
|
47
|
+
}, []);
|
|
48
|
+
};
|
|
49
|
+
const isDynamicRoute = (path) => {
|
|
50
|
+
return path.split("/").some((segment) => segment.startsWith(":") || segment.includes("*"));
|
|
51
|
+
};
|
|
52
|
+
const toSegments = (path) => path === "" ? [] : path.split("/");
|
|
53
|
+
const getPathRoot = (path) => {
|
|
54
|
+
const normalizedPath = path.replace(/\\/g, "/");
|
|
55
|
+
const uncRoot = getUncRoot(normalizedPath);
|
|
56
|
+
if (uncRoot) return `unc:${uncRoot}`;
|
|
57
|
+
const driveRoot = normalizedPath.match(/^([A-Za-z]):/);
|
|
58
|
+
if (driveRoot) return `${normalizedPath[2] === "/" ? "drive-absolute" : "drive-relative"}:${driveRoot[1].toLowerCase()}`;
|
|
59
|
+
return normalizedPath.startsWith("/") ? "absolute" : "relative";
|
|
60
|
+
};
|
|
61
|
+
const ensureWithinOutDir = (outDir, filePath) => {
|
|
62
|
+
const outDirSegments = toSegments(joinPaths(outDir));
|
|
63
|
+
const filePathSegments = toSegments(joinPaths(filePath));
|
|
64
|
+
const hasMismatchedPathRoot = getPathRoot(outDir) !== getPathRoot(filePath);
|
|
65
|
+
const climbsAboveOutDir = filePathSegments[outDirSegments.length] === "..";
|
|
66
|
+
if (hasMismatchedPathRoot || filePathSegments.length <= outDirSegments.length || !outDirSegments.every((segment, i) => segment === filePathSegments[i]) || climbsAboveOutDir) throw new Error(`Path traversal detected: "${filePath}" is outside the output directory`);
|
|
67
|
+
};
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/middleware.ts
|
|
70
|
+
const SSG_CONTEXT = "ACRYL_SSG_CONTEXT";
|
|
71
|
+
const X_ACRYL_DISABLE_SSG_HEADER_KEY = "x-acryl-disable-ssg";
|
|
72
|
+
(() => {
|
|
73
|
+
try {
|
|
74
|
+
return new Response("SSG is disabled", {
|
|
75
|
+
status: 404,
|
|
76
|
+
headers: { [X_ACRYL_DISABLE_SSG_HEADER_KEY]: "true" }
|
|
77
|
+
});
|
|
78
|
+
} catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
})();
|
|
82
|
+
/**
|
|
83
|
+
* Define SSG Route
|
|
84
|
+
*/
|
|
85
|
+
const ssgParams = (params) => async (c, next) => {
|
|
86
|
+
if (isDynamicRoute(c.req.path)) {
|
|
87
|
+
c.req.raw.ssgParams = Array.isArray(params) ? params : await params(c);
|
|
88
|
+
return c.notFound();
|
|
89
|
+
}
|
|
90
|
+
await next();
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* @experimental
|
|
94
|
+
* `isSSGContext` is an experimental feature.
|
|
95
|
+
* The API might be changed.
|
|
96
|
+
*/
|
|
97
|
+
const isSSGContext = (c) => !!c.env?.[SSG_CONTEXT];
|
|
98
|
+
/**
|
|
99
|
+
* @experimental
|
|
100
|
+
* `disableSSG` is an experimental feature.
|
|
101
|
+
* The API might be changed.
|
|
102
|
+
*/
|
|
103
|
+
const disableSSG = () => async function disableSSG(c, next) {
|
|
104
|
+
if (isSSGContext(c)) {
|
|
105
|
+
c.header(X_ACRYL_DISABLE_SSG_HEADER_KEY, "true");
|
|
106
|
+
return c.notFound();
|
|
107
|
+
}
|
|
108
|
+
await next();
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* @experimental
|
|
112
|
+
* `onlySSG` is an experimental feature.
|
|
113
|
+
* The API might be changed.
|
|
114
|
+
*/
|
|
115
|
+
const onlySSG = () => async function onlySSG(c, next) {
|
|
116
|
+
if (!isSSGContext(c)) return c.notFound();
|
|
117
|
+
await next();
|
|
118
|
+
};
|
|
119
|
+
//#endregion
|
|
120
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/plugins.ts
|
|
121
|
+
/**
|
|
122
|
+
* The default plugin that defines the recommended behavior.
|
|
123
|
+
*
|
|
124
|
+
* @experimental
|
|
125
|
+
* `defaultPlugin` is an experimental feature.
|
|
126
|
+
* The API might be changed.
|
|
127
|
+
*/
|
|
128
|
+
const defaultPlugin = () => {
|
|
129
|
+
return { afterResponseHook: (res) => {
|
|
130
|
+
if (res.status !== 200) return false;
|
|
131
|
+
return res;
|
|
132
|
+
} };
|
|
133
|
+
};
|
|
134
|
+
const REDIRECT_STATUS_CODES = /* @__PURE__ */ new Set([
|
|
135
|
+
301,
|
|
136
|
+
302,
|
|
137
|
+
303,
|
|
138
|
+
307,
|
|
139
|
+
308
|
|
140
|
+
]);
|
|
141
|
+
const generateRedirectHtml = (location) => {
|
|
142
|
+
return html`<!DOCTYPE html>
|
|
143
|
+
<title>Redirecting to: ${location}</title>
|
|
144
|
+
<meta http-equiv="refresh" content="0;url=${location}" />
|
|
145
|
+
<meta name="robots" content="noindex" />
|
|
146
|
+
<link rel="canonical" href="${location}" />
|
|
147
|
+
<body>
|
|
148
|
+
<a href="${location}">Redirecting to <code>${location}</code></a>
|
|
149
|
+
</body>
|
|
150
|
+
`.toString().replace(/\n/g, "");
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* The redirect plugin that generates HTML redirect pages for HTTP redirect responses for status codes 301, 302, 303, 307 and 308.
|
|
154
|
+
*
|
|
155
|
+
* When used with `defaultPlugin`, place `redirectPlugin` before it, because `defaultPlugin` skips non-200 responses.
|
|
156
|
+
*
|
|
157
|
+
* ```ts
|
|
158
|
+
* // ✅ Will work as expected
|
|
159
|
+
* toSSG(app, fs, { plugins: [redirectPlugin(), defaultPlugin()] })
|
|
160
|
+
*
|
|
161
|
+
* // ❌ Will not work as expected
|
|
162
|
+
* toSSG(app, fs, { plugins: [defaultPlugin(), redirectPlugin()] })
|
|
163
|
+
* ```
|
|
164
|
+
*
|
|
165
|
+
* @experimental
|
|
166
|
+
* `redirectPlugin` is an experimental feature.
|
|
167
|
+
* The API might be changed.
|
|
168
|
+
*/
|
|
169
|
+
const redirectPlugin = () => {
|
|
170
|
+
return { afterResponseHook: (res) => {
|
|
171
|
+
if (REDIRECT_STATUS_CODES.has(res.status)) {
|
|
172
|
+
const location = res.headers.get("Location");
|
|
173
|
+
if (!location) return false;
|
|
174
|
+
const htmlBody = generateRedirectHtml(location);
|
|
175
|
+
return new Response(htmlBody, {
|
|
176
|
+
status: 200,
|
|
177
|
+
headers: { "Content-Type": "text/html; charset=utf-8" }
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return res;
|
|
181
|
+
} };
|
|
182
|
+
};
|
|
183
|
+
//#endregion
|
|
184
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/ssg.ts
|
|
185
|
+
const DEFAULT_CONCURRENCY = 2;
|
|
186
|
+
const DEFAULT_CONTENT_TYPE = "text/plain";
|
|
187
|
+
const DEFAULT_OUTPUT_DIR = "./static";
|
|
188
|
+
const generateFilePath = (routePath, outDir, mimeType, extensionMap) => {
|
|
189
|
+
const extension = determineExtension(mimeType, extensionMap);
|
|
190
|
+
let filePath;
|
|
191
|
+
if (routePath.endsWith(`.${extension}`)) filePath = joinPaths(outDir, routePath);
|
|
192
|
+
else if (routePath === "/") filePath = joinPaths(outDir, `index.${extension}`);
|
|
193
|
+
else if (routePath.endsWith("/")) filePath = joinPaths(outDir, routePath, `index.${extension}`);
|
|
194
|
+
else filePath = joinPaths(outDir, `${routePath}.${extension}`);
|
|
195
|
+
ensureWithinOutDir(outDir, filePath);
|
|
196
|
+
return filePath;
|
|
197
|
+
};
|
|
198
|
+
const parseResponseContent = async (response) => {
|
|
199
|
+
const contentType = response.headers.get("Content-Type");
|
|
200
|
+
try {
|
|
201
|
+
if (contentType?.includes("text") || contentType?.includes("json")) return await response.text();
|
|
202
|
+
else return await response.arrayBuffer();
|
|
203
|
+
} catch (error) {
|
|
204
|
+
throw new Error(`Error processing response: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const defaultExtensionMap = {
|
|
208
|
+
"text/html": "html",
|
|
209
|
+
"text/xml": "xml",
|
|
210
|
+
"application/xml": "xml",
|
|
211
|
+
"application/atom+xml": "xml",
|
|
212
|
+
"application/rss+xml": "xml",
|
|
213
|
+
"application/yaml": "yaml"
|
|
214
|
+
};
|
|
215
|
+
const determineExtension = (mimeType, userExtensionMap) => {
|
|
216
|
+
const extensionMap = userExtensionMap || defaultExtensionMap;
|
|
217
|
+
if (mimeType in extensionMap) return extensionMap[mimeType];
|
|
218
|
+
return getExtension(mimeType) || "html";
|
|
219
|
+
};
|
|
220
|
+
const combineBeforeRequestHooks = (hooks) => {
|
|
221
|
+
if (!Array.isArray(hooks)) return hooks;
|
|
222
|
+
return async (req) => {
|
|
223
|
+
let currentReq = req;
|
|
224
|
+
for (const hook of hooks) {
|
|
225
|
+
const result = await hook(currentReq);
|
|
226
|
+
if (result === false) return false;
|
|
227
|
+
if (result instanceof Request) currentReq = result;
|
|
228
|
+
}
|
|
229
|
+
return currentReq;
|
|
230
|
+
};
|
|
231
|
+
};
|
|
232
|
+
const combineAfterResponseHooks = (hooks) => {
|
|
233
|
+
if (!Array.isArray(hooks)) return hooks;
|
|
234
|
+
return async (res) => {
|
|
235
|
+
let currentRes = res;
|
|
236
|
+
for (const hook of hooks) {
|
|
237
|
+
const result = await hook(currentRes);
|
|
238
|
+
if (result === false) return false;
|
|
239
|
+
if (result instanceof Response) currentRes = result;
|
|
240
|
+
}
|
|
241
|
+
return currentRes;
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
const combineAfterGenerateHooks = (hooks, fsModule, options) => {
|
|
245
|
+
if (!Array.isArray(hooks)) return hooks;
|
|
246
|
+
return async (result) => {
|
|
247
|
+
for (const hook of hooks) await hook(result, fsModule, options);
|
|
248
|
+
};
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* @experimental
|
|
252
|
+
* `fetchRoutesContent` is an experimental feature.
|
|
253
|
+
* The API might be changed.
|
|
254
|
+
*/
|
|
255
|
+
const fetchRoutesContent = function* (app, beforeRequestHook, afterResponseHook, concurrency) {
|
|
256
|
+
const baseURL = "http://localhost";
|
|
257
|
+
const pool = createPool({ concurrency });
|
|
258
|
+
for (const route of filterStaticGenerateRoutes(app)) {
|
|
259
|
+
const thisRouteBaseURL = new URL(route.path, baseURL).toString();
|
|
260
|
+
let forGetInfoURLRequest = new Request(thisRouteBaseURL);
|
|
261
|
+
yield new Promise(async (resolveGetInfo, rejectGetInfo) => {
|
|
262
|
+
try {
|
|
263
|
+
if (beforeRequestHook) {
|
|
264
|
+
const maybeRequest = await beforeRequestHook(forGetInfoURLRequest);
|
|
265
|
+
if (!maybeRequest) {
|
|
266
|
+
resolveGetInfo(void 0);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
forGetInfoURLRequest = maybeRequest;
|
|
270
|
+
}
|
|
271
|
+
await pool.run(() => app.fetch(forGetInfoURLRequest, { [SSG_CONTEXT]: true }));
|
|
272
|
+
if (!forGetInfoURLRequest.ssgParams) {
|
|
273
|
+
if (isDynamicRoute(route.path)) {
|
|
274
|
+
resolveGetInfo(void 0);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
forGetInfoURLRequest.ssgParams = [{}];
|
|
278
|
+
}
|
|
279
|
+
const requestInit = {
|
|
280
|
+
method: forGetInfoURLRequest.method,
|
|
281
|
+
headers: forGetInfoURLRequest.headers
|
|
282
|
+
};
|
|
283
|
+
resolveGetInfo((function* () {
|
|
284
|
+
for (const param of forGetInfoURLRequest.ssgParams) yield new Promise(async (resolveReq, rejectReq) => {
|
|
285
|
+
try {
|
|
286
|
+
const replacedUrlParam = replaceUrlParam(route.path, param);
|
|
287
|
+
let response = await pool.run(() => app.request(replacedUrlParam, requestInit, { [SSG_CONTEXT]: true }));
|
|
288
|
+
if (response.headers.get("x-acryl-disable-ssg")) {
|
|
289
|
+
resolveReq(void 0);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (afterResponseHook) {
|
|
293
|
+
const maybeResponse = await afterResponseHook(response);
|
|
294
|
+
if (!maybeResponse) {
|
|
295
|
+
resolveReq(void 0);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
response = maybeResponse;
|
|
299
|
+
}
|
|
300
|
+
resolveReq({
|
|
301
|
+
routePath: replacedUrlParam,
|
|
302
|
+
mimeType: response.headers.get("Content-Type")?.split(";")[0] || DEFAULT_CONTENT_TYPE,
|
|
303
|
+
content: await parseResponseContent(response)
|
|
304
|
+
});
|
|
305
|
+
} catch (error) {
|
|
306
|
+
rejectReq(error);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
})());
|
|
310
|
+
} catch (error) {
|
|
311
|
+
rejectGetInfo(error);
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* @experimental
|
|
318
|
+
* `saveContentToFile` is an experimental feature.
|
|
319
|
+
* The API might be changed.
|
|
320
|
+
*/
|
|
321
|
+
const createdDirs = /* @__PURE__ */ new Set();
|
|
322
|
+
const saveContentToFile = async (data, fsModule, outDir, extensionMap) => {
|
|
323
|
+
const awaitedData = await data;
|
|
324
|
+
if (!awaitedData) return;
|
|
325
|
+
const { routePath, content, mimeType } = awaitedData;
|
|
326
|
+
const filePath = generateFilePath(routePath, outDir, mimeType, extensionMap);
|
|
327
|
+
const dirPath = dirname(filePath);
|
|
328
|
+
if (dirPath !== "" && !createdDirs.has(dirPath)) {
|
|
329
|
+
await fsModule.mkdir(dirPath, { recursive: true });
|
|
330
|
+
createdDirs.add(dirPath);
|
|
331
|
+
}
|
|
332
|
+
if (typeof content === "string") await fsModule.writeFile(filePath, content);
|
|
333
|
+
else if (content instanceof ArrayBuffer) await fsModule.writeFile(filePath, new Uint8Array(content));
|
|
334
|
+
return filePath;
|
|
335
|
+
};
|
|
336
|
+
/**
|
|
337
|
+
* @experimental
|
|
338
|
+
* `toSSG` is an experimental feature.
|
|
339
|
+
* The API might be changed.
|
|
340
|
+
*/
|
|
341
|
+
const toSSG = async (app, fs, options) => {
|
|
342
|
+
let result;
|
|
343
|
+
const getInfoPromises = [];
|
|
344
|
+
const savePromises = [];
|
|
345
|
+
const plugins = options?.plugins || [defaultPlugin()];
|
|
346
|
+
const beforeRequestHooks = [];
|
|
347
|
+
const afterResponseHooks = [];
|
|
348
|
+
const afterGenerateHooks = [];
|
|
349
|
+
if (options?.beforeRequestHook) beforeRequestHooks.push(...Array.isArray(options.beforeRequestHook) ? options.beforeRequestHook : [options.beforeRequestHook]);
|
|
350
|
+
if (options?.afterResponseHook) afterResponseHooks.push(...Array.isArray(options.afterResponseHook) ? options.afterResponseHook : [options.afterResponseHook]);
|
|
351
|
+
if (options?.afterGenerateHook) afterGenerateHooks.push(...Array.isArray(options.afterGenerateHook) ? options.afterGenerateHook : [options.afterGenerateHook]);
|
|
352
|
+
for (const plugin of plugins) {
|
|
353
|
+
if (plugin.beforeRequestHook) beforeRequestHooks.push(...Array.isArray(plugin.beforeRequestHook) ? plugin.beforeRequestHook : [plugin.beforeRequestHook]);
|
|
354
|
+
if (plugin.afterResponseHook) afterResponseHooks.push(...Array.isArray(plugin.afterResponseHook) ? plugin.afterResponseHook : [plugin.afterResponseHook]);
|
|
355
|
+
if (plugin.afterGenerateHook) afterGenerateHooks.push(...Array.isArray(plugin.afterGenerateHook) ? plugin.afterGenerateHook : [plugin.afterGenerateHook]);
|
|
356
|
+
}
|
|
357
|
+
try {
|
|
358
|
+
const outputDir = options?.dir ?? "./static";
|
|
359
|
+
const concurrency = options?.concurrency ?? DEFAULT_CONCURRENCY;
|
|
360
|
+
const combinedBeforeRequestHook = combineBeforeRequestHooks(beforeRequestHooks.length > 0 ? beforeRequestHooks : [(req) => req]);
|
|
361
|
+
const combinedAfterResponseHook = combineAfterResponseHooks(afterResponseHooks.length > 0 ? afterResponseHooks : [(req) => req]);
|
|
362
|
+
const getInfoGen = fetchRoutesContent(app, combinedBeforeRequestHook, combinedAfterResponseHook, concurrency);
|
|
363
|
+
for (const getInfo of getInfoGen) getInfoPromises.push(getInfo.then((getContentGen) => {
|
|
364
|
+
if (!getContentGen) return;
|
|
365
|
+
for (const content of getContentGen) savePromises.push(saveContentToFile(content, fs, outputDir, options?.extensionMap).catch((e) => e));
|
|
366
|
+
}));
|
|
367
|
+
await Promise.all(getInfoPromises);
|
|
368
|
+
const files = [];
|
|
369
|
+
for (const savePromise of savePromises) {
|
|
370
|
+
const fileOrError = await savePromise;
|
|
371
|
+
if (typeof fileOrError === "string") files.push(fileOrError);
|
|
372
|
+
else if (fileOrError) throw fileOrError;
|
|
373
|
+
}
|
|
374
|
+
result = {
|
|
375
|
+
success: true,
|
|
376
|
+
files
|
|
377
|
+
};
|
|
378
|
+
} catch (error) {
|
|
379
|
+
result = {
|
|
380
|
+
success: false,
|
|
381
|
+
files: [],
|
|
382
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
if (afterGenerateHooks.length > 0) await combineAfterGenerateHooks(afterGenerateHooks, fs, options)(result, fs, options);
|
|
386
|
+
return result;
|
|
387
|
+
};
|
|
388
|
+
//#endregion
|
|
389
|
+
export { defaultExtensionMap as a, toSSG as c, X_ACRYL_DISABLE_SSG_HEADER_KEY as d, disableSSG as f, ssgParams as h, combineBeforeRequestHooks as i, defaultPlugin as l, onlySSG as m, combineAfterGenerateHooks as n, fetchRoutesContent as o, isSSGContext as p, combineAfterResponseHooks as r, saveContentToFile as s, DEFAULT_OUTPUT_DIR as t, redirectPlugin as u };
|
package/lib/ssg.d.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { L as MiddlewareHandler, Y as Schema, t as Context, v as Env } from "./context-DS3fYyG-.js";
|
|
2
|
+
import { t as Acryl } from "./app-D8riatvv.js";
|
|
3
|
+
|
|
4
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/ssg.d.ts
|
|
5
|
+
declare const DEFAULT_OUTPUT_DIR = "./static";
|
|
6
|
+
/**
|
|
7
|
+
* @experimental
|
|
8
|
+
* `FileSystemModule` is an experimental feature.
|
|
9
|
+
* The API might be changed.
|
|
10
|
+
*/
|
|
11
|
+
interface FileSystemModule {
|
|
12
|
+
writeFile(path: string, data: string | Uint8Array): Promise<void>;
|
|
13
|
+
mkdir(path: string, options: {
|
|
14
|
+
recursive: boolean;
|
|
15
|
+
}): Promise<void | string>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* @experimental
|
|
19
|
+
* `ToSSGResult` is an experimental feature.
|
|
20
|
+
* The API might be changed.
|
|
21
|
+
*/
|
|
22
|
+
interface ToSSGResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
files: string[];
|
|
25
|
+
error?: Error;
|
|
26
|
+
}
|
|
27
|
+
declare const defaultExtensionMap: Record<string, string>;
|
|
28
|
+
type BeforeRequestHook = (req: Request) => Request | false | Promise<Request | false>;
|
|
29
|
+
type AfterResponseHook = (res: Response) => Response | false | Promise<Response | false>;
|
|
30
|
+
type AfterGenerateHook = (result: ToSSGResult, fsModule: FileSystemModule, options?: ToSSGOptions) => void | Promise<void>;
|
|
31
|
+
declare const combineBeforeRequestHooks: (hooks: BeforeRequestHook | BeforeRequestHook[]) => BeforeRequestHook;
|
|
32
|
+
declare const combineAfterResponseHooks: (hooks: AfterResponseHook | AfterResponseHook[]) => AfterResponseHook;
|
|
33
|
+
declare const combineAfterGenerateHooks: (hooks: AfterGenerateHook | AfterGenerateHook[], fsModule: FileSystemModule, options?: ToSSGOptions) => AfterGenerateHook;
|
|
34
|
+
interface SSGPlugin {
|
|
35
|
+
beforeRequestHook?: BeforeRequestHook | BeforeRequestHook[];
|
|
36
|
+
afterResponseHook?: AfterResponseHook | AfterResponseHook[];
|
|
37
|
+
afterGenerateHook?: AfterGenerateHook | AfterGenerateHook[];
|
|
38
|
+
}
|
|
39
|
+
interface ToSSGOptions {
|
|
40
|
+
dir?: string;
|
|
41
|
+
/**
|
|
42
|
+
* @deprecated Use plugins[].beforeRequestHook instead.
|
|
43
|
+
*/
|
|
44
|
+
beforeRequestHook?: BeforeRequestHook | BeforeRequestHook[];
|
|
45
|
+
/**
|
|
46
|
+
* @deprecated Use plugins[].afterResponseHook instead.
|
|
47
|
+
*/
|
|
48
|
+
afterResponseHook?: AfterResponseHook | AfterResponseHook[];
|
|
49
|
+
/**
|
|
50
|
+
* @deprecated Use plugins[].afterGenerateHook instead.
|
|
51
|
+
*/
|
|
52
|
+
afterGenerateHook?: AfterGenerateHook | AfterGenerateHook[];
|
|
53
|
+
concurrency?: number;
|
|
54
|
+
extensionMap?: Record<string, string>;
|
|
55
|
+
plugins?: SSGPlugin[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* @experimental
|
|
59
|
+
* `fetchRoutesContent` is an experimental feature.
|
|
60
|
+
* The API might be changed.
|
|
61
|
+
*/
|
|
62
|
+
declare const fetchRoutesContent: <E extends Env = Env, S extends Schema = {}, BasePath extends string = "/">(app: Acryl<E, S, BasePath>, beforeRequestHook?: BeforeRequestHook, afterResponseHook?: AfterResponseHook, concurrency?: number) => Generator<Promise<Generator<Promise<{
|
|
63
|
+
routePath: string;
|
|
64
|
+
mimeType: string;
|
|
65
|
+
content: string | ArrayBuffer;
|
|
66
|
+
} | undefined>> | undefined>>;
|
|
67
|
+
declare const saveContentToFile: (data: Promise<{
|
|
68
|
+
routePath: string;
|
|
69
|
+
content: string | ArrayBuffer;
|
|
70
|
+
mimeType: string;
|
|
71
|
+
} | undefined>, fsModule: FileSystemModule, outDir: string, extensionMap?: Record<string, string>) => Promise<string | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* @experimental
|
|
74
|
+
* `ToSSGInterface` is an experimental feature.
|
|
75
|
+
* The API might be changed.
|
|
76
|
+
*/
|
|
77
|
+
interface ToSSGInterface {
|
|
78
|
+
(app: Acryl<any, any, any>, fsModule: FileSystemModule, options?: ToSSGOptions): Promise<ToSSGResult>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* @experimental
|
|
82
|
+
* `ToSSGAdaptorInterface` is an experimental feature.
|
|
83
|
+
* The API might be changed.
|
|
84
|
+
*/
|
|
85
|
+
interface ToSSGAdaptorInterface<E extends Env = Env, S extends Schema = {}, BasePath extends string = '/'> {
|
|
86
|
+
(app: Acryl<E, S, BasePath>, options?: ToSSGOptions): Promise<ToSSGResult>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* @experimental
|
|
90
|
+
* `toSSG` is an experimental feature.
|
|
91
|
+
* The API might be changed.
|
|
92
|
+
*/
|
|
93
|
+
declare const toSSG: ToSSGInterface;
|
|
94
|
+
//#endregion
|
|
95
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/middleware.d.ts
|
|
96
|
+
declare const X_ACRYL_DISABLE_SSG_HEADER_KEY = "x-acryl-disable-ssg";
|
|
97
|
+
interface SSGParam {
|
|
98
|
+
[key: string]: string;
|
|
99
|
+
}
|
|
100
|
+
type SSGParams = SSGParam[];
|
|
101
|
+
interface SSGParamsMiddleware {
|
|
102
|
+
<E extends Env = Env>(generateParams: (c: Context<E>) => SSGParams | Promise<SSGParams>): MiddlewareHandler<E>;
|
|
103
|
+
<E extends Env = Env>(params: SSGParams): MiddlewareHandler<E>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Define SSG Route
|
|
107
|
+
*/
|
|
108
|
+
declare const ssgParams: SSGParamsMiddleware;
|
|
109
|
+
/**
|
|
110
|
+
* @experimental
|
|
111
|
+
* `isSSGContext` is an experimental feature.
|
|
112
|
+
* The API might be changed.
|
|
113
|
+
*/
|
|
114
|
+
declare const isSSGContext: (c: Context) => boolean;
|
|
115
|
+
/**
|
|
116
|
+
* @experimental
|
|
117
|
+
* `disableSSG` is an experimental feature.
|
|
118
|
+
* The API might be changed.
|
|
119
|
+
*/
|
|
120
|
+
declare const disableSSG: () => MiddlewareHandler;
|
|
121
|
+
/**
|
|
122
|
+
* @experimental
|
|
123
|
+
* `onlySSG` is an experimental feature.
|
|
124
|
+
* The API might be changed.
|
|
125
|
+
*/
|
|
126
|
+
declare const onlySSG: () => MiddlewareHandler;
|
|
127
|
+
//#endregion
|
|
128
|
+
//#region ../../plugins/acryl-router/src/core/helper/ssg/plugins.d.ts
|
|
129
|
+
/**
|
|
130
|
+
* The default plugin that defines the recommended behavior.
|
|
131
|
+
*
|
|
132
|
+
* @experimental
|
|
133
|
+
* `defaultPlugin` is an experimental feature.
|
|
134
|
+
* The API might be changed.
|
|
135
|
+
*/
|
|
136
|
+
declare const defaultPlugin: () => SSGPlugin;
|
|
137
|
+
/**
|
|
138
|
+
* The redirect plugin that generates HTML redirect pages for HTTP redirect responses for status codes 301, 302, 303, 307 and 308.
|
|
139
|
+
*
|
|
140
|
+
* When used with `defaultPlugin`, place `redirectPlugin` before it, because `defaultPlugin` skips non-200 responses.
|
|
141
|
+
*
|
|
142
|
+
* ```ts
|
|
143
|
+
* // ✅ Will work as expected
|
|
144
|
+
* toSSG(app, fs, { plugins: [redirectPlugin(), defaultPlugin()] })
|
|
145
|
+
*
|
|
146
|
+
* // ❌ Will not work as expected
|
|
147
|
+
* toSSG(app, fs, { plugins: [defaultPlugin(), redirectPlugin()] })
|
|
148
|
+
* ```
|
|
149
|
+
*
|
|
150
|
+
* @experimental
|
|
151
|
+
* `redirectPlugin` is an experimental feature.
|
|
152
|
+
* The API might be changed.
|
|
153
|
+
*/
|
|
154
|
+
declare const redirectPlugin: () => SSGPlugin;
|
|
155
|
+
//#endregion
|
|
156
|
+
export { AfterGenerateHook, AfterResponseHook, BeforeRequestHook, DEFAULT_OUTPUT_DIR, FileSystemModule, SSGPlugin, ToSSGAdaptorInterface, ToSSGInterface, ToSSGOptions, ToSSGResult, X_ACRYL_DISABLE_SSG_HEADER_KEY, combineAfterGenerateHooks, combineAfterResponseHooks, combineBeforeRequestHooks, defaultExtensionMap, defaultPlugin, disableSSG, fetchRoutesContent, isSSGContext, onlySSG, redirectPlugin, saveContentToFile, ssgParams, toSSG };
|
package/lib/ssg.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as defaultExtensionMap, c as toSSG, d as X_ACRYL_DISABLE_SSG_HEADER_KEY, f as disableSSG, h as ssgParams, i as combineBeforeRequestHooks, l as defaultPlugin, m as onlySSG, n as combineAfterGenerateHooks, o as fetchRoutesContent, p as isSSGContext, r as combineAfterResponseHooks, s as saveContentToFile, t as DEFAULT_OUTPUT_DIR, u as redirectPlugin } from "./ssg-BwjcA-Ge.js";
|
|
2
|
+
export { DEFAULT_OUTPUT_DIR, X_ACRYL_DISABLE_SSG_HEADER_KEY, combineAfterGenerateHooks, combineAfterResponseHooks, combineBeforeRequestHooks, defaultExtensionMap, defaultPlugin, disableSSG, fetchRoutesContent, isSSGContext, onlySSG, redirectPlugin, saveContentToFile, ssgParams, toSSG };
|
package/lib/streaming.d.ts
CHANGED
package/lib/testing.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Y as Schema, a as ExecutionContext } from "./context-DS3fYyG-.js";
|
|
2
2
|
import { D as UnionToIntersection } from "./types-Lqx5BxQF.js";
|
|
3
|
-
import { t as Acryl } from "./app-
|
|
4
|
-
import { i as ClientRequestOptions, n as Client } from "./types-
|
|
3
|
+
import { t as Acryl } from "./app-D8riatvv.js";
|
|
4
|
+
import { i as ClientRequestOptions, n as Client } from "./types-zNxyEpG2.js";
|
|
5
5
|
|
|
6
6
|
//#region ../../plugins/acryl-router/src/core/helper/testing/index.d.ts
|
|
7
7
|
type ExtractEnv<T> = T extends Acryl<infer E, Schema, string> ? E : never;
|
package/lib/testing.js
CHANGED
package/lib/timeout.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { L as MiddlewareHandler, t as Context } from "./context-DS3fYyG-.js";
|
|
2
2
|
import { HTTPException } from "./http-exception.js";
|
|
3
3
|
|
|
4
4
|
//#region ../../plugins/acryl-router/src/core/middleware/timeout/index.d.ts
|
package/lib/timing.d.ts
CHANGED
package/lib/tiny.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Y as Schema, et as Acryl$1, g as BlankSchema, m as BlankEnv, tt as AcrylOptions, v as Env } from "./context-DS3fYyG-.js";
|
|
2
2
|
|
|
3
3
|
//#region ../../plugins/acryl-router/src/core/preset/tiny.d.ts
|
|
4
4
|
declare class Acryl<E extends Env = BlankEnv, S extends Schema = BlankSchema, BasePath extends string = '/'> extends Acryl$1<E, S, BasePath> {
|
package/lib/trailing-slash.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { P as KnownResponseFormat, S as ExtractSchema, Y as Schema, _ as Endpoint, et as Acryl, q as ResponseFormat } from "./context-DS3fYyG-.js";
|
|
2
2
|
import { i as METHOD_NAME_ALL_LOWERCASE, n as METHODS } from "./router-CvUxUTOq.js";
|
|
3
3
|
import { c as StatusCode, l as SuccessStatusCode } from "./http-status-DaAwGAFL.js";
|
|
4
4
|
import { c as HasRequiredKeys } from "./types-Lqx5BxQF.js";
|
|
5
|
-
import { t as Acryl$1 } from "./app-
|
|
5
|
+
import { t as Acryl$1 } from "./app-D8riatvv.js";
|
|
6
6
|
|
|
7
7
|
//#region ../../plugins/acryl-router/src/core/client/types.d.ts
|
|
8
8
|
/**
|
package/lib/types.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { $ as Variables, A as HandlerResponse, B as NotFoundHandler, C as ExtractSchemaForStatusCode, D as HTTPResponseError, E as H, F as MergePath, G as ParsedFormValue, H as OnHandlerInterface, I as MergeSchemaPath, J as RouterRoute, K as RemoveQuestion, L as MiddlewareHandler, M as InputToDataByTarget, N as IntersectNonAnyTypes, O as Handler, P as KnownResponseFormat, Q as ValidationTargets, R as MiddlewareHandlerInterface, S as ExtractSchema, T as FormValue, U as ParamKeyToRecord, V as NotFoundResponse, W as ParamKeys, X as ToSchema, Y as Schema, Z as TypedResponse, _ as Endpoint, b as ExtractHandlerResponse, f as AddParam, g as BlankSchema, h as BlankInput, j as Input, k as HandlerInterface, m as BlankEnv, p as Bindings, q as ResponseFormat, v as Env, w as FetchEventLike, x as ExtractInput, y as ErrorHandler, z as Next } from "./context-DS3fYyG-.js";
|
|
2
2
|
export { AddParam, Bindings, BlankEnv, BlankInput, BlankSchema, Endpoint, Env, ErrorHandler, ExtractHandlerResponse, ExtractInput, ExtractSchema, ExtractSchemaForStatusCode, FetchEventLike, FormValue, H, HTTPResponseError, Handler, HandlerInterface, HandlerResponse, Input, InputToDataByTarget, IntersectNonAnyTypes, KnownResponseFormat, MergePath, MergeSchemaPath, MiddlewareHandler, MiddlewareHandlerInterface, Next, NotFoundHandler, NotFoundResponse, OnHandlerInterface, ParamKeyToRecord, ParamKeys, ParsedFormValue, RemoveQuestion, ResponseFormat, RouterRoute, Schema, ToSchema, TypedResponse, ValidationTargets, Variables };
|
package/lib/utils/body.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as parseBody, l as BodyData, u as ParseBodyOptions } from "../context-DS3fYyG-.js";
|
|
2
2
|
export { BodyData, ParseBodyOptions, parseBody };
|
package/lib/utils/ipaddr.d.ts
CHANGED