acrylblends 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/docs/framework/README.md +2 -2
- package/docs/framework/UPSTREAM.md +1 -1
- package/docs/framework/guides/jsx.md +51 -1
- 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/{base-ddiVmiE7.js → base-NSN_SNv-.js} +1 -0
- 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-DYZdxJIJ.js → components-JXVm45kK.js} +1 -1
- package/lib/{components-Ce5FRyHU.js → components-cEW3ovK0.js} +3 -3
- 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-w72iLeFR.js} +6 -6
- 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 +2 -2
- package/lib/jsx/dom.js +4 -4
- package/lib/jsx/jsx-dev-runtime.js +1 -1
- package/lib/jsx/jsx-runtime.js +1 -1
- package/lib/jsx/streaming.js +1 -1
- package/lib/{jsx-dev-runtime-kAhR_4C7.js → jsx-dev-runtime-CWLRA2F3.js} +2 -2
- package/lib/jsx-renderer.d.ts +75 -0
- package/lib/jsx-renderer.js +99 -0
- package/lib/jsx.js +4 -4
- 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/register.d.ts +1 -0
- package/lib/node-server/register.js +73 -0
- 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 +13 -1
- package/plugins/acryl-inspect/upstream.json +1 -1
- package/plugins/acryl-node-server/src/register.ts +86 -0
- package/plugins/acryl-node-server/upstream.json +5 -3
- 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/main.ts +4 -1
- package/plugins/desktop/upstream.json +1 -1
- package/plugins/desktop-web/main.ts +3 -1
- package/plugins/desktop-web/upstream.json +1 -1
- package/plugins/extensions/resolve.ts +4 -0
- package/shared/AGENTS.core.md +3 -0
- package/templates/agent/package.json +7 -3
- package/templates/agent/tsconfig.json +10 -2
- package/templates/blank/package.json +7 -3
- package/templates/blank/src/about.tsx +14 -0
- package/templates/blank/src/routes.ts +2 -0
- package/templates/blank/test/app.test.ts +15 -0
- package/templates/blank/tsconfig.json +3 -1
- package/templates/todo/package.json +7 -3
- package/templates/todo/tsconfig.json +3 -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.
|
|
3
|
+
"version": "0.7.0",
|
|
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"
|
|
@@ -374,6 +382,10 @@
|
|
|
374
382
|
"types": "./lib/node-server/conninfo.d.ts",
|
|
375
383
|
"default": "./lib/node-server/conninfo.js"
|
|
376
384
|
},
|
|
385
|
+
"./node-server/register": {
|
|
386
|
+
"types": "./lib/node-server/register.d.ts",
|
|
387
|
+
"default": "./lib/node-server/register.js"
|
|
388
|
+
},
|
|
377
389
|
"./package.json": "./package.json",
|
|
378
390
|
"./cli": {
|
|
379
391
|
"types": "./dist/index.d.ts",
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSX files on Node: `node --import acrylblends/node-server/register src/index.ts`. Node strips TypeScript's types but does not compile JSX, so a
|
|
3
|
+
* `.tsx` (or `.jsx`) module does not load on its own. This module registers a load hook that compiles exactly those files with the app's own
|
|
4
|
+
* `typescript` (react-jsx, the `jsxImportSource` of the app's nearest tsconfig.json, `acrylblends/jsx` without one) and leaves every other
|
|
5
|
+
* module to Node untouched. The output carries an inline source map and source maps are switched on, so a stack trace names the `.tsx` line.
|
|
6
|
+
*
|
|
7
|
+
* `typescript` is loaded from the app, on the first JSX file only; the framework itself has no dependencies.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createRequire, registerHooks } from 'node:module'
|
|
11
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
12
|
+
import { dirname } from 'node:path'
|
|
13
|
+
import { fileURLToPath } from 'node:url'
|
|
14
|
+
|
|
15
|
+
/** The JSX runtime the docs set up; an app's tsconfig.json (or a file's own `@jsxImportSource` pragma) chooses another. */
|
|
16
|
+
const DEFAULT_IMPORT_SOURCE = 'acrylblends/jsx'
|
|
17
|
+
const JSX_FILE = /\.[jt]sx$/u
|
|
18
|
+
|
|
19
|
+
/** The part of the TypeScript compiler API the hook uses. */
|
|
20
|
+
interface Compiler {
|
|
21
|
+
transpileModule(input: string, options: { fileName: string, compilerOptions: Record<string, unknown> }): { outputText: string }
|
|
22
|
+
findConfigFile(searchPath: string, fileExists: (path: string) => boolean): string | undefined
|
|
23
|
+
readConfigFile(path: string, readFile: (path: string) => string | undefined): { config?: unknown }
|
|
24
|
+
parseJsonConfigFileContent(json: unknown, host: unknown, basePath: string): { options: { jsxImportSource?: string } }
|
|
25
|
+
sys: { fileExists(path: string): boolean, readFile(path: string): string | undefined }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const compilers = new Map<string, Compiler>()
|
|
29
|
+
const importSources = new Map<string, string>()
|
|
30
|
+
|
|
31
|
+
/** The app's own `typescript`, resolved from the JSX file, so each app compiles with the version it pinned. */
|
|
32
|
+
function compilerFor(file: string): Compiler {
|
|
33
|
+
let path: string
|
|
34
|
+
try {
|
|
35
|
+
path = createRequire(file).resolve('typescript')
|
|
36
|
+
} catch {
|
|
37
|
+
throw new Error(`acrylblends: ${file} contains JSX, and compiling it needs the typescript package in this app: npm install --save-dev typescript`)
|
|
38
|
+
}
|
|
39
|
+
let compiler = compilers.get(path)
|
|
40
|
+
if (compiler === undefined) {
|
|
41
|
+
compiler = createRequire(path)(path) as Compiler
|
|
42
|
+
compilers.set(path, compiler)
|
|
43
|
+
}
|
|
44
|
+
return compiler
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** `jsxImportSource` of the tsconfig.json nearest to the file (following `extends`), read once per config. */
|
|
48
|
+
function importSourceFor(file: string, ts: Compiler): string {
|
|
49
|
+
const config = ts.findConfigFile(dirname(file), path => existsSync(path))
|
|
50
|
+
if (config === undefined) return DEFAULT_IMPORT_SOURCE
|
|
51
|
+
let source = importSources.get(config)
|
|
52
|
+
if (source === undefined) {
|
|
53
|
+
const { config: json } = ts.readConfigFile(config, path => ts.sys.readFile(path))
|
|
54
|
+
source = ts.parseJsonConfigFileContent(json ?? {}, ts.sys, dirname(config)).options.jsxImportSource ?? DEFAULT_IMPORT_SOURCE
|
|
55
|
+
importSources.set(config, source)
|
|
56
|
+
}
|
|
57
|
+
return source
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** A JSX module compiled to JavaScript, with its source map inline. */
|
|
61
|
+
function compileJsx(file: string, text: string): string {
|
|
62
|
+
const ts = compilerFor(file)
|
|
63
|
+
return ts.transpileModule(text, {
|
|
64
|
+
fileName: file,
|
|
65
|
+
compilerOptions: {
|
|
66
|
+
module: 'esnext',
|
|
67
|
+
target: 'es2022',
|
|
68
|
+
jsx: 'react-jsx',
|
|
69
|
+
jsxImportSource: importSourceFor(file, ts),
|
|
70
|
+
allowImportingTsExtensions: true,
|
|
71
|
+
inlineSourceMap: true,
|
|
72
|
+
inlineSources: true,
|
|
73
|
+
},
|
|
74
|
+
}).outputText
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
process.setSourceMapsEnabled(true)
|
|
78
|
+
|
|
79
|
+
registerHooks({
|
|
80
|
+
load(url, context, nextLoad) {
|
|
81
|
+
// Every other module goes straight to Node: the hook's whole cost for them is this test.
|
|
82
|
+
if (!url.startsWith('file:') || !JSX_FILE.test(new URL(url).pathname)) return nextLoad(url, context)
|
|
83
|
+
const file = fileURLToPath(url)
|
|
84
|
+
return { format: 'module', source: compileJsx(file, readFileSync(file, 'utf8')), shortCircuit: true }
|
|
85
|
+
},
|
|
86
|
+
})
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"source": {
|
|
3
3
|
"repo": "acryldev/acryl",
|
|
4
4
|
"path": "plugins/acryl-node-server",
|
|
5
|
-
"commit": "
|
|
5
|
+
"commit": "7bba3ed0420d87e61d8256fa60614d22af734c8f"
|
|
6
6
|
},
|
|
7
7
|
"vendored": [
|
|
8
8
|
"src",
|
|
@@ -10,8 +10,10 @@
|
|
|
10
10
|
"LICENSE"
|
|
11
11
|
],
|
|
12
12
|
"rewrittenSpecifiers": 28,
|
|
13
|
-
"digest": "sha256:
|
|
14
|
-
"testsNotRun": {
|
|
13
|
+
"digest": "sha256:9dc4cca51f5a3d8416750c0392135128a0787947f473cff2e00bdb12fe5a63e1",
|
|
14
|
+
"testsNotRun": {
|
|
15
|
+
"tests/register.spec.ts": "links typescript from the plugin's own node_modules (ACRYL's workspace layout); the hook is exercised here by the templates' own .tsx tests and verify:scaffolder"
|
|
16
|
+
},
|
|
15
17
|
"notice": [
|
|
16
18
|
"LICENSE"
|
|
17
19
|
]
|
|
@@ -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
|
+
}
|