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,125 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/client/fetch-result-please.ts
|
|
2
|
+
/**
|
|
3
|
+
* @description This file is a modified version of `fetch-result-please` (`ofetch`), minimalized and adapted to Acryl's custom needs.
|
|
4
|
+
*
|
|
5
|
+
* @link https://www.npmjs.com/package/fetch-result-please
|
|
6
|
+
*/
|
|
7
|
+
const nullBodyResponses = /* @__PURE__ */ new Set([
|
|
8
|
+
101,
|
|
9
|
+
204,
|
|
10
|
+
205,
|
|
11
|
+
304
|
|
12
|
+
]);
|
|
13
|
+
/**
|
|
14
|
+
* Smartly parses and return the consumable result from a fetch `Response`.
|
|
15
|
+
*
|
|
16
|
+
* Throwing a structured error if the response is not `ok`. ({@link DetailedError})
|
|
17
|
+
*/
|
|
18
|
+
async function fetchRP(fetchRes) {
|
|
19
|
+
const _fetchRes = await fetchRes;
|
|
20
|
+
if ((_fetchRes.body || _fetchRes._bodyInit) && !nullBodyResponses.has(_fetchRes.status)) _fetchRes._data = await _fetchRes[detectResponseType(_fetchRes)]();
|
|
21
|
+
if (!_fetchRes.ok) throw new DetailedError(`${_fetchRes.status} ${_fetchRes.statusText}`, {
|
|
22
|
+
statusCode: _fetchRes?.status,
|
|
23
|
+
detail: {
|
|
24
|
+
data: _fetchRes?._data,
|
|
25
|
+
statusText: _fetchRes?.statusText
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return _fetchRes._data;
|
|
29
|
+
}
|
|
30
|
+
var DetailedError = class extends Error {
|
|
31
|
+
/**
|
|
32
|
+
* Additional `message` that will be logged AND returned to client
|
|
33
|
+
*/
|
|
34
|
+
detail;
|
|
35
|
+
/**
|
|
36
|
+
* Additional `code` that will be logged AND returned to client
|
|
37
|
+
*/
|
|
38
|
+
code;
|
|
39
|
+
/**
|
|
40
|
+
* Additional value that will be logged AND NOT returned to client
|
|
41
|
+
*/
|
|
42
|
+
log;
|
|
43
|
+
/**
|
|
44
|
+
* Optionally set the status code to return, in a web server context
|
|
45
|
+
*/
|
|
46
|
+
statusCode;
|
|
47
|
+
constructor(message, options = {}) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.name = "DetailedError";
|
|
50
|
+
this.log = options.log;
|
|
51
|
+
this.detail = options.detail;
|
|
52
|
+
this.code = options.code;
|
|
53
|
+
this.statusCode = options.statusCode;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const jsonRegex = /^application\/(?:[\w!#$%&*.^`~-]*\+)?json(?:;.+)?$/i;
|
|
57
|
+
function detectResponseType(response) {
|
|
58
|
+
const _contentType = response.headers.get("content-type");
|
|
59
|
+
if (!_contentType) return "text";
|
|
60
|
+
const contentType = _contentType.split(";").shift();
|
|
61
|
+
if (jsonRegex.test(contentType)) return "json";
|
|
62
|
+
return "text";
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region ../../plugins/acryl-router/src/core/client/utils.ts
|
|
66
|
+
const mergePath = (base, path) => {
|
|
67
|
+
base = base.replace(/\/+$/, "");
|
|
68
|
+
base = base + "/";
|
|
69
|
+
path = path.replace(/^\/+/, "");
|
|
70
|
+
return base + path;
|
|
71
|
+
};
|
|
72
|
+
const replaceUrlParam = (urlString, params) => {
|
|
73
|
+
for (const [k, v] of Object.entries(params)) {
|
|
74
|
+
const reg = new RegExp("/:" + k + "(?:{[^/]+})?\\??(?=/|$)");
|
|
75
|
+
urlString = urlString.replace(reg, () => v ? `/${v}` : "");
|
|
76
|
+
}
|
|
77
|
+
return urlString;
|
|
78
|
+
};
|
|
79
|
+
const buildSearchParams = (query) => {
|
|
80
|
+
const searchParams = new URLSearchParams();
|
|
81
|
+
for (const [k, v] of Object.entries(query)) {
|
|
82
|
+
if (v === void 0) continue;
|
|
83
|
+
if (Array.isArray(v)) for (const v2 of v) {
|
|
84
|
+
if (v2 === void 0) continue;
|
|
85
|
+
searchParams.append(k, v2);
|
|
86
|
+
}
|
|
87
|
+
else searchParams.set(k, v);
|
|
88
|
+
}
|
|
89
|
+
return searchParams;
|
|
90
|
+
};
|
|
91
|
+
const replaceUrlProtocol = (urlString, protocol) => {
|
|
92
|
+
switch (protocol) {
|
|
93
|
+
case "ws": return urlString.replace(/^http/, "ws");
|
|
94
|
+
case "http": return urlString.replace(/^ws/, "http");
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const removeIndexString = (urlString) => {
|
|
98
|
+
if (/^https?:\/\/[^\/]+?\/index(?=\?|$)/.test(urlString)) return urlString.replace(/\/index(?=\?|$)/, "/");
|
|
99
|
+
return urlString.replace(/\/index(?=\?|$)/, "");
|
|
100
|
+
};
|
|
101
|
+
function isObject(item) {
|
|
102
|
+
return typeof item === "object" && item !== null && !Array.isArray(item);
|
|
103
|
+
}
|
|
104
|
+
function deepMerge(target, source) {
|
|
105
|
+
if (!isObject(target) && !isObject(source)) return source;
|
|
106
|
+
const merged = { ...target };
|
|
107
|
+
for (const key in source) {
|
|
108
|
+
const value = source[key];
|
|
109
|
+
if (isObject(merged[key]) && isObject(value)) merged[key] = deepMerge(merged[key], value);
|
|
110
|
+
else merged[key] = value;
|
|
111
|
+
}
|
|
112
|
+
return merged;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Shortcut to get a consumable response from `hc`'s fetch calls (Response), with types inference.
|
|
116
|
+
*
|
|
117
|
+
* Smartly parse the response data, throwing a structured error if the response is not `ok`. ({@link DetailedError})
|
|
118
|
+
*
|
|
119
|
+
* @example const result = await parseResponse(client.posts.$get())
|
|
120
|
+
*/
|
|
121
|
+
async function parseResponse(fetchRes) {
|
|
122
|
+
return fetchRP(fetchRes);
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
export { removeIndexString as a, DetailedError as c, parseResponse as i, deepMerge as n, replaceUrlParam as o, mergePath as r, replaceUrlProtocol as s, buildSearchParams as t };
|
package/lib/validator.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { G as ParsedFormValue, L as MiddlewareHandler, Q as ValidationTargets, T as FormValue, Z as TypedResponse, t as Context, v as Env } from "./context-DS3fYyG-.js";
|
|
2
2
|
import { D as UnionToIntersection } from "./types-Lqx5BxQF.js";
|
|
3
3
|
|
|
4
4
|
//#region ../../plugins/acryl-router/src/core/validator/utils.d.ts
|
package/lib/ws.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as WSEvents, c as WebSocketHelperDefineContext, d as defineWebSocketHelper, i as WSContextInit, l as WebSocketHelperDefineHandler, n as UpgradeWebSocket, o as WSMessageReceive, r as WSContext, s as WSReadyState, t as SendOptions, u as createWSMessageEvent } from "./index-
|
|
1
|
+
import { a as WSEvents, c as WebSocketHelperDefineContext, d as defineWebSocketHelper, i as WSContextInit, l as WebSocketHelperDefineHandler, n as UpgradeWebSocket, o as WSMessageReceive, r as WSContext, s as WSReadyState, t as SendOptions, u as createWSMessageEvent } from "./index-BvFh1Gfx.js";
|
|
2
2
|
export { SendOptions, UpgradeWebSocket, WSContext, WSContextInit, WSEvents, WSMessageReceive, WSReadyState, WebSocketHelperDefineContext, WebSocketHelperDefineHandler, createWSMessageEvent, defineWebSocketHelper };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "acrylblends",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"description": "The Acryl web framework (import { Acryl } from \"acrylblends\") and the acrylblends command that scaffolds Cordis apps.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -82,6 +82,10 @@
|
|
|
82
82
|
"types": "./lib/ip-restriction.d.ts",
|
|
83
83
|
"default": "./lib/ip-restriction.js"
|
|
84
84
|
},
|
|
85
|
+
"./jsx-renderer": {
|
|
86
|
+
"types": "./lib/jsx-renderer.d.ts",
|
|
87
|
+
"default": "./lib/jsx-renderer.js"
|
|
88
|
+
},
|
|
85
89
|
"./jwk": {
|
|
86
90
|
"types": "./lib/jwk.d.ts",
|
|
87
91
|
"default": "./lib/jwk.js"
|
|
@@ -174,6 +178,10 @@
|
|
|
174
178
|
"types": "./lib/route.d.ts",
|
|
175
179
|
"default": "./lib/route.js"
|
|
176
180
|
},
|
|
181
|
+
"./ssg": {
|
|
182
|
+
"types": "./lib/ssg.d.ts",
|
|
183
|
+
"default": "./lib/ssg.js"
|
|
184
|
+
},
|
|
177
185
|
"./streaming": {
|
|
178
186
|
"types": "./lib/streaming.d.ts",
|
|
179
187
|
"default": "./lib/streaming.js"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* SSG Helper for Acryl.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export * from './ssg.ts'
|
|
7
|
+
export {
|
|
8
|
+
X_ACRYL_DISABLE_SSG_HEADER_KEY,
|
|
9
|
+
ssgParams,
|
|
10
|
+
isSSGContext,
|
|
11
|
+
disableSSG,
|
|
12
|
+
onlySSG,
|
|
13
|
+
} from './middleware.ts'
|
|
14
|
+
export { defaultPlugin, redirectPlugin } from './plugins.ts'
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Context } from '../../context.ts'
|
|
2
|
+
import type { Env, MiddlewareHandler } from '../../types.ts'
|
|
3
|
+
import { isDynamicRoute } from './utils.ts'
|
|
4
|
+
|
|
5
|
+
export const SSG_CONTEXT = 'ACRYL_SSG_CONTEXT'
|
|
6
|
+
export const X_ACRYL_DISABLE_SSG_HEADER_KEY = 'x-acryl-disable-ssg'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated
|
|
10
|
+
* Use `X_ACRYL_DISABLE_SSG_HEADER_KEY` instead.
|
|
11
|
+
* This constant will be removed in the next minor version.
|
|
12
|
+
*/
|
|
13
|
+
export const SSG_DISABLED_RESPONSE = (() => {
|
|
14
|
+
try {
|
|
15
|
+
return new Response('SSG is disabled', {
|
|
16
|
+
status: 404,
|
|
17
|
+
headers: { [X_ACRYL_DISABLE_SSG_HEADER_KEY]: 'true' },
|
|
18
|
+
})
|
|
19
|
+
} catch {
|
|
20
|
+
return null
|
|
21
|
+
}
|
|
22
|
+
})() as Response
|
|
23
|
+
|
|
24
|
+
interface SSGParam {
|
|
25
|
+
[key: string]: string
|
|
26
|
+
}
|
|
27
|
+
export type SSGParams = SSGParam[]
|
|
28
|
+
|
|
29
|
+
interface SSGParamsMiddleware {
|
|
30
|
+
<E extends Env = Env>(
|
|
31
|
+
generateParams: (c: Context<E>) => SSGParams | Promise<SSGParams>
|
|
32
|
+
): MiddlewareHandler<E>
|
|
33
|
+
<E extends Env = Env>(params: SSGParams): MiddlewareHandler<E>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type AddedSSGDataRequest = Request & {
|
|
37
|
+
ssgParams?: SSGParams
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Define SSG Route
|
|
42
|
+
*/
|
|
43
|
+
export const ssgParams: SSGParamsMiddleware = (params) => async (c, next) => {
|
|
44
|
+
if (isDynamicRoute(c.req.path)) {
|
|
45
|
+
;(c.req.raw as AddedSSGDataRequest).ssgParams = Array.isArray(params) ? params : await params(c)
|
|
46
|
+
return c.notFound() // Prevent subsequent handler execution after ssgParams
|
|
47
|
+
}
|
|
48
|
+
await next()
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @experimental
|
|
53
|
+
* `isSSGContext` is an experimental feature.
|
|
54
|
+
* The API might be changed.
|
|
55
|
+
*/
|
|
56
|
+
export const isSSGContext = (c: Context): boolean => !!c.env?.[SSG_CONTEXT]
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @experimental
|
|
60
|
+
* `disableSSG` is an experimental feature.
|
|
61
|
+
* The API might be changed.
|
|
62
|
+
*/
|
|
63
|
+
export const disableSSG = (): MiddlewareHandler =>
|
|
64
|
+
async function disableSSG(c, next) {
|
|
65
|
+
if (isSSGContext(c)) {
|
|
66
|
+
c.header(X_ACRYL_DISABLE_SSG_HEADER_KEY, 'true')
|
|
67
|
+
return c.notFound()
|
|
68
|
+
}
|
|
69
|
+
await next()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @experimental
|
|
74
|
+
* `onlySSG` is an experimental feature.
|
|
75
|
+
* The API might be changed.
|
|
76
|
+
*/
|
|
77
|
+
export const onlySSG = (): MiddlewareHandler =>
|
|
78
|
+
async function onlySSG(c, next) {
|
|
79
|
+
if (!isSSGContext(c)) {
|
|
80
|
+
return c.notFound()
|
|
81
|
+
}
|
|
82
|
+
await next()
|
|
83
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { html } from '../html/index.ts'
|
|
2
|
+
import type { SSGPlugin } from './ssg.ts'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The default plugin that defines the recommended behavior.
|
|
6
|
+
*
|
|
7
|
+
* @experimental
|
|
8
|
+
* `defaultPlugin` is an experimental feature.
|
|
9
|
+
* The API might be changed.
|
|
10
|
+
*/
|
|
11
|
+
export const defaultPlugin = (): SSGPlugin => {
|
|
12
|
+
return {
|
|
13
|
+
afterResponseHook: (res) => {
|
|
14
|
+
if (res.status !== 200) {
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
return res
|
|
18
|
+
},
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const REDIRECT_STATUS_CODES = new Set([301, 302, 303, 307, 308])
|
|
23
|
+
|
|
24
|
+
const generateRedirectHtml = (location: string) => {
|
|
25
|
+
// prettier-ignore
|
|
26
|
+
const content = html`<!DOCTYPE html>
|
|
27
|
+
<title>Redirecting to: ${location}</title>
|
|
28
|
+
<meta http-equiv="refresh" content="0;url=${location}" />
|
|
29
|
+
<meta name="robots" content="noindex" />
|
|
30
|
+
<link rel="canonical" href="${location}" />
|
|
31
|
+
<body>
|
|
32
|
+
<a href="${location}">Redirecting to <code>${location}</code></a>
|
|
33
|
+
</body>
|
|
34
|
+
`
|
|
35
|
+
return content.toString().replace(/\n/g, '')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The redirect plugin that generates HTML redirect pages for HTTP redirect responses for status codes 301, 302, 303, 307 and 308.
|
|
40
|
+
*
|
|
41
|
+
* When used with `defaultPlugin`, place `redirectPlugin` before it, because `defaultPlugin` skips non-200 responses.
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* // ✅ Will work as expected
|
|
45
|
+
* toSSG(app, fs, { plugins: [redirectPlugin(), defaultPlugin()] })
|
|
46
|
+
*
|
|
47
|
+
* // ❌ Will not work as expected
|
|
48
|
+
* toSSG(app, fs, { plugins: [defaultPlugin(), redirectPlugin()] })
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @experimental
|
|
52
|
+
* `redirectPlugin` is an experimental feature.
|
|
53
|
+
* The API might be changed.
|
|
54
|
+
*/
|
|
55
|
+
export const redirectPlugin = (): SSGPlugin => {
|
|
56
|
+
return {
|
|
57
|
+
afterResponseHook: (res) => {
|
|
58
|
+
if (REDIRECT_STATUS_CODES.has(res.status)) {
|
|
59
|
+
const location = res.headers.get('Location')
|
|
60
|
+
if (!location) {
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
const htmlBody = generateRedirectHtml(location)
|
|
64
|
+
return new Response(htmlBody, {
|
|
65
|
+
status: 200,
|
|
66
|
+
headers: { 'Content-Type': 'text/html; charset=utf-8' },
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
return res
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
}
|