acrylblends 0.7.3 → 0.7.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.
Files changed (87) hide show
  1. package/docs/framework/README.md +4 -3
  2. package/docs/framework/UPSTREAM.md +1 -1
  3. package/docs/framework/getting-started/aws-lambda.md +115 -0
  4. package/docs/framework/getting-started/bun.md +1 -3
  5. package/docs/framework/getting-started/cloudflare-pages.md +53 -0
  6. package/docs/framework/getting-started/cloudflare-workers.md +67 -0
  7. package/docs/framework/getting-started/lambda-edge.md +41 -0
  8. package/docs/framework/getting-started/netlify.md +25 -0
  9. package/docs/framework/getting-started/other-runtimes.md +20 -9
  10. package/docs/framework/getting-started/service-worker.md +31 -0
  11. package/docs/framework/getting-started/vercel.md +28 -0
  12. package/docs/framework/guides/create-acrylblends.md +40 -2
  13. package/docs/framework/guides/faq.md +2 -2
  14. package/docs/framework/helpers/conninfo.md +1 -1
  15. package/docs/framework/helpers/ssg.md +1 -1
  16. package/docs/framework/helpers/streaming.md +3 -2
  17. package/docs/framework/helpers/websocket.md +2 -2
  18. package/docs/framework/middleware/builtin/ip-restriction.md +1 -1
  19. package/docs/framework/upstream.json +3 -3
  20. package/lib/aws-lambda.d.ts +324 -0
  21. package/lib/aws-lambda.js +357 -0
  22. package/lib/bun.d.ts +75 -0
  23. package/lib/bun.js +134 -0
  24. package/lib/cloudflare-pages.d.ts +58 -0
  25. package/lib/cloudflare-pages.js +78 -0
  26. package/lib/cloudflare-workers.d.ts +21 -0
  27. package/lib/cloudflare-workers.js +80 -0
  28. package/lib/index-CseujaYI.d.ts +31 -0
  29. package/lib/index-DaJtL7ci.d.ts +156 -0
  30. package/lib/lambda-edge.d.ts +92 -0
  31. package/lib/lambda-edge.js +105 -0
  32. package/lib/netlify.d.ts +29 -0
  33. package/lib/netlify.js +30 -0
  34. package/lib/node-server/register.js +1 -1
  35. package/lib/node-server/serve-static.js +1 -1
  36. package/lib/node-server.js +3 -3
  37. package/lib/serve-static-Cp5adzGo.js +77 -0
  38. package/lib/serve-static.d.ts +1 -30
  39. package/lib/serve-static.js +1 -76
  40. package/lib/service-worker.d.ts +48 -0
  41. package/lib/service-worker.js +38 -0
  42. package/lib/ssg.d.ts +1 -155
  43. package/lib/vercel.d.ts +10 -0
  44. package/lib/vercel.js +9 -0
  45. package/package.json +33 -1
  46. package/plugins/acryl-inspect/upstream.json +1 -1
  47. package/plugins/acryl-node-server/upstream.json +1 -1
  48. package/plugins/acryl-router/src/core/adapter/aws-lambda/conninfo.ts +73 -0
  49. package/plugins/acryl-router/src/core/adapter/aws-lambda/handler.ts +682 -0
  50. package/plugins/acryl-router/src/core/adapter/aws-lambda/index.ts +14 -0
  51. package/plugins/acryl-router/src/core/adapter/aws-lambda/types.ts +173 -0
  52. package/plugins/acryl-router/src/core/adapter/bun/conninfo.ts +43 -0
  53. package/plugins/acryl-router/src/core/adapter/bun/index.ts +11 -0
  54. package/plugins/acryl-router/src/core/adapter/bun/serve-static.ts +32 -0
  55. package/plugins/acryl-router/src/core/adapter/bun/server.ts +14 -0
  56. package/plugins/acryl-router/src/core/adapter/bun/ssg.ts +26 -0
  57. package/plugins/acryl-router/src/core/adapter/bun/websocket.ts +113 -0
  58. package/plugins/acryl-router/src/core/adapter/cloudflare-pages/conninfo.ts +26 -0
  59. package/plugins/acryl-router/src/core/adapter/cloudflare-pages/handler.ts +122 -0
  60. package/plugins/acryl-router/src/core/adapter/cloudflare-pages/index.ts +11 -0
  61. package/plugins/acryl-router/src/core/adapter/cloudflare-workers/conninfo.ts +7 -0
  62. package/plugins/acryl-router/src/core/adapter/cloudflare-workers/index.ts +8 -0
  63. package/plugins/acryl-router/src/core/adapter/cloudflare-workers/serve-static-module.ts +12 -0
  64. package/plugins/acryl-router/src/core/adapter/cloudflare-workers/serve-static.ts +41 -0
  65. package/plugins/acryl-router/src/core/adapter/cloudflare-workers/utils.ts +50 -0
  66. package/plugins/acryl-router/src/core/adapter/cloudflare-workers/websocket.ts +52 -0
  67. package/plugins/acryl-router/src/core/adapter/lambda-edge/conninfo.ts +15 -0
  68. package/plugins/acryl-router/src/core/adapter/lambda-edge/handler.ts +239 -0
  69. package/plugins/acryl-router/src/core/adapter/lambda-edge/index.ts +14 -0
  70. package/plugins/acryl-router/src/core/adapter/netlify/conninfo.ts +57 -0
  71. package/plugins/acryl-router/src/core/adapter/netlify/handler.ts +10 -0
  72. package/plugins/acryl-router/src/core/adapter/netlify/index.ts +6 -0
  73. package/plugins/acryl-router/src/core/adapter/netlify/mod.ts +2 -0
  74. package/plugins/acryl-router/src/core/adapter/service-worker/handler.ts +37 -0
  75. package/plugins/acryl-router/src/core/adapter/service-worker/index.ts +36 -0
  76. package/plugins/acryl-router/src/core/adapter/service-worker/types.ts +14 -0
  77. package/plugins/acryl-router/src/core/adapter/vercel/conninfo.ts +8 -0
  78. package/plugins/acryl-router/src/core/adapter/vercel/handler.ts +8 -0
  79. package/plugins/acryl-router/src/core/adapter/vercel/index.ts +7 -0
  80. package/plugins/acryl-router/upstream.json +2 -2
  81. package/plugins/acryl-router-http/upstream.json +1 -1
  82. package/plugins/acryl-state/upstream.json +1 -1
  83. package/plugins/desktop/upstream.json +1 -1
  84. package/plugins/desktop-web/upstream.json +1 -1
  85. package/templates/todo/upstream.json +1 -1
  86. package/lib/{serve-static-B14MF1Va.js → serve-static-B849HlX2.js} +1 -1
  87. package/lib/{transpile-CTnWof4z.js → transpile-QUK9b3eG.js} +1 -1
@@ -0,0 +1,92 @@
1
+ import { r as GetConnInfo } from "./types-Dv_nV2cv.js";
2
+ import { t as Acryl } from "./app-D8riatvv.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/core/adapter/lambda-edge/handler.d.ts
5
+ interface CloudFrontHeader {
6
+ key: string;
7
+ value: string;
8
+ }
9
+ interface CloudFrontHeaders {
10
+ [name: string]: CloudFrontHeader[];
11
+ }
12
+ interface CloudFrontCustomOrigin {
13
+ customHeaders: CloudFrontHeaders;
14
+ domainName: string;
15
+ keepaliveTimeout: number;
16
+ path: string;
17
+ port: number;
18
+ protocol: string;
19
+ readTimeout: number;
20
+ sslProtocols: string[];
21
+ }
22
+ interface CloudFrontS3Origin {
23
+ authMethod: 'origin-access-identity' | 'none';
24
+ customHeaders: CloudFrontHeaders;
25
+ domainName: string;
26
+ path: string;
27
+ region: string;
28
+ }
29
+ type CloudFrontOrigin = {
30
+ s3: CloudFrontS3Origin;
31
+ custom?: never;
32
+ } | {
33
+ custom: CloudFrontCustomOrigin;
34
+ s3?: never;
35
+ };
36
+ interface CloudFrontRequest {
37
+ clientIp: string;
38
+ headers: CloudFrontHeaders;
39
+ method: string;
40
+ querystring: string;
41
+ uri: string;
42
+ body?: {
43
+ inputTruncated: boolean;
44
+ action: string;
45
+ encoding: string;
46
+ data: string;
47
+ };
48
+ origin?: CloudFrontOrigin;
49
+ }
50
+ interface CloudFrontResponse {
51
+ headers: CloudFrontHeaders;
52
+ status: string;
53
+ statusDescription?: string;
54
+ }
55
+ interface CloudFrontConfig {
56
+ distributionDomainName: string;
57
+ distributionId: string;
58
+ eventType: string;
59
+ requestId: string;
60
+ }
61
+ interface CloudFrontEvent {
62
+ cf: {
63
+ config: CloudFrontConfig;
64
+ request: CloudFrontRequest;
65
+ response?: CloudFrontResponse;
66
+ };
67
+ }
68
+ interface CloudFrontEdgeEvent {
69
+ Records: CloudFrontEvent[];
70
+ }
71
+ type CloudFrontContext = {};
72
+ interface Callback {
73
+ (err: Error | null, result?: CloudFrontRequest | CloudFrontResult): void;
74
+ }
75
+ interface CloudFrontResult {
76
+ status: string;
77
+ statusDescription?: string;
78
+ headers?: {
79
+ [header: string]: {
80
+ key: string;
81
+ value: string;
82
+ }[];
83
+ };
84
+ body?: string;
85
+ bodyEncoding?: 'text' | 'base64';
86
+ }
87
+ declare const handle: (app: Acryl<any>) => ((event: CloudFrontEdgeEvent, context?: CloudFrontContext, callback?: Callback) => Promise<CloudFrontResult | CloudFrontRequest>);
88
+ //#endregion
89
+ //#region ../../plugins/acryl-router/src/core/adapter/lambda-edge/conninfo.d.ts
90
+ declare const getConnInfo: GetConnInfo;
91
+ //#endregion
92
+ export { type Callback, type CloudFrontConfig, type CloudFrontEdgeEvent, type CloudFrontRequest, type CloudFrontResponse, getConnInfo, handle };
@@ -0,0 +1,105 @@
1
+ import { decodeBase64, encodeBase64 } from "./utils/encode.js";
2
+ import crypto from "node:crypto";
3
+ //#region ../../plugins/acryl-router/src/core/adapter/lambda-edge/handler.ts
4
+ globalThis.crypto ??= crypto;
5
+ /**
6
+ * Accepts events from 'Lambda@Edge' event
7
+ * https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html
8
+ */
9
+ const convertHeaders = (headers) => {
10
+ const cfHeaders = {};
11
+ headers.forEach((value, key) => {
12
+ cfHeaders[key.toLowerCase()] = [...cfHeaders[key.toLowerCase()] || [], {
13
+ key: key.toLowerCase(),
14
+ value
15
+ }];
16
+ });
17
+ return cfHeaders;
18
+ };
19
+ const handle = (app) => {
20
+ return async (event, ...args) => {
21
+ const [context, callback] = args;
22
+ let callbackError = null;
23
+ let callbackResult;
24
+ const cf = getCloudFrontRecord(event);
25
+ const res = await app.fetch(createRequest(cf), {
26
+ event,
27
+ context,
28
+ callback: (err, result) => {
29
+ if (!callbackError && !callbackResult) {
30
+ callbackError = err;
31
+ callbackResult = result;
32
+ }
33
+ callback?.(err, result);
34
+ },
35
+ config: cf.config,
36
+ request: cf.request,
37
+ response: cf.response
38
+ });
39
+ if (callbackError) throw callbackError;
40
+ return callbackResult ?? createResult(res);
41
+ };
42
+ };
43
+ const createResult = async (res) => {
44
+ const contentEncoding = res.headers.get("content-encoding");
45
+ const isBase64Encoded = isContentTypeBinary(res.headers.get("content-type") || "") || !!contentEncoding && !/^identity$/i.test(contentEncoding);
46
+ const body = isBase64Encoded ? encodeBase64(await res.arrayBuffer()) : await res.text();
47
+ return {
48
+ status: res.status.toString(),
49
+ headers: convertHeaders(res.headers),
50
+ body,
51
+ ...isBase64Encoded && { bodyEncoding: "base64" }
52
+ };
53
+ };
54
+ /**
55
+ * Reads the CloudFront record out of a Lambda@Edge event.
56
+ *
57
+ * The event is supplied by the runtime, so a malformed one means the function
58
+ * was invoked with something other than a Lambda@Edge event. Fail with a
59
+ * message naming the adapter and the missing field, rather than letting an
60
+ * unattributable property access error escape.
61
+ */
62
+ const getCloudFrontRecord = (event) => {
63
+ const cf = event?.Records?.[0]?.cf;
64
+ if (!cf?.request) throw new TypeError("Unable to map the CloudFront event to a Request: expected `Records[0].cf.request` in the Lambda@Edge event.");
65
+ return cf;
66
+ };
67
+ const createRequest = (cf) => {
68
+ const request = cf.request;
69
+ const queryString = request.querystring;
70
+ const urlPath = `https://${request.headers?.host?.[0]?.value || cf.config?.distributionDomainName}${request.uri}`;
71
+ const url = queryString ? `${urlPath}?${queryString}` : urlPath;
72
+ const headers = new Headers();
73
+ Object.entries(request.headers ?? {}).forEach(([k, v]) => {
74
+ v.forEach((header) => headers.append(k, header.value));
75
+ });
76
+ const requestBody = request.body;
77
+ const method = request.method;
78
+ const rawBody = createBody(method, requestBody);
79
+ let body = rawBody;
80
+ if (rawBody !== void 0) {
81
+ const bytes = typeof rawBody === "string" ? new TextEncoder().encode(rawBody) : rawBody;
82
+ body = bytes;
83
+ headers.set("content-length", bytes.length.toString());
84
+ }
85
+ return new Request(url, {
86
+ headers,
87
+ method,
88
+ body
89
+ });
90
+ };
91
+ const createBody = (method, requestBody) => {
92
+ if (!requestBody || !requestBody.data) return;
93
+ if (method === "GET" || method === "HEAD") return;
94
+ if (requestBody.encoding === "base64") return decodeBase64(requestBody.data);
95
+ return requestBody.data;
96
+ };
97
+ const isContentTypeBinary = (contentType) => {
98
+ if (/^application\/vnd\.(?:apple\.installer|mozilla\.xul)\+xml\s*(?:;|$)/i.test(contentType)) return true;
99
+ return !/^text\/(?:plain|html|css|javascript|csv)|(?:\/|\+)(?:json|xml)\s*(?:;|$)/i.test(contentType);
100
+ };
101
+ //#endregion
102
+ //#region ../../plugins/acryl-router/src/core/adapter/lambda-edge/conninfo.ts
103
+ const getConnInfo = (c) => ({ remote: { address: c.env.event.Records[0].cf.request.clientIp } });
104
+ //#endregion
105
+ export { getConnInfo, handle };
@@ -0,0 +1,29 @@
1
+ import { r as GetConnInfo } from "./types-Dv_nV2cv.js";
2
+ import { t as Acryl } from "./app-D8riatvv.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/core/adapter/netlify/handler.d.ts
5
+ declare const handle: (app: Acryl<any, any>) => ((req: Request, context: any) => Response | Promise<Response>);
6
+ //#endregion
7
+ //#region ../../plugins/acryl-router/src/core/adapter/netlify/conninfo.d.ts
8
+ /**
9
+ * Get connection information from Netlify
10
+ * @param c - Context
11
+ * @returns Connection information including remote address
12
+ * @example
13
+ * ```ts
14
+ * import { Acryl } from 'acrylblends'
15
+ * import { handle, getConnInfo } from 'acrylblends/netlify'
16
+ *
17
+ * const app = new Acryl()
18
+ *
19
+ * app.get('/', (c) => {
20
+ * const info = getConnInfo(c)
21
+ * return c.text(`Your IP: ${info.remote.address}`)
22
+ * })
23
+ *
24
+ * export default handle(app)
25
+ * ```
26
+ */
27
+ declare const getConnInfo: GetConnInfo;
28
+ //#endregion
29
+ export { getConnInfo, handle };
package/lib/netlify.js ADDED
@@ -0,0 +1,30 @@
1
+ //#region ../../plugins/acryl-router/src/core/adapter/netlify/handler.ts
2
+ const handle = (app) => {
3
+ return (req, context) => {
4
+ return app.fetch(req, { context });
5
+ };
6
+ };
7
+ //#endregion
8
+ //#region ../../plugins/acryl-router/src/core/adapter/netlify/conninfo.ts
9
+ /**
10
+ * Get connection information from Netlify
11
+ * @param c - Context
12
+ * @returns Connection information including remote address
13
+ * @example
14
+ * ```ts
15
+ * import { Acryl } from 'acrylblends'
16
+ * import { handle, getConnInfo } from 'acrylblends/netlify'
17
+ *
18
+ * const app = new Acryl()
19
+ *
20
+ * app.get('/', (c) => {
21
+ * const info = getConnInfo(c)
22
+ * return c.text(`Your IP: ${info.remote.address}`)
23
+ * })
24
+ *
25
+ * export default handle(app)
26
+ * ```
27
+ */
28
+ const getConnInfo = (c) => ({ remote: { address: c.env.context?.ip } });
29
+ //#endregion
30
+ export { getConnInfo, handle };
@@ -1,4 +1,4 @@
1
- import { n as compileModule } from "../transpile-CTnWof4z.js";
1
+ import { n as compileModule } from "../transpile-QUK9b3eG.js";
2
2
  import { registerHooks } from "node:module";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { fileURLToPath } from "node:url";
@@ -1,2 +1,2 @@
1
- import { t as serveStatic } from "../serve-static-B14MF1Va.js";
1
+ import { t as serveStatic } from "../serve-static-B849HlX2.js";
2
2
  export { serveStatic };
@@ -1,14 +1,14 @@
1
1
  import { t as Acryl } from "./app-BM0rTCp7.js";
2
2
  import { basePath } from "./route.js";
3
3
  import { defineWebSocketHelper } from "./ws.js";
4
- import { t as serveStatic } from "./serve-static-B14MF1Va.js";
4
+ import { t as serveStatic } from "./serve-static-B849HlX2.js";
5
5
  import { getConnInfo } from "./node-server/conninfo.js";
6
- import { n as compileModule, t as MissingTypeScriptError } from "./transpile-CTnWof4z.js";
6
+ import { n as compileModule, t as MissingTypeScriptError } from "./transpile-QUK9b3eG.js";
7
+ import { dirname, extname, isAbsolute, join, relative, resolve, sep } from "node:path";
7
8
  import { STATUS_CODES, ServerResponse, createServer } from "node:http";
8
9
  import { Http2ServerRequest, constants } from "node:http2";
9
10
  import { Readable } from "node:stream";
10
11
  import { copyFileSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, writeFileSync } from "node:fs";
11
- import { dirname, extname, isAbsolute, join, relative, resolve, sep } from "node:path";
12
12
  import { fileURLToPath } from "node:url";
13
13
  //#region ../../plugins/acryl-node-server/src/adapter/error.ts
14
14
  var RequestError = class extends Error {
@@ -0,0 +1,77 @@
1
+ import { tryDecodeURI } from "./utils/url.js";
2
+ import { parseAccept } from "./utils/accept.js";
3
+ import { COMPRESSIBLE_CONTENT_TYPE_REGEX } from "./utils/compress.js";
4
+ import { getMimeType } from "./utils/mime.js";
5
+ //#region ../../plugins/acryl-router/src/core/middleware/serve-static/path.ts
6
+ /**
7
+ * `defaultJoin` does not support Windows paths and always uses `/` separators.
8
+ * If you need Windows path support, please use `join` exported from `node:path` etc. instead.
9
+ */
10
+ const defaultJoin = (...paths) => {
11
+ let result = paths.filter((p) => p !== "").join("/");
12
+ result = result.replace(/(?<=\/)\/+/g, "");
13
+ const segments = result.split("/");
14
+ const resolved = [];
15
+ for (const segment of segments) if (segment === ".." && resolved.length > 0 && resolved.at(-1) !== "..") resolved.pop();
16
+ else if (segment !== ".") resolved.push(segment);
17
+ return resolved.join("/") || ".";
18
+ };
19
+ //#endregion
20
+ //#region ../../plugins/acryl-router/src/core/middleware/serve-static/index.ts
21
+ const ENCODINGS = {
22
+ br: ".br",
23
+ zstd: ".zst",
24
+ gzip: ".gz"
25
+ };
26
+ const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS);
27
+ const DEFAULT_DOCUMENT = "index.html";
28
+ /**
29
+ * This middleware is not directly used by the user. Create a wrapper specifying `getContent()` by the environment such as Deno or Bun.
30
+ */
31
+ const serveStatic = (options) => {
32
+ const root = options.root ?? "./";
33
+ const optionPath = options.path;
34
+ const join = options.join ?? defaultJoin;
35
+ return async (c, next) => {
36
+ if (c.finalized) return next();
37
+ if (c.req.method !== "GET" && c.req.method !== "HEAD") return next();
38
+ let filename;
39
+ if (options.path) filename = options.path;
40
+ else try {
41
+ if (!options.allowPercentInPath && c.req.path.includes("%")) throw new Error();
42
+ filename = tryDecodeURI(c.req.path);
43
+ if (/(?:^|[\/\\])\.{1,2}(?:$|[\/\\])|[\/\\]{2,}|\\/.test(filename)) throw new Error();
44
+ } catch {
45
+ await options.onNotFound?.(c.req.path, c);
46
+ return next();
47
+ }
48
+ let path = join(root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename) : filename);
49
+ if (options.isDir && await options.isDir(path)) path = join(path, DEFAULT_DOCUMENT);
50
+ const getContent = options.getContent;
51
+ let content = await getContent(path, c);
52
+ if (content instanceof Response) return c.newResponse(content.body, content);
53
+ if (content != null) {
54
+ const mimeType = options.mimes && getMimeType(path, options.mimes) || getMimeType(path);
55
+ c.header("Content-Type", mimeType || "application/octet-stream");
56
+ if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
57
+ const acceptEncodingSet = new Set(parseAccept(c.req.header("Accept-Encoding") ?? "").filter((encoding) => encoding.q > 0).map((encoding) => encoding.type));
58
+ for (const encoding of ENCODINGS_ORDERED_KEYS) {
59
+ if (!acceptEncodingSet.has(encoding)) continue;
60
+ const compressedContent = await getContent(path + ENCODINGS[encoding], c);
61
+ if (compressedContent) {
62
+ content = compressedContent;
63
+ c.header("Content-Encoding", encoding);
64
+ c.header("Vary", "Accept-Encoding", { append: true });
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ await options.onFound?.(path, c);
70
+ return c.body(content);
71
+ }
72
+ await options.onNotFound?.(path, c);
73
+ await next();
74
+ };
75
+ };
76
+ //#endregion
77
+ export { serveStatic as t };
@@ -1,31 +1,2 @@
1
- import { L as MiddlewareHandler, i as Data, t as Context, v as Env } from "./context-DS3fYyG-.js";
2
-
3
- //#region ../../plugins/acryl-router/src/core/middleware/serve-static/index.d.ts
4
- type ServeStaticOptions<E extends Env = Env> = {
5
- root?: string;
6
- path?: string;
7
- precompressed?: boolean; /** Allow percent signs in the routed request path. Defaults to false. */
8
- allowPercentInPath?: boolean;
9
- mimes?: Record<string, string>;
10
- rewriteRequestPath?: (path: string) => string;
11
- onFound?: (path: string, c: Context<E>) => void | Promise<void>;
12
- onNotFound?: (path: string, c: Context<E>) => void | Promise<void>;
13
- };
14
- /**
15
- * This middleware is not directly used by the user. Create a wrapper specifying `getContent()` by the environment such as Deno or Bun.
16
- */
17
- declare const serveStatic: <E extends Env = Env>(options: ServeStaticOptions<E> & {
18
- getContent: (path: string, c: Context<E>) => Promise<Data | Response | null>;
19
- /**
20
- *
21
- * `join` option according to the runtime. Example `import { join } from 'node:path`. If not specified, it will fall back to the default join function.`
22
- */
23
- join?: (...paths: string[]) => string;
24
- /**
25
- * @deprecated Currently, `pathResolve` is no longer used.
26
- */
27
- pathResolve?: (path: string) => string;
28
- isDir?: (path: string) => boolean | undefined | Promise<boolean | undefined>;
29
- }) => MiddlewareHandler;
30
- //#endregion
1
+ import { n as serveStatic, t as ServeStaticOptions } from "./index-CseujaYI.js";
31
2
  export { ServeStaticOptions, serveStatic };
@@ -1,77 +1,2 @@
1
- import { tryDecodeURI } from "./utils/url.js";
2
- import { parseAccept } from "./utils/accept.js";
3
- import { COMPRESSIBLE_CONTENT_TYPE_REGEX } from "./utils/compress.js";
4
- import { getMimeType } from "./utils/mime.js";
5
- //#region ../../plugins/acryl-router/src/core/middleware/serve-static/path.ts
6
- /**
7
- * `defaultJoin` does not support Windows paths and always uses `/` separators.
8
- * If you need Windows path support, please use `join` exported from `node:path` etc. instead.
9
- */
10
- const defaultJoin = (...paths) => {
11
- let result = paths.filter((p) => p !== "").join("/");
12
- result = result.replace(/(?<=\/)\/+/g, "");
13
- const segments = result.split("/");
14
- const resolved = [];
15
- for (const segment of segments) if (segment === ".." && resolved.length > 0 && resolved.at(-1) !== "..") resolved.pop();
16
- else if (segment !== ".") resolved.push(segment);
17
- return resolved.join("/") || ".";
18
- };
19
- //#endregion
20
- //#region ../../plugins/acryl-router/src/core/middleware/serve-static/index.ts
21
- const ENCODINGS = {
22
- br: ".br",
23
- zstd: ".zst",
24
- gzip: ".gz"
25
- };
26
- const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS);
27
- const DEFAULT_DOCUMENT = "index.html";
28
- /**
29
- * This middleware is not directly used by the user. Create a wrapper specifying `getContent()` by the environment such as Deno or Bun.
30
- */
31
- const serveStatic = (options) => {
32
- const root = options.root ?? "./";
33
- const optionPath = options.path;
34
- const join = options.join ?? defaultJoin;
35
- return async (c, next) => {
36
- if (c.finalized) return next();
37
- if (c.req.method !== "GET" && c.req.method !== "HEAD") return next();
38
- let filename;
39
- if (options.path) filename = options.path;
40
- else try {
41
- if (!options.allowPercentInPath && c.req.path.includes("%")) throw new Error();
42
- filename = tryDecodeURI(c.req.path);
43
- if (/(?:^|[\/\\])\.{1,2}(?:$|[\/\\])|[\/\\]{2,}|\\/.test(filename)) throw new Error();
44
- } catch {
45
- await options.onNotFound?.(c.req.path, c);
46
- return next();
47
- }
48
- let path = join(root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename) : filename);
49
- if (options.isDir && await options.isDir(path)) path = join(path, DEFAULT_DOCUMENT);
50
- const getContent = options.getContent;
51
- let content = await getContent(path, c);
52
- if (content instanceof Response) return c.newResponse(content.body, content);
53
- if (content != null) {
54
- const mimeType = options.mimes && getMimeType(path, options.mimes) || getMimeType(path);
55
- c.header("Content-Type", mimeType || "application/octet-stream");
56
- if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
57
- const acceptEncodingSet = new Set(parseAccept(c.req.header("Accept-Encoding") ?? "").filter((encoding) => encoding.q > 0).map((encoding) => encoding.type));
58
- for (const encoding of ENCODINGS_ORDERED_KEYS) {
59
- if (!acceptEncodingSet.has(encoding)) continue;
60
- const compressedContent = await getContent(path + ENCODINGS[encoding], c);
61
- if (compressedContent) {
62
- content = compressedContent;
63
- c.header("Content-Encoding", encoding);
64
- c.header("Vary", "Accept-Encoding", { append: true });
65
- break;
66
- }
67
- }
68
- }
69
- await options.onFound?.(path, c);
70
- return c.body(content);
71
- }
72
- await options.onNotFound?.(path, c);
73
- await next();
74
- };
75
- };
76
- //#endregion
1
+ import { t as serveStatic } from "./serve-static-Cp5adzGo.js";
77
2
  export { serveStatic };
@@ -0,0 +1,48 @@
1
+ import { Y as Schema, v as Env } from "./context-DS3fYyG-.js";
2
+ import { t as Acryl } from "./app-D8riatvv.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/core/adapter/service-worker/types.d.ts
5
+ interface ExtendableEvent extends Event {
6
+ waitUntil(f: Promise<any>): void;
7
+ }
8
+ interface FetchEvent extends ExtendableEvent {
9
+ readonly clientId: string;
10
+ readonly handled: Promise<void>;
11
+ readonly preloadResponse: Promise<any>;
12
+ readonly request: Request;
13
+ readonly resultingClientId: string;
14
+ respondWith(r: Response | PromiseLike<Response>): void;
15
+ }
16
+ //#endregion
17
+ //#region ../../plugins/acryl-router/src/core/adapter/service-worker/handler.d.ts
18
+ type Handler = (evt: FetchEvent) => void;
19
+ type HandleOptions = {
20
+ fetch?: typeof fetch;
21
+ };
22
+ /**
23
+ * Adapter for Service Worker
24
+ */
25
+ declare const handle: <E extends Env, S extends Schema, BasePath extends string>(app: Acryl<E, S, BasePath>, opts?: HandleOptions) => Handler;
26
+ //#endregion
27
+ //#region ../../plugins/acryl-router/src/core/adapter/service-worker/index.d.ts
28
+ /**
29
+ * Registers a Acryl app to handle fetch events in a service worker.
30
+ * This sets up `addEventListener('fetch', handle(app, options))` for the provided app.
31
+ *
32
+ * @param app - The Acryl application instance
33
+ * @param options - Options for handling requests (fetch defaults to undefined)
34
+ * @example
35
+ * ```ts
36
+ * import { Acryl } from 'acrylblends'
37
+ * import { fire } from 'acrylblends/service-worker'
38
+ *
39
+ * const app = new Acryl()
40
+ *
41
+ * app.get('/', (c) => c.text('Hi'))
42
+ *
43
+ * fire(app)
44
+ * ```
45
+ */
46
+ declare const fire: <E extends Env, S extends Schema, BasePath extends string>(app: Acryl<E, S, BasePath>, options?: HandleOptions) => void;
47
+ //#endregion
48
+ export { fire, handle };
@@ -0,0 +1,38 @@
1
+ //#region ../../plugins/acryl-router/src/core/adapter/service-worker/handler.ts
2
+ /**
3
+ * Adapter for Service Worker
4
+ */
5
+ const handle = (app, opts = { fetch: globalThis.fetch.bind(globalThis) }) => {
6
+ return (evt) => {
7
+ evt.respondWith((async () => {
8
+ const res = await app.fetch(evt.request, {}, evt);
9
+ if (opts.fetch && res.status === 404) return await opts.fetch(evt.request);
10
+ return res;
11
+ })());
12
+ };
13
+ };
14
+ //#endregion
15
+ //#region ../../plugins/acryl-router/src/core/adapter/service-worker/index.ts
16
+ /**
17
+ * Registers a Acryl app to handle fetch events in a service worker.
18
+ * This sets up `addEventListener('fetch', handle(app, options))` for the provided app.
19
+ *
20
+ * @param app - The Acryl application instance
21
+ * @param options - Options for handling requests (fetch defaults to undefined)
22
+ * @example
23
+ * ```ts
24
+ * import { Acryl } from 'acrylblends'
25
+ * import { fire } from 'acrylblends/service-worker'
26
+ *
27
+ * const app = new Acryl()
28
+ *
29
+ * app.get('/', (c) => c.text('Hi'))
30
+ *
31
+ * fire(app)
32
+ * ```
33
+ */
34
+ const fire = (app, options) => {
35
+ addEventListener("fetch", handle(app, options));
36
+ };
37
+ //#endregion
38
+ export { fire, handle };