alchemy 0.1.12 → 0.1.14
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 +12 -2
- package/lib/$.d.ts +12 -0
- package/lib/$.d.ts.map +1 -0
- package/lib/$.js +42 -0
- package/lib/$.js.map +1 -0
- package/lib/alchemize.d.ts.map +1 -1
- package/lib/alchemize.js +7 -0
- package/lib/alchemize.js.map +1 -1
- package/lib/apply.d.ts +2 -2
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +1 -1
- package/lib/apply.js.map +1 -1
- package/lib/aws/account-id.d.ts +5 -0
- package/lib/aws/account-id.d.ts.map +1 -0
- package/lib/aws/account-id.js +10 -0
- package/lib/aws/account-id.js.map +1 -0
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.d.ts.map +1 -1
- package/lib/aws/index.js +1 -0
- package/lib/aws/index.js.map +1 -1
- package/lib/aws/oidc/github-oidc-provider.d.ts +11 -0
- package/lib/aws/oidc/github-oidc-provider.d.ts.map +1 -0
- package/lib/aws/oidc/github-oidc-provider.js +22 -0
- package/lib/aws/oidc/github-oidc-provider.js.map +1 -0
- package/lib/aws/oidc/index.d.ts +3 -0
- package/lib/aws/oidc/index.d.ts.map +1 -0
- package/lib/aws/oidc/index.js +3 -0
- package/lib/aws/oidc/index.js.map +1 -0
- package/lib/aws/oidc/oidc-provider.d.ts +60 -0
- package/lib/aws/oidc/oidc-provider.d.ts.map +1 -0
- package/lib/aws/oidc/oidc-provider.js +140 -0
- package/lib/aws/oidc/oidc-provider.js.map +1 -0
- package/lib/aws/queue.d.ts +24 -0
- package/lib/aws/queue.d.ts.map +1 -1
- package/lib/aws/queue.js +6 -1
- package/lib/aws/queue.js.map +1 -1
- package/lib/aws/role.d.ts.map +1 -1
- package/lib/aws/role.js +49 -1
- package/lib/aws/role.js.map +1 -1
- package/lib/aws/ses.d.ts.map +1 -1
- package/lib/aws/ses.js +20 -28
- package/lib/aws/ses.js.map +1 -1
- package/lib/aws/table.d.ts.map +1 -1
- package/lib/aws/table.js +95 -73
- package/lib/aws/table.js.map +1 -1
- package/lib/cloudflare/api.d.ts +4 -0
- package/lib/cloudflare/api.d.ts.map +1 -1
- package/lib/cloudflare/api.js +6 -0
- package/lib/cloudflare/api.js.map +1 -1
- package/lib/cloudflare/bindings.d.ts +19 -4
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bindings.js +0 -5
- package/lib/cloudflare/bindings.js.map +1 -1
- package/lib/cloudflare/durable-object-namespace.d.ts +20 -0
- package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -0
- package/lib/cloudflare/durable-object-namespace.js +21 -0
- package/lib/cloudflare/durable-object-namespace.js.map +1 -0
- package/lib/cloudflare/index.d.ts +1 -0
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +1 -0
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/kv-namespace.d.ts +3 -0
- package/lib/cloudflare/kv-namespace.d.ts.map +1 -1
- package/lib/cloudflare/kv-namespace.js +5 -1
- package/lib/cloudflare/kv-namespace.js.map +1 -1
- package/lib/cloudflare/static-site-router.d.ts +11 -2
- package/lib/cloudflare/static-site-router.d.ts.map +1 -1
- package/lib/cloudflare/static-site-router.js +98 -76
- package/lib/cloudflare/static-site-router.js.map +1 -1
- package/lib/cloudflare/static-site.d.ts +15 -15
- package/lib/cloudflare/static-site.d.ts.map +1 -1
- package/lib/cloudflare/static-site.js +45 -47
- package/lib/cloudflare/static-site.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts +130 -0
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -0
- package/lib/cloudflare/worker-metadata.js +2 -0
- package/lib/cloudflare/worker-metadata.js.map +1 -0
- package/lib/cloudflare/worker-migration.d.ts +110 -0
- package/lib/cloudflare/worker-migration.d.ts.map +1 -0
- package/lib/cloudflare/worker-migration.js +11 -0
- package/lib/cloudflare/worker-migration.js.map +1 -0
- package/lib/cloudflare/worker.d.ts +34 -13
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +341 -321
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/destroy.d.ts +1 -1
- package/lib/destroy.d.ts.map +1 -1
- package/lib/destroy.js +2 -1
- package/lib/destroy.js.map +1 -1
- package/lib/esbuild.d.ts +1 -1
- package/lib/esbuild.d.ts.map +1 -1
- package/lib/esbuild.js +3 -1
- package/lib/esbuild.js.map +1 -1
- package/lib/github/client.d.ts +34 -0
- package/lib/github/client.d.ts.map +1 -0
- package/lib/github/client.js +91 -0
- package/lib/github/client.js.map +1 -0
- package/lib/github/index.d.ts +2 -0
- package/lib/github/index.d.ts.map +1 -0
- package/lib/github/index.js +2 -0
- package/lib/github/index.js.map +1 -0
- package/lib/github/secret.d.ts +46 -0
- package/lib/github/secret.d.ts.map +1 -0
- package/lib/github/secret.js +103 -0
- package/lib/github/secret.js.map +1 -0
- package/lib/global.d.ts +0 -2
- package/lib/global.d.ts.map +1 -1
- package/lib/global.js +0 -2
- package/lib/global.js.map +1 -1
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/output.d.ts +4 -3
- package/lib/output.d.ts.map +1 -1
- package/lib/output.js +10 -3
- package/lib/output.js.map +1 -1
- package/lib/print.d.ts +7 -0
- package/lib/print.d.ts.map +1 -0
- package/lib/print.js +10 -0
- package/lib/print.js.map +1 -0
- package/lib/resource.d.ts +8 -4
- package/lib/resource.d.ts.map +1 -1
- package/lib/resource.js +125 -91
- package/lib/resource.js.map +1 -1
- package/lib/scope.d.ts +3 -0
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +4 -12
- package/lib/scope.js.map +1 -1
- package/lib/utils/retry.d.ts +13 -0
- package/lib/utils/retry.d.ts.map +1 -0
- package/lib/utils/retry.js +31 -0
- package/lib/utils/retry.js.map +1 -0
- package/package.json +12 -3
- package/src/$.ts +69 -0
- package/src/alchemize.ts +12 -0
- package/src/apply.ts +4 -4
- package/src/aws/account-id.ts +11 -0
- package/src/aws/index.ts +1 -0
- package/src/aws/oidc/github-oidc-provider.ts +34 -0
- package/src/aws/oidc/index.ts +2 -0
- package/src/aws/oidc/oidc-provider.ts +253 -0
- package/src/aws/queue.ts +23 -1
- package/src/aws/role.ts +69 -0
- package/src/aws/ses.ts +27 -31
- package/src/aws/table.ts +113 -82
- package/src/cloudflare/api.ts +6 -0
- package/src/cloudflare/bindings.ts +43 -26
- package/src/cloudflare/durable-object-namespace.ts +37 -0
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/kv-namespace.ts +12 -1
- package/src/cloudflare/static-site-router.ts +124 -82
- package/src/cloudflare/static-site.ts +66 -69
- package/src/cloudflare/worker-metadata.ts +154 -0
- package/src/cloudflare/worker-migration.ts +145 -0
- package/src/cloudflare/worker.ts +557 -429
- package/src/destroy.ts +2 -2
- package/src/esbuild.ts +3 -0
- package/src/github/client.ts +115 -0
- package/src/github/index.ts +1 -0
- package/src/github/secret.ts +172 -0
- package/src/global.ts +0 -3
- package/src/index.ts +2 -1
- package/src/output.ts +24 -8
- package/src/print.ts +18 -0
- package/src/resource.ts +156 -115
- package/src/scope.ts +7 -12
- package/src/utils/retry.ts +36 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Resolved } from "../output";
|
|
2
|
+
export interface DurableObjectNamespaceInput {
|
|
3
|
+
className: string;
|
|
4
|
+
scriptName?: string | undefined;
|
|
5
|
+
environment?: string | undefined;
|
|
6
|
+
sqlite?: boolean | undefined;
|
|
7
|
+
namespaceId?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export declare function isDurableObjectNamespace(binding: any): binding is Resolved<DurableObjectNamespace>;
|
|
10
|
+
export declare class DurableObjectNamespace implements DurableObjectNamespaceInput {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly type: "durable_object_namespace";
|
|
13
|
+
readonly className: string;
|
|
14
|
+
readonly scriptName?: string | undefined;
|
|
15
|
+
readonly environment?: string | undefined;
|
|
16
|
+
readonly sqlite?: boolean | undefined;
|
|
17
|
+
readonly namespaceId?: string | undefined;
|
|
18
|
+
constructor(id: string, input: DurableObjectNamespaceInput);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=durable-object-namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-object-namespace.d.ts","sourceRoot":"","sources":["../../src/cloudflare/durable-object-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,GAAG,GACX,OAAO,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAI7C;AAED,qBAAa,sBAAuB,YAAW,2BAA2B;aAUtD,EAAE,EAAE,MAAM;IAT5B,SAAgB,IAAI,EAAG,0BAA0B,CAAU;IAE3D,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,SAAgB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,SAAgB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7C,SAAgB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAG/B,EAAE,EAAE,MAAM,EAC1B,KAAK,EAAE,2BAA2B;CAOrC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function isDurableObjectNamespace(binding) {
|
|
2
|
+
return (typeof binding === "object" && binding.type === "durable_object_namespace");
|
|
3
|
+
}
|
|
4
|
+
export class DurableObjectNamespace {
|
|
5
|
+
id;
|
|
6
|
+
type = "durable_object_namespace";
|
|
7
|
+
// alias for bindingName to be consistent with other bindings
|
|
8
|
+
className;
|
|
9
|
+
scriptName;
|
|
10
|
+
environment;
|
|
11
|
+
sqlite;
|
|
12
|
+
namespaceId;
|
|
13
|
+
constructor(id, input) {
|
|
14
|
+
this.id = id;
|
|
15
|
+
this.className = input.className;
|
|
16
|
+
this.scriptName = input.scriptName;
|
|
17
|
+
this.environment = input.environment;
|
|
18
|
+
this.sqlite = input.sqlite;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=durable-object-namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-object-namespace.js","sourceRoot":"","sources":["../../src/cloudflare/durable-object-namespace.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,wBAAwB,CACtC,OAAY;IAEZ,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,0BAA0B,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,sBAAsB;IAUf;IATF,IAAI,GAAG,0BAAmC,CAAC;IAC3D,6DAA6D;IAC7C,SAAS,CAAS;IAClB,UAAU,CAAsB;IAChC,WAAW,CAAsB;IACjC,MAAM,CAAuB;IAC7B,WAAW,CAAsB;IAEjD,YACkB,EAAU,EAC1B,KAAkC;QADlB,OAAE,GAAF,EAAE,CAAQ;QAG1B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
|
package/lib/cloudflare/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cloudflare/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Resolved } from "../output";
|
|
1
2
|
/**
|
|
2
3
|
* Properties for creating or updating a KV Namespace
|
|
3
4
|
*/
|
|
@@ -41,6 +42,7 @@ export interface KVPair {
|
|
|
41
42
|
* Output returned after KV Namespace creation/update
|
|
42
43
|
*/
|
|
43
44
|
export interface KVNamespaceOutput extends KVNamespaceProps {
|
|
45
|
+
type: "kv_namespace";
|
|
44
46
|
/**
|
|
45
47
|
* The ID of the namespace
|
|
46
48
|
*/
|
|
@@ -54,6 +56,7 @@ export interface KVNamespaceOutput extends KVNamespaceProps {
|
|
|
54
56
|
*/
|
|
55
57
|
modifiedAt: number;
|
|
56
58
|
}
|
|
59
|
+
export declare function isKVNamespace(resource: any): resource is Resolved<KVNamespace>;
|
|
57
60
|
declare const KVNamespace_base: import("../resource").Provider<"cloudflare::KVNamespace", [props: KVNamespaceProps], KVNamespaceOutput>;
|
|
58
61
|
export declare class KVNamespace extends KVNamespace_base {
|
|
59
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../../src/cloudflare/kv-namespace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../../src/cloudflare/kv-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAEvB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,cAAc,CAAC;IACrB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,GAAG,GACZ,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,CAInC;;AAED,qBAAa,WAAY,SAAQ,gBA8HhC;CAAG"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { Resource } from "../resource";
|
|
2
2
|
import { createCloudflareApi } from "./api";
|
|
3
|
+
export function isKVNamespace(resource) {
|
|
4
|
+
return (resource && typeof resource === "object" && resource.type === "kv_namespace");
|
|
5
|
+
}
|
|
3
6
|
export class KVNamespace extends Resource("cloudflare::KVNamespace", async (ctx, props) => {
|
|
4
7
|
// Create Cloudflare API client with automatic account discovery
|
|
5
8
|
const api = await createCloudflareApi();
|
|
@@ -38,7 +41,7 @@ export class KVNamespace extends Resource("cloudflare::KVNamespace", async (ctx,
|
|
|
38
41
|
const errorData = await createResponse.json().catch(() => ({
|
|
39
42
|
errors: [{ message: createResponse.statusText }],
|
|
40
43
|
}));
|
|
41
|
-
throw new Error(`Error creating KV namespace: ${errorData.errors?.[0]?.message || createResponse.statusText}`);
|
|
44
|
+
throw new Error(`Error creating KV namespace '${props.title}': ${errorData.errors?.[0]?.message || createResponse.statusText}`);
|
|
42
45
|
}
|
|
43
46
|
const createResult = await createResponse.json();
|
|
44
47
|
namespaceId = createResult.result.id;
|
|
@@ -80,6 +83,7 @@ export class KVNamespace extends Resource("cloudflare::KVNamespace", async (ctx,
|
|
|
80
83
|
const now = Date.now();
|
|
81
84
|
// Construct the output
|
|
82
85
|
const output = {
|
|
86
|
+
type: "kv_namespace",
|
|
83
87
|
id: namespaceId,
|
|
84
88
|
title: props.title,
|
|
85
89
|
values: props.values,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv-namespace.js","sourceRoot":"","sources":["../../src/cloudflare/kv-namespace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kv-namespace.js","sourceRoot":"","sources":["../../src/cloudflare/kv-namespace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type Env = {
|
|
2
2
|
ASSETS: KVNamespace;
|
|
3
3
|
INDEX_PAGE: string;
|
|
4
4
|
ERROR_PAGE?: string;
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Optional backend worker bound to this static site
|
|
7
|
+
* Used to handle requests that don't match any static files
|
|
8
|
+
*/
|
|
9
|
+
BACKEND_WORKER?: Service;
|
|
10
|
+
} & {
|
|
11
|
+
[key in `ROUTE_${string}`]: Service;
|
|
12
|
+
} & {
|
|
13
|
+
[key in `__ROUTE_${string}`]: string;
|
|
14
|
+
};
|
|
6
15
|
declare const _default: {
|
|
7
16
|
fetch(request: Request, env: Env): Promise<Response>;
|
|
8
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-site-router.d.ts","sourceRoot":"","sources":["../../src/cloudflare/static-site-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"static-site-router.d.ts","sourceRoot":"","sources":["../../src/cloudflare/static-site-router.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,GAAG,GAAG;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG;KAED,GAAG,IAAI,SAAS,MAAM,EAAE,GAAG,OAAO;CACpC,GAAG;KAED,GAAG,IAAI,WAAW,MAAM,EAAE,GAAG,MAAM;CACrC,CAAC;;mBAMqB,OAAO,OAAO,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAD5D,wBAqBE"}
|
|
@@ -1,88 +1,110 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
let isInit = false;
|
|
3
|
+
const app = new Hono();
|
|
1
4
|
export default {
|
|
2
5
|
async fetch(request, env) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
if (!isInit) {
|
|
7
|
+
isInit = true;
|
|
8
|
+
for (const [key, value] of Object.entries(env)) {
|
|
9
|
+
if (key.startsWith("ROUTE_")) {
|
|
10
|
+
console.log(key, value);
|
|
11
|
+
const service = value;
|
|
12
|
+
const patternKey = `__${key}`;
|
|
13
|
+
if (!(patternKey in env)) {
|
|
14
|
+
throw new Error(`Missing pattern key: ${patternKey}`);
|
|
15
|
+
}
|
|
16
|
+
const pattern = env[`__${key}`];
|
|
17
|
+
console.log("pattern", pattern);
|
|
18
|
+
// TODO(sam): we should support narrowing down METHOD
|
|
19
|
+
app.all(pattern, (ctx) => service.fetch(ctx.req.raw));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
16
22
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
return app.fetch(request, env);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
// fall back to assuming the request is a static file
|
|
27
|
+
app.notFound(async (ctx) => {
|
|
28
|
+
console.log("not found");
|
|
29
|
+
const request = ctx.req;
|
|
30
|
+
const env = ctx.env;
|
|
31
|
+
const url = new URL(request.url);
|
|
32
|
+
const pathname = url.pathname.replace(/^\//, "");
|
|
33
|
+
const filePath = pathname === "" ? env.INDEX_PAGE : pathname;
|
|
34
|
+
// Return from cache if available
|
|
35
|
+
const cachedResponse = await lookupCache();
|
|
36
|
+
if (cachedResponse) {
|
|
37
|
+
return cachedResponse;
|
|
38
|
+
}
|
|
39
|
+
// Fetch from KV
|
|
40
|
+
{
|
|
41
|
+
const object = await env.ASSETS.getWithMetadata(filePath);
|
|
42
|
+
if (object.value) {
|
|
43
|
+
return await respond(200, filePath, object);
|
|
22
44
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
45
|
+
}
|
|
46
|
+
{
|
|
47
|
+
const guess = filePath + (filePath.endsWith("/") ? "" : "/") + "index.html";
|
|
48
|
+
const object = await env.ASSETS.getWithMetadata(guess);
|
|
49
|
+
if (object.value) {
|
|
50
|
+
return await respond(200, guess, object);
|
|
28
51
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
52
|
+
}
|
|
53
|
+
{
|
|
54
|
+
const guess = filePath + ".html";
|
|
55
|
+
const object = await env.ASSETS.getWithMetadata(guess);
|
|
56
|
+
if (object.value) {
|
|
57
|
+
return await respond(200, guess, object);
|
|
34
58
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
59
|
+
}
|
|
60
|
+
// Handle error page
|
|
61
|
+
if (env.ERROR_PAGE) {
|
|
62
|
+
const object = await env.ASSETS.getWithMetadata(env.ERROR_PAGE);
|
|
63
|
+
if (object.value) {
|
|
64
|
+
return await respond(404, env.ERROR_PAGE, object);
|
|
39
65
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// cache does not exist
|
|
46
|
-
if (!r)
|
|
47
|
-
return;
|
|
48
|
-
// cache exists but etag does not match
|
|
49
|
-
if (r.headers.get("etag") !== __ASSET_MANIFEST__[filePath])
|
|
50
|
-
return;
|
|
51
|
-
// cache exists
|
|
52
|
-
return r;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const object = await env.ASSETS.getWithMetadata(env.INDEX_PAGE);
|
|
69
|
+
if (object.value) {
|
|
70
|
+
return await respond(200, env.INDEX_PAGE, object);
|
|
53
71
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
72
|
+
}
|
|
73
|
+
return new Response("Page Not Found", { status: 404 });
|
|
74
|
+
async function lookupCache() {
|
|
75
|
+
const cache = caches.default;
|
|
76
|
+
const r = await cache.match(request.url);
|
|
77
|
+
// cache does not exist
|
|
78
|
+
if (!r)
|
|
79
|
+
return;
|
|
80
|
+
// cache exists but etag does not match
|
|
81
|
+
if (r.headers.get("etag") !== __ASSET_MANIFEST__[filePath])
|
|
82
|
+
return;
|
|
83
|
+
// cache exists
|
|
84
|
+
return r;
|
|
85
|
+
}
|
|
86
|
+
async function saveCache(response) {
|
|
87
|
+
const cache = caches.default;
|
|
88
|
+
await cache.put(request.url, response.clone());
|
|
89
|
+
}
|
|
90
|
+
async function respond(status, filePath, object) {
|
|
91
|
+
// build response
|
|
92
|
+
const headers = new Headers();
|
|
93
|
+
if (__ASSET_MANIFEST__[filePath]) {
|
|
94
|
+
headers.set("etag", __ASSET_MANIFEST__[filePath]);
|
|
95
|
+
headers.set("content-type", object.metadata.contentType);
|
|
96
|
+
headers.set("cache-control", object.metadata.cacheControl);
|
|
57
97
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
// TODO: do we need base64 encoded here?
|
|
67
|
-
// const response = new Response(base64ToArrayBuffer(object.value), {
|
|
68
|
-
const response = new Response(object.value, {
|
|
69
|
-
status,
|
|
70
|
-
headers,
|
|
71
|
-
});
|
|
72
|
-
if (request.method === "GET") {
|
|
73
|
-
await saveCache(response);
|
|
74
|
-
}
|
|
75
|
-
return response;
|
|
98
|
+
// TODO: do we need base64 encoded here?
|
|
99
|
+
// const response = new Response(base64ToArrayBuffer(object.value), {
|
|
100
|
+
const response = new Response(object.value, {
|
|
101
|
+
status,
|
|
102
|
+
headers,
|
|
103
|
+
});
|
|
104
|
+
if (request.method === "GET") {
|
|
105
|
+
await saveCache(response);
|
|
76
106
|
}
|
|
77
|
-
|
|
78
|
-
};
|
|
79
|
-
function base64ToArrayBuffer(base64) {
|
|
80
|
-
const binaryString = atob(base64);
|
|
81
|
-
const len = binaryString.length;
|
|
82
|
-
const bytes = new Uint8Array(len);
|
|
83
|
-
for (let i = 0; i < len; i++) {
|
|
84
|
-
bytes[i] = binaryString.charCodeAt(i);
|
|
107
|
+
return response;
|
|
85
108
|
}
|
|
86
|
-
|
|
87
|
-
}
|
|
109
|
+
});
|
|
88
110
|
//# sourceMappingURL=static-site-router.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-site-router.js","sourceRoot":"","sources":["../../src/cloudflare/static-site-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"static-site-router.js","sourceRoot":"","sources":["../../src/cloudflare/static-site-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BundleProps } from "../esbuild";
|
|
2
|
-
import
|
|
2
|
+
import { Worker } from "./worker";
|
|
3
3
|
/**
|
|
4
4
|
* Idea of using KV with timeout inspired by SST: https://github.com/sst/sst/blob/dev/platform/src/components/cloudflare/static-site.ts
|
|
5
5
|
*/
|
|
@@ -16,11 +16,6 @@ export interface StaticSiteProps {
|
|
|
16
16
|
* Path to the directory containing static assets
|
|
17
17
|
*/
|
|
18
18
|
dir: string;
|
|
19
|
-
/**
|
|
20
|
-
* Routes to associate with this site
|
|
21
|
-
* Format: example.com/* or *.example.com/*
|
|
22
|
-
*/
|
|
23
|
-
routes?: string[];
|
|
24
19
|
/**
|
|
25
20
|
* Custom Worker script to serve the site
|
|
26
21
|
* If not provided, a default script will be used
|
|
@@ -70,10 +65,6 @@ export interface StaticSiteProps {
|
|
|
70
65
|
contentType?: string;
|
|
71
66
|
}[];
|
|
72
67
|
};
|
|
73
|
-
/**
|
|
74
|
-
* Additional Worker bindings to include
|
|
75
|
-
*/
|
|
76
|
-
additionalBindings?: WorkerProps["bindings"];
|
|
77
68
|
/**
|
|
78
69
|
* Whether the site should be deployed to production
|
|
79
70
|
* @default true
|
|
@@ -93,7 +84,16 @@ export interface StaticSiteProps {
|
|
|
93
84
|
*/
|
|
94
85
|
command?: string;
|
|
95
86
|
};
|
|
87
|
+
/**
|
|
88
|
+
* Bundle options for the worker script
|
|
89
|
+
*/
|
|
96
90
|
bundle?: Partial<BundleProps>;
|
|
91
|
+
/**
|
|
92
|
+
* Additional workers to route requests to.
|
|
93
|
+
*/
|
|
94
|
+
routes?: {
|
|
95
|
+
[key: string]: Worker;
|
|
96
|
+
};
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
99
|
* Output returned after StaticSite creation/update
|
|
@@ -115,10 +115,6 @@ export interface StaticSiteOutput {
|
|
|
115
115
|
* Path to the directory containing static assets
|
|
116
116
|
*/
|
|
117
117
|
directory: string;
|
|
118
|
-
/**
|
|
119
|
-
* Routes to associate with this site
|
|
120
|
-
*/
|
|
121
|
-
routes?: string[];
|
|
122
118
|
/**
|
|
123
119
|
* Worker script format
|
|
124
120
|
*/
|
|
@@ -158,8 +154,12 @@ export interface StaticSiteOutput {
|
|
|
158
154
|
* The URL of the deployed site
|
|
159
155
|
*/
|
|
160
156
|
url?: string;
|
|
157
|
+
/**
|
|
158
|
+
* Information about the backend worker if configured
|
|
159
|
+
*/
|
|
160
|
+
routes?: Record<string, string>;
|
|
161
161
|
}
|
|
162
|
-
declare const StaticSite_base: import("../resource").Provider<
|
|
162
|
+
declare const StaticSite_base: import("../resource").Provider<string, [props: StaticSiteProps], StaticSiteOutput>;
|
|
163
163
|
export declare class StaticSite extends StaticSite_base {
|
|
164
164
|
}
|
|
165
165
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-site.d.ts","sourceRoot":"","sources":["../../src/cloudflare/static-site.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"static-site.d.ts","sourceRoot":"","sources":["../../src/cloudflare/static-site.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,WAAW,CAAC,EAAE;YACZ;;;eAGG;YACH,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAEzB;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAE3B;;eAEG;YACH,YAAY,EAAE,MAAM,CAAC;YAErB;;eAEG;YACH,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,EAAE,CAAC;KACL,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,MAAM,CAAC,EACH,MAAM,GACN;QACE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAEN,KAAK,CAAC,EAAE;QACN;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EACH,MAAM,GACN;QACE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAEN;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;;AAED,qBAAa,UAAW,SAAQ,eAqK/B;CAAG"}
|
|
@@ -9,6 +9,7 @@ import { generateAssetManifest } from "./generate-asset-manifest";
|
|
|
9
9
|
import { KVNamespace } from "./kv-namespace";
|
|
10
10
|
import { uploadAssetManifest } from "./upload-asset-manifest";
|
|
11
11
|
import { Worker } from "./worker";
|
|
12
|
+
const __dirname = import.meta.dirname;
|
|
12
13
|
export class StaticSite extends Resource("cloudflare::StaticSite", {
|
|
13
14
|
alwaysUpdate: true,
|
|
14
15
|
}, async (ctx, props) => {
|
|
@@ -37,12 +38,14 @@ export class StaticSite extends Resource("cloudflare::StaticSite", {
|
|
|
37
38
|
// Run build command if provided
|
|
38
39
|
if (props.build?.command) {
|
|
39
40
|
try {
|
|
40
|
-
|
|
41
|
+
if (!ctx.quiet) {
|
|
42
|
+
console.log(props.build.command);
|
|
43
|
+
}
|
|
41
44
|
const execAsync = promisify(exec);
|
|
42
45
|
const { stdout, stderr } = await execAsync(props.build.command, {
|
|
43
46
|
cwd: process.cwd(),
|
|
44
47
|
});
|
|
45
|
-
if (stdout)
|
|
48
|
+
if (stdout && !ctx.quiet)
|
|
46
49
|
console.log(stdout);
|
|
47
50
|
}
|
|
48
51
|
catch (error) {
|
|
@@ -62,80 +65,74 @@ export class StaticSite extends Resource("cloudflare::StaticSite", {
|
|
|
62
65
|
// Create Cloudflare API client with automatic account discovery
|
|
63
66
|
const api = await createCloudflareApi();
|
|
64
67
|
// Step 1: Create or get the KV namespace for assets
|
|
65
|
-
const
|
|
68
|
+
const kv = new KVNamespace("assets", {
|
|
66
69
|
title: `${siteName}-assets`,
|
|
67
70
|
});
|
|
68
71
|
const [{ id: kvNamespaceId }, assetManifest] = await Promise.all([
|
|
69
|
-
apply(
|
|
72
|
+
apply(kv, {
|
|
73
|
+
quiet: ctx.quiet,
|
|
74
|
+
}),
|
|
70
75
|
generateAssetManifest(props.dir),
|
|
71
76
|
]);
|
|
72
77
|
// Step 3: Upload assets to KV
|
|
73
78
|
await uploadAssetManifest(api, kvNamespaceId, assetManifest);
|
|
74
|
-
// Define the worker script path
|
|
75
|
-
const routerScriptPath = path.resolve(__dirname, "static-site-router.ts");
|
|
76
79
|
// Prepare the bindings for the worker
|
|
77
|
-
const bindings =
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
bindings.push({
|
|
92
|
-
name: "ERROR_PAGE",
|
|
93
|
-
type: "plain_text",
|
|
94
|
-
text: props.errorPage,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
// Add any additional bindings
|
|
98
|
-
if (props.additionalBindings) {
|
|
99
|
-
bindings.push(...props.additionalBindings);
|
|
80
|
+
const bindings = {
|
|
81
|
+
ASSETS: kv,
|
|
82
|
+
INDEX_PAGE: indexPage,
|
|
83
|
+
// Add error page binding if specified
|
|
84
|
+
...(props.errorPage ? { ERROR_PAGE: props.errorPage } : {}),
|
|
85
|
+
};
|
|
86
|
+
const routes = {};
|
|
87
|
+
// Create backend worker if configured
|
|
88
|
+
if (props.routes) {
|
|
89
|
+
for (const [path, worker] of Object.entries(props.routes)) {
|
|
90
|
+
// @ts-ignore - TODO: need to use Resolved<Worker> to get the string ...
|
|
91
|
+
routes[path] = worker.id;
|
|
92
|
+
bindings[`ROUTE_${worker.id}`] = worker;
|
|
93
|
+
}
|
|
100
94
|
}
|
|
101
95
|
// Create asset manifest banner for static site router
|
|
102
96
|
const assetManifestBanner = `const __ASSET_MANIFEST__ = ${JSON.stringify(Object.fromEntries(assetManifest.map((item) => [item.key, item.hash])))};\n`;
|
|
97
|
+
const bundleOptions = {
|
|
98
|
+
...props.bundle,
|
|
99
|
+
options: {
|
|
100
|
+
...props.bundle?.options,
|
|
101
|
+
banner: {
|
|
102
|
+
js: assetManifestBanner,
|
|
103
|
+
...props.bundle?.options?.banner,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
};
|
|
103
107
|
const worker = new Worker("worker", {
|
|
104
108
|
name: siteName,
|
|
105
109
|
url: true,
|
|
106
110
|
format: props.format || "esm",
|
|
107
|
-
routes: props.routes || [],
|
|
108
111
|
// If a custom worker script is provided, use it, otherwise use the entrypoint from router
|
|
109
112
|
...(props.workerScript
|
|
110
113
|
? { script: props.workerScript }
|
|
111
114
|
: {
|
|
112
|
-
entrypoint:
|
|
113
|
-
|
|
114
|
-
...props.bundle,
|
|
115
|
-
options: {
|
|
116
|
-
...props.bundle?.options,
|
|
117
|
-
banner: {
|
|
118
|
-
js: assetManifestBanner,
|
|
119
|
-
...props.bundle?.options?.banner,
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
},
|
|
115
|
+
entrypoint: path.resolve(__dirname, "static-site-router.ts"),
|
|
116
|
+
bundle: bundleOptions,
|
|
123
117
|
}),
|
|
124
118
|
bindings,
|
|
119
|
+
env: {
|
|
120
|
+
...Object.fromEntries(Object.entries(routes).map(([key, value]) => [
|
|
121
|
+
`__ROUTE_${value}`,
|
|
122
|
+
key,
|
|
123
|
+
])),
|
|
124
|
+
},
|
|
125
125
|
},
|
|
126
126
|
// place a dependency on the namespace
|
|
127
|
-
|
|
128
|
-
// Step 4: Create or update the worker
|
|
129
|
-
const { id: workerId, url } = await apply(worker);
|
|
127
|
+
kv.id);
|
|
130
128
|
// Get current timestamp
|
|
131
129
|
const now = Date.now();
|
|
132
130
|
// Construct the output
|
|
133
131
|
const output = {
|
|
134
132
|
id: siteName,
|
|
135
|
-
workerId,
|
|
133
|
+
workerId: worker.id,
|
|
136
134
|
name: siteName,
|
|
137
135
|
directory: props.dir,
|
|
138
|
-
routes: props.routes || [],
|
|
139
136
|
format: props.format || "esm",
|
|
140
137
|
errorPage: props.errorPage,
|
|
141
138
|
indexPage,
|
|
@@ -144,7 +141,8 @@ export class StaticSite extends Resource("cloudflare::StaticSite", {
|
|
|
144
141
|
updatedAt: now,
|
|
145
142
|
domain: props.domain,
|
|
146
143
|
production: props.production !== false,
|
|
147
|
-
url,
|
|
144
|
+
url: worker.url,
|
|
145
|
+
routes,
|
|
148
146
|
};
|
|
149
147
|
return output;
|
|
150
148
|
}) {
|