acrylblends 0.7.2 → 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.
- package/docs/framework/README.md +4 -3
- package/docs/framework/UPSTREAM.md +1 -1
- package/docs/framework/getting-started/aws-lambda.md +115 -0
- package/docs/framework/getting-started/bun.md +1 -3
- package/docs/framework/getting-started/cloudflare-pages.md +53 -0
- package/docs/framework/getting-started/cloudflare-workers.md +67 -0
- package/docs/framework/getting-started/lambda-edge.md +41 -0
- package/docs/framework/getting-started/netlify.md +25 -0
- package/docs/framework/getting-started/other-runtimes.md +20 -9
- package/docs/framework/getting-started/service-worker.md +31 -0
- package/docs/framework/getting-started/vercel.md +28 -0
- package/docs/framework/guides/client-modules.md +34 -0
- package/docs/framework/guides/create-acrylblends.md +40 -2
- package/docs/framework/guides/faq.md +2 -2
- package/docs/framework/helpers/conninfo.md +1 -1
- package/docs/framework/helpers/ssg.md +1 -1
- package/docs/framework/helpers/streaming.md +120 -0
- package/docs/framework/helpers/websocket.md +2 -2
- package/docs/framework/middleware/builtin/ip-restriction.md +1 -1
- package/docs/framework/upstream.json +3 -3
- package/lib/aws-lambda.d.ts +324 -0
- package/lib/aws-lambda.js +357 -0
- package/lib/bun.d.ts +75 -0
- package/lib/bun.js +134 -0
- package/lib/cloudflare-pages.d.ts +58 -0
- package/lib/cloudflare-pages.js +78 -0
- package/lib/cloudflare-workers.d.ts +21 -0
- package/lib/cloudflare-workers.js +80 -0
- package/lib/index-CseujaYI.d.ts +31 -0
- package/lib/index-DaJtL7ci.d.ts +156 -0
- package/lib/lambda-edge.d.ts +92 -0
- package/lib/lambda-edge.js +105 -0
- package/lib/netlify.d.ts +29 -0
- package/lib/netlify.js +30 -0
- package/lib/node-server/register.js +1 -1
- package/lib/node-server/serve-static.js +1 -1
- package/lib/node-server.js +3 -3
- package/lib/serve-static-Cp5adzGo.js +77 -0
- package/lib/serve-static.d.ts +1 -30
- package/lib/serve-static.js +1 -76
- package/lib/service-worker.d.ts +48 -0
- package/lib/service-worker.js +38 -0
- package/lib/ssg.d.ts +1 -155
- package/lib/vercel.d.ts +10 -0
- package/lib/vercel.js +9 -0
- package/package.json +33 -1
- package/plugins/acryl-inspect/upstream.json +1 -1
- package/plugins/acryl-node-server/upstream.json +1 -1
- package/plugins/acryl-router/src/core/adapter/aws-lambda/conninfo.ts +73 -0
- package/plugins/acryl-router/src/core/adapter/aws-lambda/handler.ts +682 -0
- package/plugins/acryl-router/src/core/adapter/aws-lambda/index.ts +14 -0
- package/plugins/acryl-router/src/core/adapter/aws-lambda/types.ts +173 -0
- package/plugins/acryl-router/src/core/adapter/bun/conninfo.ts +43 -0
- package/plugins/acryl-router/src/core/adapter/bun/index.ts +11 -0
- package/plugins/acryl-router/src/core/adapter/bun/serve-static.ts +32 -0
- package/plugins/acryl-router/src/core/adapter/bun/server.ts +14 -0
- package/plugins/acryl-router/src/core/adapter/bun/ssg.ts +26 -0
- package/plugins/acryl-router/src/core/adapter/bun/websocket.ts +113 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-pages/conninfo.ts +26 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-pages/handler.ts +122 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-pages/index.ts +11 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-workers/conninfo.ts +7 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-workers/index.ts +8 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-workers/serve-static-module.ts +12 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-workers/serve-static.ts +41 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-workers/utils.ts +50 -0
- package/plugins/acryl-router/src/core/adapter/cloudflare-workers/websocket.ts +52 -0
- package/plugins/acryl-router/src/core/adapter/lambda-edge/conninfo.ts +15 -0
- package/plugins/acryl-router/src/core/adapter/lambda-edge/handler.ts +239 -0
- package/plugins/acryl-router/src/core/adapter/lambda-edge/index.ts +14 -0
- package/plugins/acryl-router/src/core/adapter/netlify/conninfo.ts +57 -0
- package/plugins/acryl-router/src/core/adapter/netlify/handler.ts +10 -0
- package/plugins/acryl-router/src/core/adapter/netlify/index.ts +6 -0
- package/plugins/acryl-router/src/core/adapter/netlify/mod.ts +2 -0
- package/plugins/acryl-router/src/core/adapter/service-worker/handler.ts +37 -0
- package/plugins/acryl-router/src/core/adapter/service-worker/index.ts +36 -0
- package/plugins/acryl-router/src/core/adapter/service-worker/types.ts +14 -0
- package/plugins/acryl-router/src/core/adapter/vercel/conninfo.ts +8 -0
- package/plugins/acryl-router/src/core/adapter/vercel/handler.ts +8 -0
- package/plugins/acryl-router/src/core/adapter/vercel/index.ts +7 -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/templates/todo/upstream.json +1 -1
- package/lib/{serve-static-B14MF1Va.js → serve-static-B849HlX2.js} +1 -1
- package/lib/{transpile-CTnWof4z.js → transpile-QUK9b3eG.js} +1 -1
package/lib/serve-static.d.ts
CHANGED
|
@@ -1,31 +1,2 @@
|
|
|
1
|
-
import {
|
|
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 };
|
package/lib/serve-static.js
CHANGED
|
@@ -1,77 +1,2 @@
|
|
|
1
|
-
import {
|
|
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 };
|
package/lib/ssg.d.ts
CHANGED
|
@@ -1,156 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as Acryl } from "./app-D8riatvv.js";
|
|
3
|
-
|
|
4
|
-
//#region ../../plugins/acryl-router/src/core/helper/ssg/ssg.d.ts
|
|
5
|
-
declare const DEFAULT_OUTPUT_DIR = "./static";
|
|
6
|
-
/**
|
|
7
|
-
* @experimental
|
|
8
|
-
* `FileSystemModule` is an experimental feature.
|
|
9
|
-
* The API might be changed.
|
|
10
|
-
*/
|
|
11
|
-
interface FileSystemModule {
|
|
12
|
-
writeFile(path: string, data: string | Uint8Array): Promise<void>;
|
|
13
|
-
mkdir(path: string, options: {
|
|
14
|
-
recursive: boolean;
|
|
15
|
-
}): Promise<void | string>;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* @experimental
|
|
19
|
-
* `ToSSGResult` is an experimental feature.
|
|
20
|
-
* The API might be changed.
|
|
21
|
-
*/
|
|
22
|
-
interface ToSSGResult {
|
|
23
|
-
success: boolean;
|
|
24
|
-
files: string[];
|
|
25
|
-
error?: Error;
|
|
26
|
-
}
|
|
27
|
-
declare const defaultExtensionMap: Record<string, string>;
|
|
28
|
-
type BeforeRequestHook = (req: Request) => Request | false | Promise<Request | false>;
|
|
29
|
-
type AfterResponseHook = (res: Response) => Response | false | Promise<Response | false>;
|
|
30
|
-
type AfterGenerateHook = (result: ToSSGResult, fsModule: FileSystemModule, options?: ToSSGOptions) => void | Promise<void>;
|
|
31
|
-
declare const combineBeforeRequestHooks: (hooks: BeforeRequestHook | BeforeRequestHook[]) => BeforeRequestHook;
|
|
32
|
-
declare const combineAfterResponseHooks: (hooks: AfterResponseHook | AfterResponseHook[]) => AfterResponseHook;
|
|
33
|
-
declare const combineAfterGenerateHooks: (hooks: AfterGenerateHook | AfterGenerateHook[], fsModule: FileSystemModule, options?: ToSSGOptions) => AfterGenerateHook;
|
|
34
|
-
interface SSGPlugin {
|
|
35
|
-
beforeRequestHook?: BeforeRequestHook | BeforeRequestHook[];
|
|
36
|
-
afterResponseHook?: AfterResponseHook | AfterResponseHook[];
|
|
37
|
-
afterGenerateHook?: AfterGenerateHook | AfterGenerateHook[];
|
|
38
|
-
}
|
|
39
|
-
interface ToSSGOptions {
|
|
40
|
-
dir?: string;
|
|
41
|
-
/**
|
|
42
|
-
* @deprecated Use plugins[].beforeRequestHook instead.
|
|
43
|
-
*/
|
|
44
|
-
beforeRequestHook?: BeforeRequestHook | BeforeRequestHook[];
|
|
45
|
-
/**
|
|
46
|
-
* @deprecated Use plugins[].afterResponseHook instead.
|
|
47
|
-
*/
|
|
48
|
-
afterResponseHook?: AfterResponseHook | AfterResponseHook[];
|
|
49
|
-
/**
|
|
50
|
-
* @deprecated Use plugins[].afterGenerateHook instead.
|
|
51
|
-
*/
|
|
52
|
-
afterGenerateHook?: AfterGenerateHook | AfterGenerateHook[];
|
|
53
|
-
concurrency?: number;
|
|
54
|
-
extensionMap?: Record<string, string>;
|
|
55
|
-
plugins?: SSGPlugin[];
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* @experimental
|
|
59
|
-
* `fetchRoutesContent` is an experimental feature.
|
|
60
|
-
* The API might be changed.
|
|
61
|
-
*/
|
|
62
|
-
declare const fetchRoutesContent: <E extends Env = Env, S extends Schema = {}, BasePath extends string = "/">(app: Acryl<E, S, BasePath>, beforeRequestHook?: BeforeRequestHook, afterResponseHook?: AfterResponseHook, concurrency?: number) => Generator<Promise<Generator<Promise<{
|
|
63
|
-
routePath: string;
|
|
64
|
-
mimeType: string;
|
|
65
|
-
content: string | ArrayBuffer;
|
|
66
|
-
} | undefined>> | undefined>>;
|
|
67
|
-
declare const saveContentToFile: (data: Promise<{
|
|
68
|
-
routePath: string;
|
|
69
|
-
content: string | ArrayBuffer;
|
|
70
|
-
mimeType: string;
|
|
71
|
-
} | undefined>, fsModule: FileSystemModule, outDir: string, extensionMap?: Record<string, string>) => Promise<string | undefined>;
|
|
72
|
-
/**
|
|
73
|
-
* @experimental
|
|
74
|
-
* `ToSSGInterface` is an experimental feature.
|
|
75
|
-
* The API might be changed.
|
|
76
|
-
*/
|
|
77
|
-
interface ToSSGInterface {
|
|
78
|
-
(app: Acryl<any, any, any>, fsModule: FileSystemModule, options?: ToSSGOptions): Promise<ToSSGResult>;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* @experimental
|
|
82
|
-
* `ToSSGAdaptorInterface` is an experimental feature.
|
|
83
|
-
* The API might be changed.
|
|
84
|
-
*/
|
|
85
|
-
interface ToSSGAdaptorInterface<E extends Env = Env, S extends Schema = {}, BasePath extends string = '/'> {
|
|
86
|
-
(app: Acryl<E, S, BasePath>, options?: ToSSGOptions): Promise<ToSSGResult>;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* @experimental
|
|
90
|
-
* `toSSG` is an experimental feature.
|
|
91
|
-
* The API might be changed.
|
|
92
|
-
*/
|
|
93
|
-
declare const toSSG: ToSSGInterface;
|
|
94
|
-
//#endregion
|
|
95
|
-
//#region ../../plugins/acryl-router/src/core/helper/ssg/middleware.d.ts
|
|
96
|
-
declare const X_ACRYL_DISABLE_SSG_HEADER_KEY = "x-acryl-disable-ssg";
|
|
97
|
-
interface SSGParam {
|
|
98
|
-
[key: string]: string;
|
|
99
|
-
}
|
|
100
|
-
type SSGParams = SSGParam[];
|
|
101
|
-
interface SSGParamsMiddleware {
|
|
102
|
-
<E extends Env = Env>(generateParams: (c: Context<E>) => SSGParams | Promise<SSGParams>): MiddlewareHandler<E>;
|
|
103
|
-
<E extends Env = Env>(params: SSGParams): MiddlewareHandler<E>;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Define SSG Route
|
|
107
|
-
*/
|
|
108
|
-
declare const ssgParams: SSGParamsMiddleware;
|
|
109
|
-
/**
|
|
110
|
-
* @experimental
|
|
111
|
-
* `isSSGContext` is an experimental feature.
|
|
112
|
-
* The API might be changed.
|
|
113
|
-
*/
|
|
114
|
-
declare const isSSGContext: (c: Context) => boolean;
|
|
115
|
-
/**
|
|
116
|
-
* @experimental
|
|
117
|
-
* `disableSSG` is an experimental feature.
|
|
118
|
-
* The API might be changed.
|
|
119
|
-
*/
|
|
120
|
-
declare const disableSSG: () => MiddlewareHandler;
|
|
121
|
-
/**
|
|
122
|
-
* @experimental
|
|
123
|
-
* `onlySSG` is an experimental feature.
|
|
124
|
-
* The API might be changed.
|
|
125
|
-
*/
|
|
126
|
-
declare const onlySSG: () => MiddlewareHandler;
|
|
127
|
-
//#endregion
|
|
128
|
-
//#region ../../plugins/acryl-router/src/core/helper/ssg/plugins.d.ts
|
|
129
|
-
/**
|
|
130
|
-
* The default plugin that defines the recommended behavior.
|
|
131
|
-
*
|
|
132
|
-
* @experimental
|
|
133
|
-
* `defaultPlugin` is an experimental feature.
|
|
134
|
-
* The API might be changed.
|
|
135
|
-
*/
|
|
136
|
-
declare const defaultPlugin: () => SSGPlugin;
|
|
137
|
-
/**
|
|
138
|
-
* The redirect plugin that generates HTML redirect pages for HTTP redirect responses for status codes 301, 302, 303, 307 and 308.
|
|
139
|
-
*
|
|
140
|
-
* When used with `defaultPlugin`, place `redirectPlugin` before it, because `defaultPlugin` skips non-200 responses.
|
|
141
|
-
*
|
|
142
|
-
* ```ts
|
|
143
|
-
* // ✅ Will work as expected
|
|
144
|
-
* toSSG(app, fs, { plugins: [redirectPlugin(), defaultPlugin()] })
|
|
145
|
-
*
|
|
146
|
-
* // ❌ Will not work as expected
|
|
147
|
-
* toSSG(app, fs, { plugins: [defaultPlugin(), redirectPlugin()] })
|
|
148
|
-
* ```
|
|
149
|
-
*
|
|
150
|
-
* @experimental
|
|
151
|
-
* `redirectPlugin` is an experimental feature.
|
|
152
|
-
* The API might be changed.
|
|
153
|
-
*/
|
|
154
|
-
declare const redirectPlugin: () => SSGPlugin;
|
|
155
|
-
//#endregion
|
|
1
|
+
import { C as saveContentToFile, S as fetchRoutesContent, _ as ToSSGResult, a as isSSGContext, b as combineBeforeRequestHooks, c as AfterGenerateHook, d as DEFAULT_OUTPUT_DIR, f as FileSystemModule, g as ToSSGOptions, h as ToSSGInterface, i as disableSSG, l as AfterResponseHook, m as ToSSGAdaptorInterface, n as redirectPlugin, o as onlySSG, p as SSGPlugin, r as X_ACRYL_DISABLE_SSG_HEADER_KEY, s as ssgParams, t as defaultPlugin, u as BeforeRequestHook, v as combineAfterGenerateHooks, w as toSSG, x as defaultExtensionMap, y as combineAfterResponseHooks } from "./index-DaJtL7ci.js";
|
|
156
2
|
export { AfterGenerateHook, AfterResponseHook, BeforeRequestHook, DEFAULT_OUTPUT_DIR, FileSystemModule, SSGPlugin, ToSSGAdaptorInterface, ToSSGInterface, ToSSGOptions, ToSSGResult, X_ACRYL_DISABLE_SSG_HEADER_KEY, combineAfterGenerateHooks, combineAfterResponseHooks, combineBeforeRequestHooks, defaultExtensionMap, defaultPlugin, disableSSG, fetchRoutesContent, isSSGContext, onlySSG, redirectPlugin, saveContentToFile, ssgParams, toSSG };
|
package/lib/vercel.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
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/vercel/handler.d.ts
|
|
5
|
+
declare const handle: (app: Acryl<any, any, any>) => (req: Request) => Response | Promise<Response>;
|
|
6
|
+
//#endregion
|
|
7
|
+
//#region ../../plugins/acryl-router/src/core/adapter/vercel/conninfo.d.ts
|
|
8
|
+
declare const getConnInfo: GetConnInfo;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { getConnInfo, handle };
|
package/lib/vercel.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/adapter/vercel/handler.ts
|
|
2
|
+
const handle = (app) => (req) => {
|
|
3
|
+
return app.fetch(req);
|
|
4
|
+
};
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region ../../plugins/acryl-router/src/core/adapter/vercel/conninfo.ts
|
|
7
|
+
const getConnInfo = (c) => ({ remote: { address: c.req.header("x-real-ip") } });
|
|
8
|
+
//#endregion
|
|
9
|
+
export { getConnInfo, handle };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "acrylblends",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.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",
|
|
@@ -190,6 +190,38 @@
|
|
|
190
190
|
"types": "./lib/testing.d.ts",
|
|
191
191
|
"default": "./lib/testing.js"
|
|
192
192
|
},
|
|
193
|
+
"./aws-lambda": {
|
|
194
|
+
"types": "./lib/aws-lambda.d.ts",
|
|
195
|
+
"default": "./lib/aws-lambda.js"
|
|
196
|
+
},
|
|
197
|
+
"./bun": {
|
|
198
|
+
"types": "./lib/bun.d.ts",
|
|
199
|
+
"default": "./lib/bun.js"
|
|
200
|
+
},
|
|
201
|
+
"./cloudflare-pages": {
|
|
202
|
+
"types": "./lib/cloudflare-pages.d.ts",
|
|
203
|
+
"default": "./lib/cloudflare-pages.js"
|
|
204
|
+
},
|
|
205
|
+
"./cloudflare-workers": {
|
|
206
|
+
"types": "./lib/cloudflare-workers.d.ts",
|
|
207
|
+
"default": "./lib/cloudflare-workers.js"
|
|
208
|
+
},
|
|
209
|
+
"./lambda-edge": {
|
|
210
|
+
"types": "./lib/lambda-edge.d.ts",
|
|
211
|
+
"default": "./lib/lambda-edge.js"
|
|
212
|
+
},
|
|
213
|
+
"./netlify": {
|
|
214
|
+
"types": "./lib/netlify.d.ts",
|
|
215
|
+
"default": "./lib/netlify.js"
|
|
216
|
+
},
|
|
217
|
+
"./service-worker": {
|
|
218
|
+
"types": "./lib/service-worker.d.ts",
|
|
219
|
+
"default": "./lib/service-worker.js"
|
|
220
|
+
},
|
|
221
|
+
"./vercel": {
|
|
222
|
+
"types": "./lib/vercel.d.ts",
|
|
223
|
+
"default": "./lib/vercel.js"
|
|
224
|
+
},
|
|
193
225
|
"./ws": {
|
|
194
226
|
"types": "./lib/ws.d.ts",
|
|
195
227
|
"default": "./lib/ws.js"
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Context } from '../../context.ts'
|
|
2
|
+
import type { GetConnInfo } from '../../helper/conninfo/index.ts'
|
|
3
|
+
import type {
|
|
4
|
+
ApiGatewayRequestContext,
|
|
5
|
+
ApiGatewayRequestContextV2,
|
|
6
|
+
ALBRequestContext,
|
|
7
|
+
} from './types.ts'
|
|
8
|
+
|
|
9
|
+
type LambdaRequestContext =
|
|
10
|
+
| ApiGatewayRequestContext
|
|
11
|
+
| ApiGatewayRequestContextV2
|
|
12
|
+
| ALBRequestContext
|
|
13
|
+
|
|
14
|
+
type Env = {
|
|
15
|
+
Bindings: {
|
|
16
|
+
requestContext: LambdaRequestContext
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get connection information from AWS Lambda
|
|
22
|
+
*
|
|
23
|
+
* Extracts client IP from various Lambda event sources:
|
|
24
|
+
* - API Gateway v1 (REST API): requestContext.identity.sourceIp
|
|
25
|
+
* - API Gateway v2 (HTTP API/Function URLs): requestContext.http.sourceIp
|
|
26
|
+
* - ALB: Falls back to x-forwarded-for header
|
|
27
|
+
*
|
|
28
|
+
* @param c - Context
|
|
29
|
+
* @returns Connection information including remote address
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { Acryl } from 'acrylblends'
|
|
33
|
+
* import { handle, getConnInfo } from 'acrylblends/aws-lambda'
|
|
34
|
+
*
|
|
35
|
+
* const app = new Acryl()
|
|
36
|
+
*
|
|
37
|
+
* app.get('/', (c) => {
|
|
38
|
+
* const info = getConnInfo(c)
|
|
39
|
+
* return c.text(`Your IP: ${info.remote.address}`)
|
|
40
|
+
* })
|
|
41
|
+
*
|
|
42
|
+
* export const handler = handle(app)
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export const getConnInfo: GetConnInfo = (c: Context<Env>) => {
|
|
46
|
+
const requestContext = c.env.requestContext
|
|
47
|
+
|
|
48
|
+
let address: string | undefined
|
|
49
|
+
|
|
50
|
+
// API Gateway v1 - has identity object
|
|
51
|
+
if ('identity' in requestContext && requestContext.identity?.sourceIp) {
|
|
52
|
+
address = requestContext.identity.sourceIp
|
|
53
|
+
}
|
|
54
|
+
// API Gateway v2 - has http object
|
|
55
|
+
else if ('http' in requestContext && requestContext.http?.sourceIp) {
|
|
56
|
+
address = requestContext.http.sourceIp
|
|
57
|
+
}
|
|
58
|
+
// ALB - use X-Forwarded-For header
|
|
59
|
+
else {
|
|
60
|
+
const xff = c.req.header('x-forwarded-for')
|
|
61
|
+
if (xff) {
|
|
62
|
+
const ips = xff.split(',')
|
|
63
|
+
// ALB appends the real client IP to the end of the header
|
|
64
|
+
address = ips[ips.length - 1].trim()
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
remote: {
|
|
70
|
+
address,
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
}
|