alchemy 0.1.12 → 0.1.13
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/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/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 +14 -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 +23 -0
- package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -0
- package/lib/cloudflare/durable-object-namespace.js +26 -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.js +1 -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 +41 -25
- 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 +29 -11
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +316 -322
- 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/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/package.json +3 -2
- package/src/$.ts +69 -0
- package/src/alchemize.ts +12 -0
- package/src/apply.ts +4 -4
- package/src/cloudflare/api.ts +6 -0
- package/src/cloudflare/bindings.ts +37 -26
- package/src/cloudflare/durable-object-namespace.ts +43 -0
- package/src/cloudflare/index.ts +1 -0
- package/src/cloudflare/kv-namespace.ts +1 -1
- package/src/cloudflare/static-site-router.ts +124 -82
- package/src/cloudflare/static-site.ts +63 -47
- package/src/cloudflare/worker-metadata.ts +154 -0
- package/src/cloudflare/worker-migration.ts +145 -0
- package/src/cloudflare/worker.ts +526 -428
- package/src/destroy.ts +2 -2
- package/src/esbuild.ts +3 -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/lib/resource.js
CHANGED
|
@@ -2,8 +2,10 @@ import { alchemize } from "./alchemize";
|
|
|
2
2
|
import { apply } from "./apply";
|
|
3
3
|
import { defaultStateStore, deletions, providers } from "./global";
|
|
4
4
|
import { OutputChain } from "./output";
|
|
5
|
-
import {
|
|
5
|
+
import { getScope, pushScope } from "./scope";
|
|
6
6
|
export const ResourceID = Symbol.for("ResourceID");
|
|
7
|
+
export const ResourceFQN = Symbol.for("ResourceFQN");
|
|
8
|
+
export const ResourceHandle = Symbol.for("ResourceHandle");
|
|
7
9
|
export const Provider = Symbol.for("Provider");
|
|
8
10
|
export const Input = Symbol.for("Input");
|
|
9
11
|
export const Value = Symbol.for("Value");
|
|
@@ -14,6 +16,8 @@ export const Options = Symbol.for("Options");
|
|
|
14
16
|
// properties that pierce through the Proxy
|
|
15
17
|
const OrthogonalProperties = [
|
|
16
18
|
ResourceID,
|
|
19
|
+
ResourceFQN,
|
|
20
|
+
ResourceHandle,
|
|
17
21
|
Provider,
|
|
18
22
|
Input,
|
|
19
23
|
Value,
|
|
@@ -25,6 +29,9 @@ const OrthogonalProperties = [
|
|
|
25
29
|
export function isResource(value) {
|
|
26
30
|
return value?.[ResourceID] !== undefined;
|
|
27
31
|
}
|
|
32
|
+
const applied = new Map();
|
|
33
|
+
const destroyed = new WeakMap();
|
|
34
|
+
const i = 0;
|
|
28
35
|
export function Resource(type, ...args) {
|
|
29
36
|
if (providers.has(type)) {
|
|
30
37
|
throw new Error(`Resource ${type} already exists`);
|
|
@@ -44,7 +51,11 @@ export function Resource(type, ...args) {
|
|
|
44
51
|
// console.warn(`Resource ${id} already exists in the stack: ${stack.id}`);
|
|
45
52
|
}
|
|
46
53
|
scope.nodes.set(id, node);
|
|
54
|
+
// const resourceFQN = scope.getScopePath(id) + "/" + id;
|
|
47
55
|
this[ResourceID] = id;
|
|
56
|
+
this[ResourceHandle] = new Object();
|
|
57
|
+
// this[ResourceFQN] = resourceFQN;
|
|
58
|
+
// this[ResourceFQN] = i++;
|
|
48
59
|
this[Provider] = Resource;
|
|
49
60
|
this[Input] = input;
|
|
50
61
|
this[Value] = undefined;
|
|
@@ -64,12 +75,18 @@ export function Resource(type, ...args) {
|
|
|
64
75
|
if (OrthogonalProperties.includes(prop)) {
|
|
65
76
|
return target[prop];
|
|
66
77
|
}
|
|
78
|
+
else if (prop === "apply") {
|
|
79
|
+
return target[Apply].bind(target);
|
|
80
|
+
}
|
|
67
81
|
else {
|
|
68
82
|
return target[Apply]((value) => value[prop]);
|
|
69
83
|
}
|
|
70
84
|
},
|
|
71
85
|
});
|
|
72
86
|
}
|
|
87
|
+
apply(fn) {
|
|
88
|
+
return this[Apply](fn);
|
|
89
|
+
}
|
|
73
90
|
[Apply](fn) {
|
|
74
91
|
return new OutputChain(this, fn);
|
|
75
92
|
}
|
|
@@ -98,106 +115,122 @@ export function Resource(type, ...args) {
|
|
|
98
115
|
static async update(stage, resource, deps, inputs, stateStore, options) {
|
|
99
116
|
// const stack = resource[ResourceStack];
|
|
100
117
|
const resourceID = resource[ResourceID];
|
|
101
|
-
let resourceState = await stateStore.get(resourceID);
|
|
102
|
-
if (resourceState === undefined) {
|
|
103
|
-
resourceState = {
|
|
104
|
-
provider: type,
|
|
105
|
-
status: "creating",
|
|
106
|
-
data: {},
|
|
107
|
-
output: undefined,
|
|
108
|
-
deps: [...deps],
|
|
109
|
-
inputs,
|
|
110
|
-
};
|
|
111
|
-
await stateStore.set(resourceID, resourceState);
|
|
112
|
-
}
|
|
113
118
|
const resourceFQN = `${resource[Scope].getScopePath(stage)}/${resourceID}`;
|
|
114
|
-
|
|
115
|
-
if (
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
return resourceState.output;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
const event = resourceState.status === "creating" ? "create" : "update";
|
|
129
|
-
resourceState.status = event === "create" ? "creating" : "updating";
|
|
130
|
-
resourceState.oldInputs = resourceState.inputs;
|
|
131
|
-
resourceState.inputs = inputs;
|
|
132
|
-
if (!options?.quiet) {
|
|
133
|
-
console.log(`${event === "create" ? "Create" : "Update"}: ${resourceFQN}`);
|
|
119
|
+
const cacheKey = resource[ResourceHandle];
|
|
120
|
+
if (!applied.has(cacheKey)) {
|
|
121
|
+
let res, rej;
|
|
122
|
+
const promise = new Promise((resolve, reject) => {
|
|
123
|
+
res = resolve;
|
|
124
|
+
rej = reject;
|
|
125
|
+
});
|
|
126
|
+
applied.set(cacheKey, promise);
|
|
127
|
+
update().then(res).catch(rej);
|
|
128
|
+
return promise;
|
|
134
129
|
}
|
|
135
|
-
await
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
130
|
+
return await applied.get(cacheKey);
|
|
131
|
+
async function update() {
|
|
132
|
+
let resourceState = await stateStore.get(resourceID);
|
|
133
|
+
if (resourceState === undefined) {
|
|
134
|
+
resourceState = {
|
|
135
|
+
provider: type,
|
|
136
|
+
status: "creating",
|
|
137
|
+
data: {},
|
|
138
|
+
output: undefined,
|
|
139
|
+
deps: [...deps],
|
|
140
|
+
inputs,
|
|
141
|
+
};
|
|
142
|
+
await stateStore.set(resourceID, resourceState);
|
|
143
|
+
}
|
|
144
|
+
// Skip update if inputs haven't changed and resource is in a stable state
|
|
145
|
+
if (resourceState.status === "created" ||
|
|
146
|
+
resourceState.status === "updated") {
|
|
147
|
+
if (JSON.stringify(resourceState.inputs) === JSON.stringify(inputs) &&
|
|
148
|
+
!resource[Options].alwaysUpdate) {
|
|
149
|
+
if (!options?.quiet) {
|
|
150
|
+
console.log(`Skip: ${resourceFQN} (no changes)`);
|
|
151
|
+
}
|
|
152
|
+
if (resourceState.output !== undefined) {
|
|
153
|
+
resource[Provide](resourceState.output);
|
|
149
154
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
get: (key) => resourceState.data[key],
|
|
160
|
-
set: async (key, value) => {
|
|
161
|
-
resourceState.data[key] = value;
|
|
162
|
-
await stateStore.set(resourceID, resourceState);
|
|
163
|
-
},
|
|
164
|
-
delete: async (key) => {
|
|
165
|
-
const value = resourceState.data[key];
|
|
166
|
-
delete resourceState.data[key];
|
|
167
|
-
await stateStore.set(resourceID, resourceState);
|
|
168
|
-
return value;
|
|
169
|
-
},
|
|
170
|
-
quiet,
|
|
171
|
-
}, ...inputs);
|
|
172
|
-
if (result === undefined) {
|
|
173
|
-
return undefined;
|
|
155
|
+
return resourceState.output;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const event = resourceState.status === "creating" ? "create" : "update";
|
|
159
|
+
resourceState.status = event === "create" ? "creating" : "updating";
|
|
160
|
+
resourceState.oldInputs = resourceState.inputs;
|
|
161
|
+
resourceState.inputs = inputs;
|
|
162
|
+
if (!options?.quiet) {
|
|
163
|
+
console.log(`${event === "create" ? "Create" : "Update"}: ${resourceFQN}`);
|
|
174
164
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
165
|
+
await stateStore.set(resourceID, resourceState);
|
|
166
|
+
let isReplaced = false;
|
|
167
|
+
const quiet = options.quiet ?? false;
|
|
168
|
+
const evaluated = await pushScope(resource[Scope], resourceID, async () => {
|
|
169
|
+
const result = await func({
|
|
170
|
+
stage,
|
|
171
|
+
resourceID,
|
|
172
|
+
resourceFQN,
|
|
173
|
+
event,
|
|
174
|
+
scope: getScope(),
|
|
175
|
+
output: resourceState.output,
|
|
176
|
+
replace: () => {
|
|
177
|
+
if (isReplaced) {
|
|
178
|
+
console.warn(`Resource ${type} ${resourceFQN} is already marked as REPLACE`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
isReplaced = true;
|
|
182
|
+
deletions.push({
|
|
183
|
+
id: resourceID,
|
|
184
|
+
data: {
|
|
185
|
+
...resourceState.data,
|
|
186
|
+
},
|
|
187
|
+
inputs: inputs,
|
|
188
|
+
});
|
|
189
|
+
},
|
|
190
|
+
get: (key) => resourceState.data[key],
|
|
191
|
+
set: async (key, value) => {
|
|
192
|
+
resourceState.data[key] = value;
|
|
193
|
+
await stateStore.set(resourceID, resourceState);
|
|
194
|
+
},
|
|
195
|
+
delete: async (key) => {
|
|
196
|
+
const value = resourceState.data[key];
|
|
197
|
+
delete resourceState.data[key];
|
|
198
|
+
await stateStore.set(resourceID, resourceState);
|
|
199
|
+
return value;
|
|
200
|
+
},
|
|
201
|
+
quiet,
|
|
202
|
+
}, ...inputs);
|
|
203
|
+
if (result === undefined) {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
const evaluated = await apply(result, {
|
|
207
|
+
stage,
|
|
208
|
+
scope: getScope(),
|
|
209
|
+
quiet,
|
|
210
|
+
});
|
|
211
|
+
return evaluated;
|
|
212
|
+
});
|
|
213
|
+
if (!options?.quiet) {
|
|
214
|
+
console.log(`${event === "create" ? "Created" : "Updated"}: ${resourceFQN}`);
|
|
215
|
+
}
|
|
216
|
+
await stateStore.set(resourceID, {
|
|
217
|
+
provider: type,
|
|
218
|
+
data: resourceState.data,
|
|
219
|
+
status: event === "create" ? "created" : "updated",
|
|
220
|
+
output: evaluated,
|
|
221
|
+
inputs,
|
|
222
|
+
deps: [...deps],
|
|
179
223
|
});
|
|
224
|
+
if (evaluated !== undefined) {
|
|
225
|
+
resource[Provide](evaluated);
|
|
226
|
+
}
|
|
180
227
|
return evaluated;
|
|
181
|
-
});
|
|
182
|
-
if (!options?.quiet) {
|
|
183
|
-
console.log(`${event === "create" ? "Created" : "Updated"}: ${resourceFQN}`);
|
|
184
|
-
}
|
|
185
|
-
await stateStore.set(resourceID, {
|
|
186
|
-
provider: type,
|
|
187
|
-
data: resourceState.data,
|
|
188
|
-
status: event === "create" ? "created" : "updated",
|
|
189
|
-
output: evaluated,
|
|
190
|
-
inputs,
|
|
191
|
-
deps: [...deps],
|
|
192
|
-
});
|
|
193
|
-
if (evaluated !== undefined) {
|
|
194
|
-
resource[Provide](evaluated);
|
|
195
228
|
}
|
|
196
|
-
return evaluated;
|
|
197
229
|
}
|
|
198
230
|
static async delete(stage, scope, resourceID, state, inputs, options) {
|
|
231
|
+
const { Scope } = await import("./scope");
|
|
199
232
|
const resourceFQN = `${scope.getScopePath(stage)}/${resourceID}`;
|
|
200
|
-
const nestedScope = new
|
|
233
|
+
const nestedScope = new Scope(resourceID, scope);
|
|
201
234
|
await alchemize({
|
|
202
235
|
mode: "destroy",
|
|
203
236
|
stage,
|
|
@@ -213,6 +246,7 @@ export function Resource(type, ...args) {
|
|
|
213
246
|
stage,
|
|
214
247
|
scope,
|
|
215
248
|
resourceID: resourceID,
|
|
249
|
+
resourceFQN: resourceFQN,
|
|
216
250
|
event: "delete",
|
|
217
251
|
output: state.output,
|
|
218
252
|
replace() {
|
package/lib/resource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAqB,KAAK,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEnE,OAAO,EAA4B,WAAW,
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|
package/lib/scope.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Output } from "./output";
|
|
1
2
|
import type { Provider, Resource } from "./resource";
|
|
2
3
|
export declare class Scope {
|
|
3
4
|
readonly scopeName: string | null;
|
|
@@ -6,9 +7,11 @@ export declare class Scope {
|
|
|
6
7
|
provider: Provider<any, any[], any>;
|
|
7
8
|
resource: Resource<any, any>;
|
|
8
9
|
}>;
|
|
10
|
+
readonly callbacks: Output<void>[];
|
|
9
11
|
constructor(scopeName?: string | null, parent?: Scope | undefined);
|
|
10
12
|
getScopePath(root: string): string;
|
|
11
13
|
}
|
|
14
|
+
export declare const rootScope: Scope;
|
|
12
15
|
export declare function getScope(): Scope;
|
|
13
16
|
export declare function withScope<T>(scope: Scope, fn: () => T | Promise<T>): Promise<T>;
|
|
14
17
|
export declare function pushScope<T>(parent: Scope, scopeName: string, fn: () => T | Promise<T>): Promise<T>;
|
package/lib/scope.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAC;AAIjE,qBAAa,KAAK;aAYE,SAAS,EAAE,MAAM,GAAG,IAAI;aACxB,MAAM,EAAE,KAAK,GAAG,SAAS;IAZ3C,SAAgB,KAAK;kBAGP,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC;kBACzB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;OAE5B;IAEJ,SAAgB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAM;gBAG7B,SAAS,GAAE,MAAM,GAAG,IAAW,EAC/B,MAAM,GAAE,KAAK,GAAG,SAAqB;IAGhD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAM1C;AAED,eAAO,MAAM,SAAS,OAAkB,CAAC;AAEzC,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAEZ;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAEZ"}
|
package/lib/scope.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { rootScope } from "./global";
|
|
4
|
-
const scopeGlobal = new Map();
|
|
5
3
|
const scopeStorage = new AsyncLocalStorage();
|
|
6
4
|
export class Scope {
|
|
7
5
|
scopeName;
|
|
8
6
|
parent;
|
|
9
7
|
nodes = new Map();
|
|
8
|
+
callbacks = [];
|
|
10
9
|
constructor(scopeName = null, parent = undefined) {
|
|
11
10
|
this.scopeName = scopeName;
|
|
12
11
|
this.parent = parent;
|
|
@@ -18,21 +17,14 @@ export class Scope {
|
|
|
18
17
|
return this.scopeName ? path.join(parentPath, this.scopeName) : parentPath;
|
|
19
18
|
}
|
|
20
19
|
}
|
|
20
|
+
export const rootScope = new Scope(null);
|
|
21
21
|
export function getScope() {
|
|
22
22
|
return scopeStorage.getStore() ?? rootScope;
|
|
23
23
|
}
|
|
24
24
|
export function withScope(scope, fn) {
|
|
25
|
-
return scopeStorage.run(scope, async () =>
|
|
26
|
-
try {
|
|
27
|
-
return await fn();
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
throw error;
|
|
31
|
-
}
|
|
32
|
-
});
|
|
25
|
+
return scopeStorage.run(scope, async () => fn());
|
|
33
26
|
}
|
|
34
27
|
export function pushScope(parent, scopeName, fn) {
|
|
35
|
-
|
|
36
|
-
return withScope(newScope, fn);
|
|
28
|
+
return scopeStorage.run(new Scope(scopeName, parent), async () => fn());
|
|
37
29
|
}
|
|
38
30
|
//# sourceMappingURL=scope.js.map
|
package/lib/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAS,CAAC;AAEpD,MAAM,OAAO,KAAK;IAYE;IACA;IAZF,KAAK,GAAG,IAAI,GAAG,EAM5B,CAAC;IAEY,SAAS,GAAmB,EAAE,CAAC;IAE/C,YACkB,YAA2B,IAAI,EAC/B,SAA4B,SAAS;QADrC,cAAS,GAAT,SAAS,CAAsB;QAC/B,WAAM,GAAN,MAAM,CAA+B;IACpD,CAAC;IAEG,YAAY,CAAC,IAAY;QAC9B,yCAAyC;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,mEAAmE;QACnE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAEzC,MAAM,UAAU,QAAQ;IACtB,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAAY,EACZ,EAAwB;IAExB,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,MAAa,EACb,SAAiB,EACjB,EAAwB;IAExB,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alchemy",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"module": "./lib/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"check": "tsc -b ./tsconfig.
|
|
7
|
+
"check": "tsc -b ./tsconfig.all.json",
|
|
8
8
|
"publish:npm": "rm -rf ./lib && tsc -b && npm publish"
|
|
9
9
|
},
|
|
10
10
|
"files": ["lib", "src"],
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"diff": "^7.0.0",
|
|
34
34
|
"esbuild": "^0.24.2",
|
|
35
35
|
"glob": "^10.3.10",
|
|
36
|
+
"hono": "^4.7.4",
|
|
36
37
|
"jszip": "^3.0.0",
|
|
37
38
|
"stripe": "^17.7.0",
|
|
38
39
|
"turndown": "^7.2.0",
|
package/src/$.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Input } from "./input";
|
|
2
|
+
import { type Output, OutputChain } from "./output";
|
|
3
|
+
import { getScope } from "./scope";
|
|
4
|
+
|
|
5
|
+
export type $<T> = T extends
|
|
6
|
+
| undefined
|
|
7
|
+
| null
|
|
8
|
+
| boolean
|
|
9
|
+
| number
|
|
10
|
+
| string
|
|
11
|
+
| symbol
|
|
12
|
+
| bigint
|
|
13
|
+
? Input<T>
|
|
14
|
+
: T extends (...args: infer Args extends any[]) => infer R
|
|
15
|
+
? (
|
|
16
|
+
...args: {
|
|
17
|
+
[i in keyof Args]: $<Args[i]>;
|
|
18
|
+
}
|
|
19
|
+
) => Output<Awaited<R>>
|
|
20
|
+
: T extends any[]
|
|
21
|
+
? $array<T>
|
|
22
|
+
: $object<T>;
|
|
23
|
+
|
|
24
|
+
type $object<T> = {
|
|
25
|
+
[i in keyof T]: $<T[i]>;
|
|
26
|
+
};
|
|
27
|
+
type $array<T extends any[]> = T extends [infer First, ...infer Rest]
|
|
28
|
+
? [$<First>, ...$object<Rest>]
|
|
29
|
+
: [];
|
|
30
|
+
|
|
31
|
+
export function $<T>(value: T): $<T> {
|
|
32
|
+
return new Proxy(() => {}, {
|
|
33
|
+
apply: (_: T, thisArg, args) => {
|
|
34
|
+
const target = value as (...args: any[]) => any;
|
|
35
|
+
let argsOutput: Output<any[]> | undefined;
|
|
36
|
+
for (const arg of args) {
|
|
37
|
+
if (arg instanceof OutputChain) {
|
|
38
|
+
if (argsOutput) {
|
|
39
|
+
argsOutput = arg.apply((arg) =>
|
|
40
|
+
argsOutput!.apply((...args) => [...args, arg]),
|
|
41
|
+
);
|
|
42
|
+
} else {
|
|
43
|
+
argsOutput = arg.apply((arg) => [arg]);
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
if (argsOutput) {
|
|
47
|
+
argsOutput = argsOutput.apply((args) => [...args, arg]);
|
|
48
|
+
} else {
|
|
49
|
+
argsOutput = new OutputChain({} as any, () => [arg]);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const scope = getScope();
|
|
55
|
+
const output = argsOutput
|
|
56
|
+
? argsOutput.apply((args) => target(...args))
|
|
57
|
+
: new OutputChain({} as any, () => target());
|
|
58
|
+
scope.callbacks.push(output);
|
|
59
|
+
return $(output);
|
|
60
|
+
},
|
|
61
|
+
get: (_: any, prop) => {
|
|
62
|
+
const target = value as any;
|
|
63
|
+
if (target instanceof OutputChain) {
|
|
64
|
+
return $(target.apply((t) => t[prop]));
|
|
65
|
+
}
|
|
66
|
+
return $(target[prop]);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
package/src/alchemize.ts
CHANGED
|
@@ -51,6 +51,7 @@ export async function alchemize(options?: AlchemizeOptions) {
|
|
|
51
51
|
const stateStore = new (options?.stateStore ?? defaultStateStore)(
|
|
52
52
|
scope.getScopePath(stage),
|
|
53
53
|
);
|
|
54
|
+
const callbacks = scope.callbacks;
|
|
54
55
|
|
|
55
56
|
if (nodes.size > 0) {
|
|
56
57
|
await stateStore.init?.();
|
|
@@ -81,6 +82,17 @@ export async function alchemize(options?: AlchemizeOptions) {
|
|
|
81
82
|
if (options?.destroyOrphans === false) {
|
|
82
83
|
return;
|
|
83
84
|
}
|
|
85
|
+
|
|
86
|
+
await Promise.all(
|
|
87
|
+
callbacks.map((callback) =>
|
|
88
|
+
evaluate(callback, {
|
|
89
|
+
stage,
|
|
90
|
+
scope,
|
|
91
|
+
stateStore,
|
|
92
|
+
quiet: options?.quiet,
|
|
93
|
+
}),
|
|
94
|
+
),
|
|
95
|
+
);
|
|
84
96
|
}
|
|
85
97
|
const aliveIDs = new Set(
|
|
86
98
|
mode === "up"
|
package/src/apply.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defaultStage, defaultStateStore } from "./global";
|
|
2
|
-
import { type Output, OutputChain, type
|
|
2
|
+
import { type Output, OutputChain, type Resolved } from "./output";
|
|
3
3
|
import {
|
|
4
4
|
Input,
|
|
5
5
|
Provider,
|
|
@@ -25,7 +25,7 @@ export interface ApplyOptions {
|
|
|
25
25
|
export async function apply<T>(
|
|
26
26
|
output: T,
|
|
27
27
|
options?: Partial<ApplyOptions>,
|
|
28
|
-
): Promise<
|
|
28
|
+
): Promise<Resolved<T>> {
|
|
29
29
|
const stage = options?.stage ?? defaultStage;
|
|
30
30
|
const scope = options?.scope ?? getScope();
|
|
31
31
|
const statePath = scope.getScopePath(stage);
|
|
@@ -33,7 +33,7 @@ export async function apply<T>(
|
|
|
33
33
|
|
|
34
34
|
return (
|
|
35
35
|
await evaluate(output, { stage, scope, stateStore, quiet: options?.quiet })
|
|
36
|
-
).value as
|
|
36
|
+
).value as Resolved<T>;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
class Evaluated<T> {
|
|
@@ -83,7 +83,7 @@ export async function evaluate<T>(
|
|
|
83
83
|
);
|
|
84
84
|
resolve!(new Evaluated(result, [resourceID, ...deps]));
|
|
85
85
|
} catch (error) {
|
|
86
|
-
console.error(error);
|
|
86
|
+
// console.error(error);
|
|
87
87
|
reject!(error);
|
|
88
88
|
}
|
|
89
89
|
return promise;
|
package/src/cloudflare/api.ts
CHANGED
|
@@ -183,6 +183,12 @@ export class CloudflareApi {
|
|
|
183
183
|
return this.fetch(path, { ...init, method: "GET" });
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
+
/**
|
|
187
|
+
* Helper for HEAD requests
|
|
188
|
+
*/
|
|
189
|
+
async head(path: string, init: RequestInit = {}): Promise<Response> {
|
|
190
|
+
return this.fetch(path, { ...init, method: "HEAD" });
|
|
191
|
+
}
|
|
186
192
|
/**
|
|
187
193
|
* Helper for POST requests
|
|
188
194
|
*/
|
|
@@ -3,6 +3,38 @@
|
|
|
3
3
|
* Based on Cloudflare API documentation:
|
|
4
4
|
* https://developers.cloudflare.com/api/resources/workers/subresources/scripts/methods/update/
|
|
5
5
|
*/
|
|
6
|
+
import type { DurableObjectNamespace } from "./durable-object-namespace";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Union type for all Worker binding types (Alchemy abstraction)
|
|
10
|
+
*/
|
|
11
|
+
export type WorkerBinding = WorkerBindingSpec | DurableObjectNamespace;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Union type for all Worker binding types (API spec)
|
|
15
|
+
*/
|
|
16
|
+
export type WorkerBindingSpec =
|
|
17
|
+
| WorkerBindingAI
|
|
18
|
+
| WorkerBindingAnalyticsEngine
|
|
19
|
+
| WorkerBindingAssets
|
|
20
|
+
| WorkerBindingBrowserRendering
|
|
21
|
+
| WorkerBindingD1
|
|
22
|
+
| WorkerBindingDispatchNamespace
|
|
23
|
+
| WorkerBindingDurableObjectNamespace
|
|
24
|
+
| WorkerBindingHyperdrive
|
|
25
|
+
| WorkerBindingJson
|
|
26
|
+
| WorkerBindingKVNamespace
|
|
27
|
+
| WorkerBindingMTLSCertificate
|
|
28
|
+
| WorkerBindingPlainText
|
|
29
|
+
| WorkerBindingQueue
|
|
30
|
+
| WorkerBindingR2Bucket
|
|
31
|
+
| WorkerBindingSecretText
|
|
32
|
+
| WorkerBindingService
|
|
33
|
+
| WorkerBindingStaticContent
|
|
34
|
+
| WorkerBindingTailConsumer
|
|
35
|
+
| WorkerBindingVectorize
|
|
36
|
+
| WorkerBindingVersionMetadata
|
|
37
|
+
| WorkerBindingWasmModule;
|
|
6
38
|
|
|
7
39
|
/**
|
|
8
40
|
* AI binding type
|
|
@@ -76,6 +108,11 @@ export interface WorkerBindingDispatchNamespace {
|
|
|
76
108
|
* Durable Object Namespace binding type
|
|
77
109
|
*/
|
|
78
110
|
export interface WorkerBindingDurableObjectNamespace {
|
|
111
|
+
/**
|
|
112
|
+
* The stable ID of the binding
|
|
113
|
+
* @internal
|
|
114
|
+
*/
|
|
115
|
+
stableId?: string;
|
|
79
116
|
/** The name of the binding */
|
|
80
117
|
name: string;
|
|
81
118
|
/** Type identifier for Durable Object Namespace binding */
|
|
@@ -258,29 +295,3 @@ export interface WorkerBindingStaticContent {
|
|
|
258
295
|
/** Type identifier for Static Content binding */
|
|
259
296
|
type: "static_content";
|
|
260
297
|
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Union type for all Worker binding types
|
|
264
|
-
*/
|
|
265
|
-
export type WorkerBinding =
|
|
266
|
-
| WorkerBindingAI
|
|
267
|
-
| WorkerBindingAnalyticsEngine
|
|
268
|
-
| WorkerBindingAssets
|
|
269
|
-
| WorkerBindingBrowserRendering
|
|
270
|
-
| WorkerBindingD1
|
|
271
|
-
| WorkerBindingDispatchNamespace
|
|
272
|
-
| WorkerBindingDurableObjectNamespace
|
|
273
|
-
| WorkerBindingHyperdrive
|
|
274
|
-
| WorkerBindingJson
|
|
275
|
-
| WorkerBindingKVNamespace
|
|
276
|
-
| WorkerBindingMTLSCertificate
|
|
277
|
-
| WorkerBindingPlainText
|
|
278
|
-
| WorkerBindingQueue
|
|
279
|
-
| WorkerBindingR2Bucket
|
|
280
|
-
| WorkerBindingSecretText
|
|
281
|
-
| WorkerBindingService
|
|
282
|
-
| WorkerBindingStaticContent
|
|
283
|
-
| WorkerBindingTailConsumer
|
|
284
|
-
| WorkerBindingVectorize
|
|
285
|
-
| WorkerBindingVersionMetadata
|
|
286
|
-
| WorkerBindingWasmModule;
|