alchemy 0.15.14 → 0.16.1
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/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +17 -7
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +31 -31
- package/lib/apply.js.map +1 -1
- package/lib/cloudflare/queue.d.ts.map +1 -1
- package/lib/cloudflare/queue.js +3 -2
- package/lib/cloudflare/queue.js.map +1 -1
- package/lib/cloudflare/r2-rest-state-store.d.ts +1 -1
- package/lib/cloudflare/r2-rest-state-store.d.ts.map +1 -1
- package/lib/cloudflare/r2-rest-state-store.js +5 -4
- package/lib/cloudflare/r2-rest-state-store.js.map +1 -1
- package/lib/cloudflare/worker.js +1 -1
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/context.d.ts +1 -1
- package/lib/context.d.ts.map +1 -1
- package/lib/context.js +6 -5
- package/lib/context.js.map +1 -1
- package/lib/destroy.d.ts.map +1 -1
- package/lib/destroy.js +20 -20
- package/lib/destroy.js.map +1 -1
- package/lib/fs/file-system-state-store.d.ts +1 -1
- package/lib/fs/file-system-state-store.d.ts.map +1 -1
- package/lib/fs/file-system-state-store.js +5 -3
- package/lib/fs/file-system-state-store.js.map +1 -1
- package/lib/resource.d.ts +15 -11
- package/lib/resource.d.ts.map +1 -1
- package/lib/resource.js +12 -7
- package/lib/resource.js.map +1 -1
- package/lib/scope.d.ts +2 -1
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +3 -1
- package/lib/scope.js.map +1 -1
- package/lib/state.d.ts +3 -2
- package/lib/state.d.ts.map +1 -1
- package/lib/state.js +29 -0
- package/lib/state.js.map +1 -1
- package/package.json +1 -1
- package/src/alchemy.ts +26 -8
- package/src/apply.ts +37 -30
- package/src/cloudflare/queue.ts +6 -3
- package/src/cloudflare/r2-rest-state-store.ts +5 -5
- package/src/cloudflare/worker.ts +1 -1
- package/src/context.ts +21 -13
- package/src/destroy.ts +34 -20
- package/src/fs/file-system-state-store.ts +5 -7
- package/src/resource.ts +22 -18
- package/src/scope.ts +4 -2
- package/src/state.ts +42 -2
package/lib/destroy.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { alchemy } from "./alchemy.js";
|
|
2
2
|
import { context } from "./context.js";
|
|
3
|
-
import { PROVIDERS } from "./resource.js";
|
|
3
|
+
import { PROVIDERS, ResourceFQN, ResourceID, ResourceKind, ResourceScope, ResourceSeq, } from "./resource.js";
|
|
4
4
|
import { Scope } from "./scope.js";
|
|
5
5
|
export class DestroyedSignal extends Error {
|
|
6
6
|
}
|
|
@@ -33,38 +33,38 @@ export async function destroy(...args) {
|
|
|
33
33
|
if (!instance) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
|
-
if (instance
|
|
36
|
+
if (instance[ResourceKind] === Scope.KIND) {
|
|
37
37
|
const scope = new Scope({
|
|
38
|
-
parent: instance
|
|
39
|
-
scopeName: instance
|
|
38
|
+
parent: instance[ResourceScope],
|
|
39
|
+
scopeName: instance[ResourceID],
|
|
40
40
|
});
|
|
41
41
|
console.log("Destroying scope", scope.chain.join("/"));
|
|
42
42
|
return await destroy(scope, options);
|
|
43
43
|
}
|
|
44
|
-
const Provider = PROVIDERS.get(instance
|
|
44
|
+
const Provider = PROVIDERS.get(instance[ResourceKind]);
|
|
45
45
|
if (!Provider) {
|
|
46
|
-
throw new Error(`Cannot destroy resource "${instance
|
|
46
|
+
throw new Error(`Cannot destroy resource "${instance[ResourceFQN]}" type ${instance[ResourceKind]} - no provider found. You may need to import the provider in your alchemy.config.ts.`);
|
|
47
47
|
}
|
|
48
|
-
const scope = instance
|
|
48
|
+
const scope = instance[ResourceScope];
|
|
49
49
|
if (!scope) {
|
|
50
|
-
console.warn(`Resource "${instance
|
|
50
|
+
console.warn(`Resource "${instance[ResourceFQN]}" has no scope`);
|
|
51
51
|
}
|
|
52
52
|
const quiet = options?.quiet ?? scope.quiet;
|
|
53
53
|
try {
|
|
54
54
|
if (!quiet) {
|
|
55
|
-
console.log(`Delete: "${instance
|
|
55
|
+
console.log(`Delete: "${instance[ResourceFQN]}"`);
|
|
56
56
|
}
|
|
57
|
-
const state = await scope.state.get(instance
|
|
57
|
+
const state = await scope.state.get(instance[ResourceID]);
|
|
58
58
|
if (state === undefined) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
const ctx = context({
|
|
62
62
|
scope,
|
|
63
63
|
phase: "delete",
|
|
64
|
-
kind: instance
|
|
65
|
-
id: instance
|
|
66
|
-
fqn: instance
|
|
67
|
-
seq: instance
|
|
64
|
+
kind: instance[ResourceKind],
|
|
65
|
+
id: instance[ResourceID],
|
|
66
|
+
fqn: instance[ResourceFQN],
|
|
67
|
+
seq: instance[ResourceSeq],
|
|
68
68
|
props: state.props,
|
|
69
69
|
state,
|
|
70
70
|
replace: () => {
|
|
@@ -74,13 +74,13 @@ export async function destroy(...args) {
|
|
|
74
74
|
let nestedScope;
|
|
75
75
|
try {
|
|
76
76
|
// BUG: this does not restore persisted scope
|
|
77
|
-
await alchemy.run(instance
|
|
77
|
+
await alchemy.run(instance[ResourceID], {
|
|
78
78
|
// TODO(sam): this is an awful hack to differentiate between naked scopes and resources
|
|
79
|
-
isResource: instance
|
|
79
|
+
isResource: instance[ResourceKind] !== "alchemy::Scope",
|
|
80
80
|
parent: scope,
|
|
81
81
|
}, async (scope) => {
|
|
82
82
|
nestedScope = scope;
|
|
83
|
-
return await Provider.handler.bind(ctx)(instance
|
|
83
|
+
return await Provider.handler.bind(ctx)(instance[ResourceID], state.props);
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
86
|
catch (err) {
|
|
@@ -94,9 +94,9 @@ export async function destroy(...args) {
|
|
|
94
94
|
if (nestedScope) {
|
|
95
95
|
await destroy(nestedScope, options);
|
|
96
96
|
}
|
|
97
|
-
await scope.delete(instance
|
|
97
|
+
await scope.delete(instance[ResourceID]);
|
|
98
98
|
if (!quiet) {
|
|
99
|
-
console.log(`Deleted: "${instance
|
|
99
|
+
console.log(`Deleted: "${instance[ResourceFQN]}"`);
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
catch (error) {
|
|
@@ -107,7 +107,7 @@ export async function destroy(...args) {
|
|
|
107
107
|
(function (destroy) {
|
|
108
108
|
async function all(resources, options) {
|
|
109
109
|
if (options?.strategy !== "parallel") {
|
|
110
|
-
const sorted = resources.sort((a, b) => b
|
|
110
|
+
const sorted = resources.sort((a, b) => b[ResourceSeq] - a[ResourceSeq]);
|
|
111
111
|
for (const resource of sorted) {
|
|
112
112
|
await destroy(resource, options);
|
|
113
113
|
}
|
package/lib/destroy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../src/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../src/destroy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Scope } from "../scope.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type State, type StateStore } from "../state.js";
|
|
3
3
|
export declare class FileSystemStateStore implements StateStore {
|
|
4
4
|
readonly scope: Scope;
|
|
5
5
|
readonly dir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system-state-store.d.ts","sourceRoot":"","sources":["../../src/fs/file-system-state-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-system-state-store.d.ts","sourceRoot":"","sources":["../../src/fs/file-system-state-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAoB,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAK5E,qBAAa,oBAAqB,YAAW,UAAU;aAGzB,KAAK,EAAE,KAAK;IAFxC,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,WAAW,CAAS;gBACA,KAAK,EAAE,KAAK;IAIlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAiB5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAIrC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAgB7D,OAAO,CAAC,OAAO;CAShB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { ResourceScope } from "../resource.js";
|
|
4
|
+
import { serialize } from "../serde.js";
|
|
5
|
+
import { deserializeState } from "../state.js";
|
|
4
6
|
import { ignore } from "../util/ignore.js";
|
|
5
7
|
const stateRootDir = path.join(process.cwd(), ".alchemy");
|
|
6
8
|
export class FileSystemStateStore {
|
|
@@ -44,11 +46,11 @@ export class FileSystemStateStore {
|
|
|
44
46
|
async get(key) {
|
|
45
47
|
try {
|
|
46
48
|
const content = await fs.promises.readFile(this.getPath(key), "utf8");
|
|
47
|
-
const state =
|
|
49
|
+
const state = await deserializeState(this.scope, content);
|
|
48
50
|
if (state.output === undefined) {
|
|
49
51
|
state.output = {};
|
|
50
52
|
}
|
|
51
|
-
state.output
|
|
53
|
+
state.output[ResourceScope] = this.scope;
|
|
52
54
|
return state;
|
|
53
55
|
}
|
|
54
56
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-system-state-store.js","sourceRoot":"","sources":["../../src/fs/file-system-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"file-system-state-store.js","sourceRoot":"","sources":["../../src/fs/file-system-state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAA+B,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;AAE1D,MAAM,OAAO,oBAAoB;IAGH;IAFZ,GAAG,CAAS;IACpB,WAAW,GAAG,KAAK,CAAC;IAC5B,YAA4B,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;QACtC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;gBAChD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,OAAO,KAAK;iBACT,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACpE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;iBACnD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YACtE,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,MAAM,GAAG,EAAS,CAAC;YAC3B,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAY;QACjC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EACjB,IAAI,CAAC,SAAS,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAa;QAC1B,OAAO,MAAM,CAAC,WAAW,CACvB,CACE,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACnC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,OAAO,EAAW,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAU,CAAC;QAC5B,CAAC,CAAC,CACH,CACF,CAAC,IAAI,EAAE,CACT,CAAC;IACJ,CAAC;IAEO,OAAO,CAAC,GAAW;QACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
package/lib/resource.d.ts
CHANGED
|
@@ -2,8 +2,13 @@ import type { Context } from "./context.js";
|
|
|
2
2
|
import { Scope as _Scope } from "./scope.js";
|
|
3
3
|
export declare const PROVIDERS: Map<string, any>;
|
|
4
4
|
export type ResourceID = string;
|
|
5
|
+
export declare const ResourceID: unique symbol;
|
|
5
6
|
export type ResourceFQN = string;
|
|
7
|
+
export declare const ResourceFQN: unique symbol;
|
|
6
8
|
export type ResourceKind = string;
|
|
9
|
+
export declare const ResourceKind: unique symbol;
|
|
10
|
+
export declare const ResourceScope: unique symbol;
|
|
11
|
+
export declare const ResourceSeq: unique symbol;
|
|
7
12
|
export interface ProviderOptions {
|
|
8
13
|
/**
|
|
9
14
|
* If true, the resource will be updated even if the inputs have not changed.
|
|
@@ -19,19 +24,18 @@ export type Provider<Type extends string = string, F extends ResourceLifecycleHa
|
|
|
19
24
|
handler: F;
|
|
20
25
|
};
|
|
21
26
|
export type PendingResource<Out = unknown, Kind extends ResourceKind = ResourceKind, ID extends ResourceID = ResourceID, FQN extends ResourceFQN = ResourceFQN, Scope extends _Scope = _Scope, Seq extends number = number> = Promise<Out> & {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
signal: () => void;
|
|
27
|
+
[ResourceKind]: Kind;
|
|
28
|
+
[ResourceID]: ID;
|
|
29
|
+
[ResourceFQN]: FQN;
|
|
30
|
+
[ResourceScope]: Scope;
|
|
31
|
+
[ResourceSeq]: Seq;
|
|
28
32
|
};
|
|
29
33
|
export interface Resource<Kind extends ResourceKind = ResourceKind, ID extends ResourceID = ResourceID, FQN extends ResourceFQN = ResourceFQN, Scope extends _Scope = _Scope, Seq extends number = number> {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
[ResourceKind]: Kind;
|
|
35
|
+
[ResourceID]: ID;
|
|
36
|
+
[ResourceFQN]: FQN;
|
|
37
|
+
[ResourceScope]: Scope;
|
|
38
|
+
[ResourceSeq]: Seq;
|
|
35
39
|
}
|
|
36
40
|
type IsClass = {
|
|
37
41
|
new (_: never): never;
|
package/lib/resource.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,SAAS,kBAAiD,CAAC;AAExE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAChC,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AACjC,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|
package/lib/resource.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { apply } from "./apply.js";
|
|
2
2
|
import { Scope as _Scope } from "./scope.js";
|
|
3
3
|
export const PROVIDERS = new Map();
|
|
4
|
+
export const ResourceID = Symbol.for("alchemy::ResourceID");
|
|
5
|
+
export const ResourceFQN = Symbol.for("alchemy::ResourceFQN");
|
|
6
|
+
export const ResourceKind = Symbol.for("alchemy::ResourceKind");
|
|
7
|
+
export const ResourceScope = Symbol.for("alchemy::ResourceScope");
|
|
8
|
+
export const ResourceSeq = Symbol.for("alchemy::ResourceSeq");
|
|
4
9
|
export function Resource(type, ...args) {
|
|
5
10
|
if (PROVIDERS.has(type)) {
|
|
6
11
|
throw new Error(`Resource ${type} already exists`);
|
|
@@ -16,9 +21,9 @@ export function Resource(type, ...args) {
|
|
|
16
21
|
// TODO(sam): do we want to throw?
|
|
17
22
|
// it's kind of awesome that you can re-create a resource and call apply
|
|
18
23
|
const otherResource = scope.resources.get(resourceID);
|
|
19
|
-
if (otherResource?.
|
|
24
|
+
if (otherResource?.[ResourceKind] !== type) {
|
|
20
25
|
scope.fail();
|
|
21
|
-
throw new Error(`Resource ${resourceID} already exists in the stack and is of a different type: '${otherResource?.
|
|
26
|
+
throw new Error(`Resource ${resourceID} already exists in the stack and is of a different type: '${otherResource?.[ResourceKind]}' !== '${type}'`);
|
|
22
27
|
}
|
|
23
28
|
// console.warn(
|
|
24
29
|
// `Resource ${resourceID} already exists in the stack: ${scope.chain.join("/")}`,
|
|
@@ -27,11 +32,11 @@ export function Resource(type, ...args) {
|
|
|
27
32
|
// get a sequence number (unique within the scope) for the resource
|
|
28
33
|
const seq = scope.seq();
|
|
29
34
|
const meta = {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
[ResourceKind]: type,
|
|
36
|
+
[ResourceID]: resourceID,
|
|
37
|
+
[ResourceFQN]: scope.fqn(resourceID),
|
|
38
|
+
[ResourceSeq]: seq,
|
|
39
|
+
[ResourceScope]: scope,
|
|
35
40
|
};
|
|
36
41
|
const promise = apply(meta, props, options);
|
|
37
42
|
const resource = Object.assign(promise, meta);
|
package/lib/resource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|
package/lib/scope.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Phase } from "./alchemy.js";
|
|
2
|
-
import
|
|
2
|
+
import { ResourceID, type PendingResource } from "./resource.js";
|
|
3
3
|
import type { StateStore, StateStoreType } from "./state.js";
|
|
4
4
|
export type ScopeOptions = {
|
|
5
5
|
appName?: string;
|
|
@@ -12,6 +12,7 @@ export type ScopeOptions = {
|
|
|
12
12
|
phase?: Phase;
|
|
13
13
|
};
|
|
14
14
|
export declare class Scope {
|
|
15
|
+
static readonly KIND: "alchemy::Scope";
|
|
15
16
|
static get(): Scope | undefined;
|
|
16
17
|
static get current(): Scope;
|
|
17
18
|
readonly resources: Map<string, PendingResource>;
|
package/lib/scope.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI7D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;AAKF,qBAAa,KAAK;IAChB,gBAAuB,IAAI,EAAG,gBAAgB,CAAU;WAE1C,GAAG,IAAI,KAAK,GAAG,SAAS;IAItC,WAAkB,OAAO,IAAI,KAAK,CAMjC;IAED,SAAgB,SAAS,+BAA0C;IACnE,SAAgB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,SAAgB,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;IAC1C,SAAgB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,SAAgB,KAAK,EAAE,UAAU,CAAC;IAClC,SAAgB,UAAU,EAAE,cAAc,CAAC;IAC3C,SAAgB,KAAK,EAAE,OAAO,CAAC;IAC/B,SAAgB,KAAK,EAAE,KAAK,CAAC;IAE7B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,YAAY;IA4BpB,MAAM,CAAC,UAAU,EAAE,UAAU;IAK1C,OAAO,CAAC,IAAI,CAAK;IAEV,GAAG;IAIV,IAAW,KAAK,IAAI,MAAM,EAAE,CAO3B;IAEM,IAAI;IAKJ,KAAK;IAIC,IAAI;IAIJ,MAAM;IAKZ,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;IAI7B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjE,CAAC,MAAM,CAAC,YAAY,CAAC;IAIR,QAAQ;IAuBrB;;OAEG;IACI,QAAQ;CAQhB"}
|
package/lib/scope.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
2
|
import { destroy } from "./destroy.js";
|
|
3
3
|
import { FileSystemStateStore } from "./fs/file-system-state-store.js";
|
|
4
|
+
import { ResourceID } from "./resource.js";
|
|
4
5
|
const scopeStorage = new AsyncLocalStorage();
|
|
5
6
|
// TODO: support browser
|
|
6
7
|
const DEFAULT_STAGE = process.env.ALCHEMY_STAGE ?? process.env.USER ?? "dev";
|
|
7
8
|
export class Scope {
|
|
9
|
+
static KIND = "alchemy::Scope";
|
|
8
10
|
static get() {
|
|
9
11
|
return scopeStorage.getStore();
|
|
10
12
|
}
|
|
@@ -115,7 +117,7 @@ export class Scope {
|
|
|
115
117
|
return `Scope(
|
|
116
118
|
chain=${this.chain.join("/")},
|
|
117
119
|
resources=[${Array.from(this.resources.values())
|
|
118
|
-
.map((r) => r
|
|
120
|
+
.map((r) => r[ResourceID])
|
|
119
121
|
.join(",\n ")}]
|
|
120
122
|
)`;
|
|
121
123
|
}
|
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;AAErD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
package/lib/state.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import
|
|
1
|
+
import { type Resource, type ResourceProps } from "./resource.js";
|
|
2
|
+
import { Scope } from "./scope.js";
|
|
3
3
|
export type State<Kind extends string = string, Props extends ResourceProps | undefined = ResourceProps | undefined, Out extends Resource = Resource> = {
|
|
4
4
|
status: `creating` | `created` | `updating` | `updated` | `deleting` | `deleted`;
|
|
5
5
|
kind: Kind;
|
|
@@ -27,4 +27,5 @@ export interface StateStore {
|
|
|
27
27
|
set(key: string, value: State): Promise<void>;
|
|
28
28
|
delete(key: string): Promise<void>;
|
|
29
29
|
}
|
|
30
|
+
export declare function deserializeState(scope: Scope, content: string): Promise<State>;
|
|
30
31
|
//# sourceMappingURL=state.d.ts.map
|
package/lib/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,QAAQ,EACb,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,MAAM,MAAM,KAAK,CACf,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,KAAK,SAAS,aAAa,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,EACnE,GAAG,SAAS,QAAQ,GAAG,QAAQ,IAC7B;IACF,MAAM,EACF,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,UAAU,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,6CAA6C;IAC7C,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1B,mDAAmD;IACnD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACxD,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC,CA0BhB"}
|
package/lib/state.js
CHANGED
|
@@ -1 +1,30 @@
|
|
|
1
|
+
import { ResourceFQN, ResourceID, ResourceKind, ResourceScope, ResourceSeq, } from "./resource.js";
|
|
2
|
+
import { Scope } from "./scope.js";
|
|
3
|
+
import { deserialize } from "./serde.js";
|
|
4
|
+
export async function deserializeState(scope, content) {
|
|
5
|
+
const state = (await deserialize(scope, JSON.parse(content)));
|
|
6
|
+
if (ResourceID in state.output) {
|
|
7
|
+
// this is a new state
|
|
8
|
+
return state;
|
|
9
|
+
}
|
|
10
|
+
const output = state.output;
|
|
11
|
+
delete output.Kind;
|
|
12
|
+
delete output.ID;
|
|
13
|
+
delete output.FQN;
|
|
14
|
+
delete output.Scope;
|
|
15
|
+
delete output.Seq;
|
|
16
|
+
// fix this bug
|
|
17
|
+
if (state.kind === "scope") {
|
|
18
|
+
state.kind = Scope.KIND;
|
|
19
|
+
}
|
|
20
|
+
output[ResourceKind] = state.kind;
|
|
21
|
+
output[ResourceID] = state.id;
|
|
22
|
+
output[ResourceFQN] = state.fqn;
|
|
23
|
+
output[ResourceScope] = scope;
|
|
24
|
+
output[ResourceSeq] = state.seq;
|
|
25
|
+
state.output = output;
|
|
26
|
+
// re-write the state with the migrated format
|
|
27
|
+
await scope.state.set(state.id, state);
|
|
28
|
+
return state;
|
|
29
|
+
}
|
|
1
30
|
//# sourceMappingURL=state.js.map
|
package/lib/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,GAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2CzC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAY,EACZ,OAAe;IAEf,MAAM,KAAK,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAU,CAAC;IAEvE,IAAI,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/B,sBAAsB;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAQ,KAAK,CAAC,MAAM,CAAC;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC;IACnB,OAAO,MAAM,CAAC,EAAE,CAAC;IACjB,OAAO,MAAM,CAAC,GAAG,CAAC;IAClB,OAAO,MAAM,CAAC,KAAK,CAAC;IACpB,OAAO,MAAM,CAAC,GAAG,CAAC;IAClB,eAAe;IACf,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IAClC,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IAC9B,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAChC,MAAM,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;IAC9B,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;IAChC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,8CAA8C;IAC9C,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
package/src/alchemy.ts
CHANGED
|
@@ -3,7 +3,14 @@ import path from "node:path";
|
|
|
3
3
|
|
|
4
4
|
import { destroy, DestroyedSignal } from "./destroy.js";
|
|
5
5
|
import { env } from "./env.js";
|
|
6
|
-
import
|
|
6
|
+
import {
|
|
7
|
+
ResourceFQN,
|
|
8
|
+
ResourceID,
|
|
9
|
+
ResourceKind,
|
|
10
|
+
ResourceScope,
|
|
11
|
+
ResourceSeq,
|
|
12
|
+
type PendingResource,
|
|
13
|
+
} from "./resource.js";
|
|
7
14
|
import { Scope } from "./scope.js";
|
|
8
15
|
import { secret } from "./secret.js";
|
|
9
16
|
import type { StateStoreType } from "./state.js";
|
|
@@ -325,14 +332,14 @@ async function run<T>(
|
|
|
325
332
|
// TODO(sam): this is an awful hack to differentiate between naked scopes and resources
|
|
326
333
|
const seq = _scope.parent.seq();
|
|
327
334
|
const output = {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
335
|
+
[ResourceID]: id,
|
|
336
|
+
[ResourceFQN]: "",
|
|
337
|
+
[ResourceKind]: Scope.KIND,
|
|
338
|
+
[ResourceScope]: _scope,
|
|
339
|
+
[ResourceSeq]: seq,
|
|
333
340
|
} as const;
|
|
334
341
|
const resource = {
|
|
335
|
-
kind:
|
|
342
|
+
kind: Scope.KIND,
|
|
336
343
|
id,
|
|
337
344
|
seq,
|
|
338
345
|
data: {},
|
|
@@ -341,7 +348,18 @@ async function run<T>(
|
|
|
341
348
|
status: "created",
|
|
342
349
|
output,
|
|
343
350
|
} as const;
|
|
344
|
-
await _scope.parent!.state.
|
|
351
|
+
const prev = await _scope.parent!.state.get(id);
|
|
352
|
+
if (!prev) {
|
|
353
|
+
await _scope.parent!.state.set(id, resource);
|
|
354
|
+
} else if (prev.kind !== Scope.KIND) {
|
|
355
|
+
throw new Error(
|
|
356
|
+
`Tried to create a Scope that conflicts with a Resource (${prev.kind}): ${id}`,
|
|
357
|
+
);
|
|
358
|
+
} else if (_scope.phase === "read") {
|
|
359
|
+
throw new Error(
|
|
360
|
+
`Tried to create a non-existend Scope (${id}) in read mode`,
|
|
361
|
+
);
|
|
362
|
+
}
|
|
345
363
|
_scope.parent!.resources.set(
|
|
346
364
|
id,
|
|
347
365
|
Object.assign(Promise.resolve(resource), output) as PendingResource,
|
package/src/apply.ts
CHANGED
|
@@ -2,6 +2,11 @@ import { alchemy } from "./alchemy.js";
|
|
|
2
2
|
import { context } from "./context.js";
|
|
3
3
|
import {
|
|
4
4
|
PROVIDERS,
|
|
5
|
+
ResourceFQN,
|
|
6
|
+
ResourceID,
|
|
7
|
+
ResourceKind,
|
|
8
|
+
ResourceScope,
|
|
9
|
+
ResourceSeq,
|
|
5
10
|
type PendingResource,
|
|
6
11
|
type Provider,
|
|
7
12
|
type Resource,
|
|
@@ -20,42 +25,44 @@ export async function apply<Out extends Resource>(
|
|
|
20
25
|
props: ResourceProps | undefined,
|
|
21
26
|
options?: ApplyOptions,
|
|
22
27
|
): Promise<Awaited<Out>> {
|
|
23
|
-
const scope = resource
|
|
28
|
+
const scope = resource[ResourceScope];
|
|
24
29
|
try {
|
|
25
30
|
const quiet = props?.quiet ?? scope.quiet;
|
|
26
31
|
await scope.init();
|
|
27
|
-
let state: State | undefined = (await scope.state.get(
|
|
28
|
-
|
|
32
|
+
let state: State | undefined = (await scope.state.get(
|
|
33
|
+
resource[ResourceID],
|
|
34
|
+
))!;
|
|
35
|
+
const provider: Provider = PROVIDERS.get(resource[ResourceKind]);
|
|
29
36
|
if (provider === undefined) {
|
|
30
|
-
throw new Error(`Provider "${resource
|
|
37
|
+
throw new Error(`Provider "${resource[ResourceKind]}" not found`);
|
|
31
38
|
}
|
|
32
39
|
if (scope.phase === "read") {
|
|
33
40
|
if (state === undefined) {
|
|
34
41
|
throw new Error(
|
|
35
|
-
`Resource "${resource
|
|
42
|
+
`Resource "${resource[ResourceFQN]}" not found and running in 'read' phase.`,
|
|
36
43
|
);
|
|
37
44
|
}
|
|
38
45
|
return state.output as Awaited<Out>;
|
|
39
46
|
}
|
|
40
47
|
if (state === undefined) {
|
|
41
48
|
state = {
|
|
42
|
-
kind: resource
|
|
43
|
-
id: resource
|
|
44
|
-
fqn: resource
|
|
45
|
-
seq: resource
|
|
49
|
+
kind: resource[ResourceKind],
|
|
50
|
+
id: resource[ResourceID],
|
|
51
|
+
fqn: resource[ResourceFQN],
|
|
52
|
+
seq: resource[ResourceSeq],
|
|
46
53
|
status: "creating",
|
|
47
54
|
data: {},
|
|
48
55
|
output: {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
[ResourceID]: resource[ResourceID],
|
|
57
|
+
[ResourceFQN]: resource[ResourceFQN],
|
|
58
|
+
[ResourceKind]: resource[ResourceKind],
|
|
59
|
+
[ResourceScope]: scope,
|
|
60
|
+
[ResourceSeq]: resource[ResourceSeq],
|
|
54
61
|
},
|
|
55
62
|
// deps: [...deps],
|
|
56
63
|
props,
|
|
57
64
|
};
|
|
58
|
-
await scope.state.set(resource
|
|
65
|
+
await scope.state.set(resource[ResourceID], state);
|
|
59
66
|
}
|
|
60
67
|
|
|
61
68
|
const alwaysUpdate =
|
|
@@ -87,27 +94,27 @@ export async function apply<Out extends Resource>(
|
|
|
87
94
|
|
|
88
95
|
if (!quiet) {
|
|
89
96
|
console.log(
|
|
90
|
-
`${phase === "create" ? "Create" : "Update"}: "${resource
|
|
97
|
+
`${phase === "create" ? "Create" : "Update"}: "${resource[ResourceFQN]}"`,
|
|
91
98
|
);
|
|
92
99
|
}
|
|
93
100
|
|
|
94
|
-
await scope.state.set(resource
|
|
101
|
+
await scope.state.set(resource[ResourceID], state);
|
|
95
102
|
|
|
96
103
|
let isReplaced = false;
|
|
97
104
|
|
|
98
105
|
const ctx = context({
|
|
99
106
|
scope,
|
|
100
107
|
phase,
|
|
101
|
-
kind: resource
|
|
102
|
-
id: resource
|
|
103
|
-
fqn: resource
|
|
104
|
-
seq: resource
|
|
108
|
+
kind: resource[ResourceKind],
|
|
109
|
+
id: resource[ResourceID],
|
|
110
|
+
fqn: resource[ResourceFQN],
|
|
111
|
+
seq: resource[ResourceSeq],
|
|
105
112
|
props: state.oldProps,
|
|
106
113
|
state,
|
|
107
114
|
replace: () => {
|
|
108
115
|
if (isReplaced) {
|
|
109
116
|
console.warn(
|
|
110
|
-
`Resource ${resource
|
|
117
|
+
`Resource ${resource[ResourceKind]} ${resource[ResourceFQN]} is already marked as REPLACE`,
|
|
111
118
|
);
|
|
112
119
|
return;
|
|
113
120
|
}
|
|
@@ -116,23 +123,23 @@ export async function apply<Out extends Resource>(
|
|
|
116
123
|
});
|
|
117
124
|
|
|
118
125
|
const output = await alchemy.run(
|
|
119
|
-
resource
|
|
126
|
+
resource[ResourceID],
|
|
120
127
|
{
|
|
121
128
|
isResource: true,
|
|
122
129
|
},
|
|
123
|
-
async () => provider.handler.bind(ctx)(resource
|
|
130
|
+
async () => provider.handler.bind(ctx)(resource[ResourceID], props),
|
|
124
131
|
);
|
|
125
132
|
if (!quiet) {
|
|
126
133
|
console.log(
|
|
127
|
-
`${phase === "create" ? "Created" : "Updated"}: "${resource
|
|
134
|
+
`${phase === "create" ? "Created" : "Updated"}: "${resource[ResourceFQN]}"`,
|
|
128
135
|
);
|
|
129
136
|
}
|
|
130
137
|
|
|
131
|
-
await scope.state.set(resource
|
|
132
|
-
kind: resource
|
|
133
|
-
id: resource
|
|
134
|
-
fqn: resource
|
|
135
|
-
seq: resource
|
|
138
|
+
await scope.state.set(resource[ResourceID], {
|
|
139
|
+
kind: resource[ResourceKind],
|
|
140
|
+
id: resource[ResourceID],
|
|
141
|
+
fqn: resource[ResourceFQN],
|
|
142
|
+
seq: resource[ResourceSeq],
|
|
136
143
|
data: state.data,
|
|
137
144
|
status: phase === "create" ? "created" : "updated",
|
|
138
145
|
output,
|