alchemy 2.0.0-beta.13 → 2.0.0-beta.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/bin/alchemy.js +8386 -8205
- package/bin/alchemy.js.map +1 -1
- package/bin/alchemy.ts +4 -2
- package/bin/cli.js +61 -0
- package/bin/commands/deploy.ts +6 -3
- package/bin/commands/login.ts +1 -1
- package/bin/commands/logs.ts +1 -1
- package/bin/commands/state.ts +230 -0
- package/bin/commands/tail.ts +1 -1
- package/lib/AWS/AutoScaling/LaunchTemplate.d.ts +1 -1
- package/lib/AWS/EC2/Instance.d.ts +1 -1
- package/lib/AWS/EC2/hosted.d.ts +2 -2
- package/lib/AWS/ECS/Task.d.ts +4 -4
- package/lib/AWS/ECS/Task.d.ts.map +1 -1
- package/lib/AWS/ECS/Task.js +2 -2
- package/lib/AWS/ECS/Task.js.map +1 -1
- package/lib/AWS/Environment.d.ts +2 -2
- package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.d.ts +2 -2
- package/lib/AWS/Lambda/Function.d.ts.map +1 -1
- package/lib/AWS/Lambda/Function.js +1 -2
- package/lib/AWS/Lambda/Function.js.map +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
- package/lib/AWS/SQS/QueueSink.d.ts.map +1 -1
- package/lib/AWS/SQS/QueueSink.js +1 -2
- package/lib/AWS/SQS/QueueSink.js.map +1 -1
- package/lib/Agent/coding/bash.d.ts +2 -6
- package/lib/Agent/coding/bash.d.ts.map +1 -1
- package/lib/Agent/coding/bash.js +2 -3
- package/lib/Agent/coding/bash.js.map +1 -1
- package/lib/Agent/coding/edit.d.ts +1 -1
- package/lib/Agent/coding/glob.d.ts +2 -4
- package/lib/Agent/coding/glob.d.ts.map +1 -1
- package/lib/Agent/coding/glob.js +1 -2
- package/lib/Agent/coding/glob.js.map +1 -1
- package/lib/Agent/coding/grep.d.ts +2 -4
- package/lib/Agent/coding/grep.d.ts.map +1 -1
- package/lib/Agent/coding/grep.js +1 -2
- package/lib/Agent/coding/grep.js.map +1 -1
- package/lib/Agent/coding/read.d.ts +1 -1
- package/lib/Agent/coding/write.d.ts +1 -1
- package/lib/Agent/util/ripgrep.d.ts +2 -2
- package/lib/AlchemyContext.d.ts +13 -0
- package/lib/AlchemyContext.d.ts.map +1 -0
- package/lib/AlchemyContext.js +18 -0
- package/lib/AlchemyContext.js.map +1 -0
- package/lib/Auth/AuthProvider.js +1 -1
- package/lib/Auth/AuthProvider.js.map +1 -1
- package/lib/Auth/Profile.d.ts +1 -1
- package/lib/Auth/index.d.ts +3 -1
- package/lib/Auth/index.d.ts.map +1 -1
- package/lib/Auth/index.js +3 -0
- package/lib/Auth/index.js.map +1 -1
- package/lib/Build/Command.d.ts +1 -1
- package/lib/Build/Memo.d.ts +1 -1
- package/lib/Bundle/Docker.d.ts +3 -3
- package/lib/Bundle/TempRoot.d.ts +3 -3
- package/lib/Cli/InkCLI.d.ts +1 -0
- package/lib/Cli/InkCLI.d.ts.map +1 -1
- package/lib/Cli/InkCLI.js +5 -0
- package/lib/Cli/InkCLI.js.map +1 -1
- package/lib/Cli/LoggingCli.d.ts +4 -0
- package/lib/Cli/LoggingCli.d.ts.map +1 -0
- package/lib/{Test/TestCli.js → Cli/LoggingCli.js} +3 -3
- package/lib/Cli/LoggingCli.js.map +1 -0
- package/lib/Cloudflare/CloudflareEnvironment.d.ts +1 -1
- package/lib/Cloudflare/Container/ContainerApplication.d.ts +2 -2
- package/lib/Cloudflare/Container/ContainerApplication.d.ts.map +1 -1
- package/lib/Cloudflare/Container/ContainerApplication.js +7 -2
- package/lib/Cloudflare/Container/ContainerApplication.js.map +1 -1
- package/lib/Cloudflare/EdgeSession.d.ts +53 -0
- package/lib/Cloudflare/EdgeSession.d.ts.map +1 -0
- package/lib/Cloudflare/EdgeSession.js +78 -0
- package/lib/Cloudflare/EdgeSession.js.map +1 -0
- package/lib/Cloudflare/Providers.d.ts +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/Api.d.ts +62 -0
- package/lib/Cloudflare/StateStore/Api.d.ts.map +1 -0
- package/lib/Cloudflare/StateStore/Api.js +101 -0
- package/lib/Cloudflare/StateStore/Api.js.map +1 -0
- package/lib/Cloudflare/StateStore/State.d.ts +39 -0
- package/lib/Cloudflare/StateStore/State.d.ts.map +1 -0
- package/lib/Cloudflare/StateStore/State.js +217 -0
- package/lib/Cloudflare/StateStore/State.js.map +1 -0
- package/lib/Cloudflare/StateStore/Store.d.ts +82 -0
- package/lib/Cloudflare/StateStore/Store.d.ts.map +1 -0
- package/lib/Cloudflare/StateStore/Store.js +189 -0
- package/lib/Cloudflare/StateStore/Store.js.map +1 -0
- package/lib/Cloudflare/StateStore/Token.d.ts +41 -0
- package/lib/Cloudflare/StateStore/Token.d.ts.map +1 -0
- package/lib/Cloudflare/StateStore/Token.js +57 -0
- package/lib/Cloudflare/StateStore/Token.js.map +1 -0
- package/lib/Cloudflare/StateStore/index.d.ts +2 -0
- package/lib/Cloudflare/StateStore/index.d.ts.map +1 -0
- package/lib/Cloudflare/StateStore/index.js +2 -0
- package/lib/Cloudflare/StateStore/index.js.map +1 -0
- package/lib/Cloudflare/Workers/Assets.d.ts +2 -2
- package/lib/Cloudflare/Workers/DurableObjectNamespace.d.ts +2 -2
- package/lib/Cloudflare/Workers/DurableObjectNamespace.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectNamespace.js +0 -1
- package/lib/Cloudflare/Workers/DurableObjectNamespace.js.map +1 -1
- package/lib/Cloudflare/Workers/HttpServer.d.ts +1 -1
- package/lib/Cloudflare/Workers/HttpServer.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/HttpServer.js.map +1 -1
- package/lib/Cloudflare/Workers/Worker.d.ts +5 -5
- package/lib/Cloudflare/Workers/Worker.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Worker.js +0 -1
- package/lib/Cloudflare/Workers/Worker.js.map +1 -1
- package/lib/Cloudflare/index.d.ts +3 -1
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +3 -1
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Deploy.d.ts +10 -0
- package/lib/Deploy.d.ts.map +1 -0
- package/lib/Deploy.js +12 -0
- package/lib/Deploy.js.map +1 -0
- package/lib/Destroy.d.ts +8 -3
- package/lib/Destroy.d.ts.map +1 -1
- package/lib/Destroy.js +8 -8
- package/lib/Destroy.js.map +1 -1
- package/lib/Http.d.ts +1 -1
- package/lib/Http.d.ts.map +1 -1
- package/lib/Http.js +7 -3
- package/lib/Http.js.map +1 -1
- package/lib/Kubernetes/client.d.ts +10 -10
- package/lib/Output.d.ts.map +1 -1
- package/lib/Output.js.map +1 -1
- package/lib/Platform.d.ts +2 -2
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js.map +1 -1
- package/lib/Provider.d.ts.map +1 -1
- package/lib/Provider.js +0 -1
- package/lib/Provider.js.map +1 -1
- package/lib/Stack.d.ts +23 -12
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +32 -14
- package/lib/Stack.js.map +1 -1
- package/lib/State/HttpStateApi.d.ts +96 -0
- package/lib/State/HttpStateApi.d.ts.map +1 -0
- package/lib/State/HttpStateApi.js +96 -0
- package/lib/State/HttpStateApi.js.map +1 -0
- package/lib/State/HttpStateStore.d.ts +10 -0
- package/lib/State/HttpStateStore.d.ts.map +1 -0
- package/lib/State/HttpStateStore.js +102 -0
- package/lib/State/HttpStateStore.js.map +1 -0
- package/lib/State/InMemoryState.d.ts +2 -30
- package/lib/State/InMemoryState.d.ts.map +1 -1
- package/lib/State/InMemoryState.js +23 -18
- package/lib/State/InMemoryState.js.map +1 -1
- package/lib/State/LocalState.d.ts +4 -2
- package/lib/State/LocalState.d.ts.map +1 -1
- package/lib/State/LocalState.js +9 -41
- package/lib/State/LocalState.js.map +1 -1
- package/lib/State/State.d.ts +11 -4
- package/lib/State/State.d.ts.map +1 -1
- package/lib/State/State.js +1 -1
- package/lib/State/State.js.map +1 -1
- package/lib/State/StateEncoding.d.ts +31 -0
- package/lib/State/StateEncoding.d.ts.map +1 -0
- package/lib/State/StateEncoding.js +82 -0
- package/lib/State/StateEncoding.js.map +1 -0
- package/lib/State/Sync.d.ts +23 -0
- package/lib/State/Sync.d.ts.map +1 -0
- package/lib/State/Sync.js +49 -0
- package/lib/State/Sync.js.map +1 -0
- package/lib/State/index.d.ts +4 -0
- package/lib/State/index.d.ts.map +1 -1
- package/lib/State/index.js +4 -0
- package/lib/State/index.js.map +1 -1
- package/lib/Test/Bun.d.ts +13 -17
- package/lib/Test/Bun.d.ts.map +1 -1
- package/lib/Test/Bun.js +16 -33
- package/lib/Test/Bun.js.map +1 -1
- package/lib/Test/TestState.d.ts +1 -2
- package/lib/Test/TestState.d.ts.map +1 -1
- package/lib/Test/TestState.js +5 -9
- package/lib/Test/TestState.js.map +1 -1
- package/lib/Test/Vitest.d.ts +3 -2
- package/lib/Test/Vitest.d.ts.map +1 -1
- package/lib/Test/Vitest.js +20 -15
- package/lib/Test/Vitest.js.map +1 -1
- package/lib/Test/index.d.ts +0 -1
- package/lib/Test/index.d.ts.map +1 -1
- package/lib/Test/index.js +0 -1
- package/lib/Test/index.js.map +1 -1
- package/lib/Util/FileLogger.d.ts +2 -2
- package/lib/Util/FileLogger.d.ts.map +1 -1
- package/lib/Util/FileLogger.js +2 -2
- package/lib/Util/FileLogger.js.map +1 -1
- package/lib/cli/index.d.ts +10 -1
- package/lib/cli/index.d.ts.map +1 -1
- package/lib/cli/index.js +9 -4
- package/lib/cli/index.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/package.json +26 -11
- package/src/AWS/ECS/Task.ts +4 -4
- package/src/AWS/Lambda/Function.ts +2 -3
- package/src/AWS/SQS/QueueSink.ts +1 -2
- package/src/Agent/coding/bash.ts +2 -3
- package/src/Agent/coding/glob.ts +1 -2
- package/src/Agent/coding/grep.ts +1 -2
- package/src/AlchemyContext.ts +27 -0
- package/src/Auth/AuthProvider.ts +1 -1
- package/src/Auth/index.ts +3 -1
- package/src/Cli/InkCLI.tsx +10 -0
- package/src/{Test/TestCli.ts → Cli/LoggingCli.ts} +2 -2
- package/src/Cloudflare/Container/ContainerApplication.ts +8 -2
- package/src/Cloudflare/EdgeSession.ts +144 -0
- package/src/Cloudflare/StateStore/Api.ts +157 -0
- package/src/Cloudflare/StateStore/State.ts +318 -0
- package/src/Cloudflare/StateStore/Store.ts +288 -0
- package/src/Cloudflare/StateStore/Token.ts +62 -0
- package/src/Cloudflare/StateStore/index.ts +1 -0
- package/src/Cloudflare/Workers/DurableObjectNamespace.ts +1 -6
- package/src/Cloudflare/Workers/HttpServer.ts +1 -1
- package/src/Cloudflare/Workers/Worker.ts +7 -7
- package/src/Cloudflare/index.ts +3 -1
- package/src/Deploy.ts +25 -0
- package/src/Destroy.ts +25 -13
- package/src/Http.ts +31 -16
- package/src/Output.ts +0 -2
- package/src/Platform.ts +8 -2
- package/src/Provider.ts +0 -2
- package/src/Stack.ts +122 -47
- package/src/State/HttpStateApi.ts +155 -0
- package/src/State/HttpStateStore.ts +155 -0
- package/src/State/InMemoryState.ts +15 -17
- package/src/State/LocalState.ts +13 -45
- package/src/State/State.ts +13 -4
- package/src/State/StateEncoding.ts +83 -0
- package/src/State/Sync.ts +89 -0
- package/src/State/index.ts +4 -0
- package/src/Test/Bun.ts +29 -87
- package/src/Test/TestState.ts +6 -8
- package/src/Test/Vitest.ts +32 -23
- package/src/Test/index.ts +0 -1
- package/src/Util/FileLogger.ts +2 -2
- package/src/index.ts +2 -1
- package/lib/Config.d.ts +0 -20
- package/lib/Config.d.ts.map +0 -1
- package/lib/Config.js +0 -22
- package/lib/Config.js.map +0 -1
- package/lib/Observability.d.ts +0 -2
- package/lib/Observability.d.ts.map +0 -1
- package/lib/Observability.js +0 -1
- package/lib/Observability.js.map +0 -1
- package/lib/Test/TestCli.d.ts +0 -4
- package/lib/Test/TestCli.d.ts.map +0 -1
- package/lib/Test/TestCli.js.map +0 -1
- package/src/Config.ts +0 -31
- package/src/Observability.ts +0 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Schedule from "effect/Schedule";
|
|
3
|
+
import * as HttpClient from "effect/unstable/http/HttpClient";
|
|
4
|
+
import * as HttpClientRequest from "effect/unstable/http/HttpClientRequest";
|
|
5
|
+
import * as HttpApiClient from "effect/unstable/httpapi/HttpApiClient";
|
|
6
|
+
import { StateApi } from "./HttpStateApi.js";
|
|
7
|
+
import { StateStoreError } from "./State.js";
|
|
8
|
+
import { encodeState, reviveStateRecursive } from "./StateEncoding.js";
|
|
9
|
+
export const makeHttpStateStore = ({ url, authToken }) => Effect.gen(function* () {
|
|
10
|
+
const apiClient = yield* HttpApiClient.make(StateApi, {
|
|
11
|
+
baseUrl: url,
|
|
12
|
+
transformClient: HttpClient.mapRequest(HttpClientRequest.bearerToken(authToken)),
|
|
13
|
+
});
|
|
14
|
+
const state = apiClient.state;
|
|
15
|
+
const service = {
|
|
16
|
+
listStacks: () => state.listStacks().pipe(Effect.map((stacks) => [...stacks]), mapStateStoreError),
|
|
17
|
+
listStages: (stack) => state.listStages({ params: { stack } }).pipe(mapStateStoreError),
|
|
18
|
+
list: (request) => state.listResources({ params: request }).pipe(mapStateStoreError),
|
|
19
|
+
get: (request) => state
|
|
20
|
+
.getState({
|
|
21
|
+
params: {
|
|
22
|
+
stack: request.stack,
|
|
23
|
+
stage: request.stage,
|
|
24
|
+
fqn: encodeURIComponent(request.fqn),
|
|
25
|
+
},
|
|
26
|
+
})
|
|
27
|
+
.pipe(Effect.map((s) => s == null
|
|
28
|
+
? undefined
|
|
29
|
+
: reviveStateRecursive(s)), mapStateStoreError),
|
|
30
|
+
getReplacedResources: (request) => state.getReplacedResources({ params: request }).pipe(Effect.map((resources) => resources.map((s) => reviveStateRecursive(s))), mapStateStoreError),
|
|
31
|
+
set: (request) => state
|
|
32
|
+
.setState({
|
|
33
|
+
params: {
|
|
34
|
+
stack: request.stack,
|
|
35
|
+
stage: request.stage,
|
|
36
|
+
fqn: encodeURIComponent(request.fqn),
|
|
37
|
+
},
|
|
38
|
+
payload: encodeState(request.value),
|
|
39
|
+
})
|
|
40
|
+
.pipe(
|
|
41
|
+
// Server echoes the stored value, but the client already
|
|
42
|
+
// has the canonical object (including any Redacted<T>
|
|
43
|
+
// instances); returning the input avoids a lossy round-trip.
|
|
44
|
+
Effect.map(() => request.value), mapStateStoreError),
|
|
45
|
+
delete: (request) => state
|
|
46
|
+
.deleteState({
|
|
47
|
+
params: {
|
|
48
|
+
stack: request.stack,
|
|
49
|
+
stage: request.stage,
|
|
50
|
+
fqn: encodeURIComponent(request.fqn),
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
.pipe(Effect.asVoid, mapStateStoreError),
|
|
54
|
+
deleteStack: (request) => state
|
|
55
|
+
.deleteStack({
|
|
56
|
+
params: { stack: request.stack },
|
|
57
|
+
query: request.stage === undefined ? {} : { stage: request.stage },
|
|
58
|
+
})
|
|
59
|
+
.pipe(Effect.asVoid, mapStateStoreError),
|
|
60
|
+
};
|
|
61
|
+
return service;
|
|
62
|
+
});
|
|
63
|
+
/**
|
|
64
|
+
* Predicate over an `HttpClientError`-shaped failure that returns `true`
|
|
65
|
+
* for failures we expect to clear up on their own.
|
|
66
|
+
*
|
|
67
|
+
* We retry:
|
|
68
|
+
* - all transport-level errors (no `response` — DNS, TCP reset, TLS,
|
|
69
|
+
* abort, etc.)
|
|
70
|
+
* - 408 (request timeout) and 429 (rate limit)
|
|
71
|
+
* - 404, which is normal in the seconds after a worker is first
|
|
72
|
+
* deployed and the route hasn't propagated yet
|
|
73
|
+
* - every 5xx
|
|
74
|
+
*
|
|
75
|
+
* Anything else (400/401/403/etc.) is a real client-side problem and
|
|
76
|
+
* shouldn't be hidden behind retries.
|
|
77
|
+
*/
|
|
78
|
+
const isTransient = (e) => {
|
|
79
|
+
if (e?._tag !== "HttpClientError")
|
|
80
|
+
return false;
|
|
81
|
+
const status = e.response?.status;
|
|
82
|
+
if (status == null)
|
|
83
|
+
return true;
|
|
84
|
+
if (status === 404 || status === 408 || status === 429)
|
|
85
|
+
return true;
|
|
86
|
+
return status >= 500 && status < 600;
|
|
87
|
+
};
|
|
88
|
+
const retryTransient = (eff) => Effect.retry(eff, {
|
|
89
|
+
while: isTransient,
|
|
90
|
+
// Exponential backoff capped at 2s, no attempt limit. The state
|
|
91
|
+
// store is on the deploy critical path; we'd rather block than
|
|
92
|
+
// surface a transient blip as a hard failure (which historically
|
|
93
|
+
// stranded `syncState` mid-flight, leaving the remote store
|
|
94
|
+
// partially populated).
|
|
95
|
+
schedule: Schedule.exponential(100).pipe(Schedule.either(Schedule.spaced("2 seconds"))),
|
|
96
|
+
});
|
|
97
|
+
/** Collapse any client failure into a {@link StateStoreError}. */
|
|
98
|
+
const mapStateStoreError = (eff) => eff.pipe(retryTransient, Effect.catch((e) => Effect.fail(new StateStoreError({
|
|
99
|
+
message: e instanceof Error ? e.message : String(e),
|
|
100
|
+
cause: e instanceof Error ? e : undefined,
|
|
101
|
+
}))));
|
|
102
|
+
//# sourceMappingURL=HttpStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpStateStore.js","sourceRoot":"","sources":["../../src/State/HttpStateStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,10 @@
|
|
|
1
|
-
import * as Effect from "effect/Effect";
|
|
2
1
|
import * as Layer from "effect/Layer";
|
|
3
2
|
import type { ResourceState } from "./ResourceState.ts";
|
|
4
3
|
import { State } from "./State.ts";
|
|
5
4
|
type StackId = string;
|
|
6
5
|
type StageId = string;
|
|
7
6
|
type Fqn = string;
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const InMemoryService: (
|
|
10
|
-
listStacks: () => Effect.Effect<string[], never, never>;
|
|
11
|
-
listStages: (stack: string) => Effect.Effect<string[], never, never>;
|
|
12
|
-
get: ({ stack, stage, fqn, }: {
|
|
13
|
-
stack: string;
|
|
14
|
-
stage: string;
|
|
15
|
-
fqn: string;
|
|
16
|
-
}) => Effect.Effect<ResourceState, never, never>;
|
|
17
|
-
getReplacedResources: ({ stack, stage, }: {
|
|
18
|
-
stack: string;
|
|
19
|
-
stage: string;
|
|
20
|
-
}) => Effect.Effect<import("./ResourceState.ts").ReplacedResourceState[], never, never>;
|
|
21
|
-
set: <V extends ResourceState>({ stack, stage, fqn, value, }: {
|
|
22
|
-
stack: string;
|
|
23
|
-
stage: string;
|
|
24
|
-
fqn: string;
|
|
25
|
-
value: V;
|
|
26
|
-
}) => Effect.Effect<V, never, never>;
|
|
27
|
-
delete: ({ stack, stage, fqn, }: {
|
|
28
|
-
stack: string;
|
|
29
|
-
stage: string;
|
|
30
|
-
fqn: string;
|
|
31
|
-
}) => Effect.Effect<boolean, never, never>;
|
|
32
|
-
list: ({ stack, stage }: {
|
|
33
|
-
stack: string;
|
|
34
|
-
stage: string;
|
|
35
|
-
}) => Effect.Effect<string[], never, never>;
|
|
36
|
-
};
|
|
7
|
+
export declare const inMemoryState: (initialState?: Record<StackId, Record<StageId, Record<Fqn, ResourceState>>>) => Layer.Layer<State, never, never>;
|
|
8
|
+
export declare const InMemoryService: (state?: Record<StackId, Record<StageId, Record<Fqn, ResourceState>>>) => import("./State.ts").StateService;
|
|
37
9
|
export {};
|
|
38
10
|
//# sourceMappingURL=InMemoryState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryState.d.ts","sourceRoot":"","sources":["../../src/State/InMemoryState.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InMemoryState.d.ts","sourceRoot":"","sources":["../../src/State/InMemoryState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,KAAK,OAAO,GAAG,MAAM,CAAC;AACtB,KAAK,OAAO,GAAG,MAAM,CAAC;AACtB,KAAK,GAAG,GAAG,MAAM,CAAC;AAElB,eAAO,MAAM,aAAa,GACxB,eAAc,MAAM,CAClB,OAAO,EACP,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CACvC,qCACgD,CAAC;AAEzD,eAAO,MAAM,eAAe,GAC1B,QAAO,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAM,sCAkEtE,CAAC"}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import * as Layer from "effect/Layer";
|
|
3
3
|
import { State } from "./State.js";
|
|
4
|
-
export const
|
|
5
|
-
export const InMemoryService = (
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
4
|
+
export const inMemoryState = (initialState = {}) => Layer.succeed(State, InMemoryService(initialState));
|
|
5
|
+
export const InMemoryService = (state = {}) => State.of({
|
|
6
|
+
listStacks: () => Effect.succeed(Array.from(Object.keys(state))),
|
|
7
|
+
listStages: (stack) => Effect.succeed(Array.from(stack in state ? Object.keys(state[stack]) : [])),
|
|
8
|
+
get: ({ stack, stage, fqn, }) => Effect.succeed(state[stack]?.[stage]?.[fqn]),
|
|
9
|
+
getReplacedResources: ({ stack, stage, }) => Effect.succeed(Array.from(Object.values(state[stack]?.[stage] ?? {}) ?? []).filter((s) => s.status === "replaced")),
|
|
10
|
+
set: ({ stack, stage, fqn, value, }) => {
|
|
11
|
+
const stackState = (state[stack] ??= {});
|
|
12
|
+
const stageState = (stackState[stage] ??= {});
|
|
13
|
+
stageState[fqn] = value;
|
|
14
|
+
return Effect.succeed(value);
|
|
15
|
+
},
|
|
16
|
+
delete: ({ stack, stage, fqn, }) => Effect.succeed(delete state[stack]?.[stage]?.[fqn]),
|
|
17
|
+
deleteStack: ({ stack, stage }) => Effect.sync(() => {
|
|
18
|
+
if (stage === undefined) {
|
|
19
|
+
delete state[stack];
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
delete state[stack]?.[stage];
|
|
23
|
+
}
|
|
24
|
+
}),
|
|
25
|
+
list: ({ stack, stage }) => Effect.succeed(Array.from(Object.keys(state[stack]?.[stage] ?? {}) ?? [])),
|
|
26
|
+
});
|
|
22
27
|
//# sourceMappingURL=InMemoryState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryState.js","sourceRoot":"","sources":["../../src/State/InMemoryState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"InMemoryState.js","sourceRoot":"","sources":["../../src/State/InMemoryState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMnC,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,eAGI,EAAE,EACN,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAsE,EAAE,EACxE,EAAE,CACF,KAAK,CAAC,EAAE,CAAC;IACP,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE,CAC5B,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5D;IACH,GAAG,EAAE,CAAC,EACJ,KAAK,EACL,KAAK,EACL,GAAG,GAKJ,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAClD,oBAAoB,EAAE,CAAC,EACrB,KAAK,EACL,KAAK,GAIN,EAAE,EAAE,CACH,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CACjE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAC/B,CACF;IACH,GAAG,EAAE,CAA0B,EAC7B,KAAK,EACL,KAAK,EACL,GAAG,EACH,KAAK,GAMN,EAAE,EAAE;QACH,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9C,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACxB,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,EAAE,CAAC,EACP,KAAK,EACL,KAAK,EACL,GAAG,GAKJ,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACzD,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAqC,EAAE,EAAE,CACnE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IACJ,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAoC,EAAE,EAAE,CAC3D,MAAM,CAAC,OAAO,CACZ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAC3D;CACJ,CAAC,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
1
2
|
import * as FileSystem from "effect/FileSystem";
|
|
2
3
|
import * as Layer from "effect/Layer";
|
|
3
4
|
import * as Path from "effect/Path";
|
|
4
|
-
import { State } from "./State.ts";
|
|
5
|
-
export declare const
|
|
5
|
+
import { State, type StateService } from "./State.ts";
|
|
6
|
+
export declare const localState: () => Layer.Layer<State, never, Path.Path | FileSystem.FileSystem>;
|
|
7
|
+
export declare const makeLocalState: () => Effect.Effect<StateService, never, Path.Path | FileSystem.FileSystem>;
|
|
6
8
|
//# sourceMappingURL=LocalState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalState.d.ts","sourceRoot":"","sources":["../../src/State/LocalState.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LocalState.d.ts","sourceRoot":"","sources":["../../src/State/LocalState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAGpC,OAAO,EAAE,KAAK,EAAmB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAGvE,eAAO,MAAM,UAAU,oEAA8C,CAAC;AAEtE,eAAO,MAAM,cAAc,6EAuGvB,CAAC"}
|
package/lib/State/LocalState.js
CHANGED
|
@@ -2,48 +2,11 @@ import * as Effect from "effect/Effect";
|
|
|
2
2
|
import * as FileSystem from "effect/FileSystem";
|
|
3
3
|
import * as Layer from "effect/Layer";
|
|
4
4
|
import * as Path from "effect/Path";
|
|
5
|
-
import * as Redacted from "effect/Redacted";
|
|
6
5
|
import { decodeFqn, encodeFqn } from "../FQN.js";
|
|
7
|
-
import { isResource } from "../Resource.js";
|
|
8
6
|
import { State, StateStoreError } from "./State.js";
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
return value;
|
|
13
|
-
if (Redacted.isRedacted(value)) {
|
|
14
|
-
return {
|
|
15
|
-
[REDACTED_MARKER]: encodeState(Redacted.value(value)),
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
if (isResource(value)) {
|
|
19
|
-
return {
|
|
20
|
-
id: value.LogicalId,
|
|
21
|
-
type: value.Type,
|
|
22
|
-
props: encodeState(value.Props),
|
|
23
|
-
attr: encodeState(value.Attributes),
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
if (Array.isArray(value))
|
|
27
|
-
return value.map(encodeState);
|
|
28
|
-
if (typeof value === "object") {
|
|
29
|
-
const result = {};
|
|
30
|
-
for (const [k, v] of Object.entries(value)) {
|
|
31
|
-
result[k] = encodeState(v);
|
|
32
|
-
}
|
|
33
|
-
return result;
|
|
34
|
-
}
|
|
35
|
-
return value;
|
|
36
|
-
};
|
|
37
|
-
const reviveState = (_key, value) => {
|
|
38
|
-
if (value !== null &&
|
|
39
|
-
typeof value === "object" &&
|
|
40
|
-
!Array.isArray(value) &&
|
|
41
|
-
REDACTED_MARKER in value) {
|
|
42
|
-
return Redacted.make(value[REDACTED_MARKER]);
|
|
43
|
-
}
|
|
44
|
-
return value;
|
|
45
|
-
};
|
|
46
|
-
export const LocalState = Layer.effect(State, Effect.gen(function* () {
|
|
7
|
+
import { encodeState, reviveState } from "./StateEncoding.js";
|
|
8
|
+
export const localState = () => Layer.effect(State, makeLocalState());
|
|
9
|
+
export const makeLocalState = () => Effect.gen(function* () {
|
|
47
10
|
const fs = yield* FileSystem.FileSystem;
|
|
48
11
|
const path = yield* Path.Path;
|
|
49
12
|
const dotAlchemy = path.join(process.cwd(), ".alchemy");
|
|
@@ -74,9 +37,14 @@ export const LocalState = Layer.effect(State, Effect.gen(function* () {
|
|
|
74
37
|
}),
|
|
75
38
|
set: (request) => ensure(stageDir(request)).pipe(Effect.flatMap(() => fs.writeFileString(resource(request), JSON.stringify(encodeState(request.value), null, 2))), recover, Effect.map(() => request.value)),
|
|
76
39
|
delete: (request) => fs.remove(resource(request)).pipe(recover),
|
|
40
|
+
deleteStack: ({ stack, stage }) => fs
|
|
41
|
+
.remove(stage === undefined
|
|
42
|
+
? path.join(stateDir, stack)
|
|
43
|
+
: stageDir({ stack, stage }), { recursive: true })
|
|
44
|
+
.pipe(recover),
|
|
77
45
|
list: (request) => fs.readDirectory(stageDir(request)).pipe(recover, Effect.map((files) => files?.map((file) => decodeFqn(file.replace(/\.json$/, ""))) ??
|
|
78
46
|
[])),
|
|
79
47
|
};
|
|
80
48
|
return state;
|
|
81
|
-
})
|
|
49
|
+
});
|
|
82
50
|
//# sourceMappingURL=LocalState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalState.js","sourceRoot":"","sources":["../../src/State/LocalState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAEpC,OAAO,
|
|
1
|
+
{"version":3,"file":"LocalState.js","sourceRoot":"","sources":["../../src/State/LocalState.ts"],"names":[],"mappings":"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"}
|
package/lib/State/State.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export declare class StateStoreError extends StateStoreError_base<{
|
|
|
9
9
|
cause?: Error;
|
|
10
10
|
}> {
|
|
11
11
|
}
|
|
12
|
-
declare const State_base: Context.ServiceClass<State, "
|
|
12
|
+
declare const State_base: Context.ServiceClass<State, "alchemy/State", StateService>;
|
|
13
13
|
export declare class State extends State_base {
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
@@ -21,8 +21,8 @@ export declare class State extends State_base {
|
|
|
21
21
|
* for provider operations.
|
|
22
22
|
*/
|
|
23
23
|
export interface StateService {
|
|
24
|
-
listStacks(): Effect.Effect<string[], StateStoreError, never>;
|
|
25
|
-
listStages(stack: string): Effect.Effect<string[], StateStoreError, never>;
|
|
24
|
+
listStacks(): Effect.Effect<readonly string[], StateStoreError, never>;
|
|
25
|
+
listStages(stack: string): Effect.Effect<readonly string[], StateStoreError, never>;
|
|
26
26
|
/**
|
|
27
27
|
* Get a resource by its FQN (namespace-qualified key).
|
|
28
28
|
*/
|
|
@@ -58,13 +58,20 @@ export interface StateService {
|
|
|
58
58
|
stage: string;
|
|
59
59
|
fqn: string;
|
|
60
60
|
}): Effect.Effect<void, StateStoreError, never>;
|
|
61
|
+
/**
|
|
62
|
+
* Delete an entire stack, or a single stage when `stage` is provided.
|
|
63
|
+
*/
|
|
64
|
+
deleteStack(request: {
|
|
65
|
+
stack: string;
|
|
66
|
+
stage?: string;
|
|
67
|
+
}): Effect.Effect<void, StateStoreError, never>;
|
|
61
68
|
/**
|
|
62
69
|
* List all resource FQNs in a stack/stage.
|
|
63
70
|
*/
|
|
64
71
|
list(request: {
|
|
65
72
|
stack: string;
|
|
66
73
|
stage: string;
|
|
67
|
-
}): Effect.Effect<string[], StateStoreError, never>;
|
|
74
|
+
}): Effect.Effect<readonly string[], StateStoreError, never>;
|
|
68
75
|
}
|
|
69
76
|
export {};
|
|
70
77
|
//# sourceMappingURL=State.d.ts.map
|
package/lib/State/State.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"State.d.ts","sourceRoot":"","sources":["../../src/State/State.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;;;;AAE/E,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;CAAG;;AAEL,qBAAa,KAAM,SAAQ,UAE1B;CAAG;AAEJ;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"State.d.ts","sourceRoot":"","sources":["../../src/State/State.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;;;;AAE/E,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC;CAAG;;AAEL,qBAAa,KAAM,SAAQ,UAE1B;CAAG;AAEJ;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IACvE,UAAU,CACR,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IAC5D;;OAEG;IACH,GAAG,CAAC,OAAO,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,GAAG,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IACrE;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,MAAM,CAAC,MAAM,CACf,aAAa,CAAC,qBAAqB,CAAC,EACpC,eAAe,EACf,KAAK,CACN,CAAC;IACF;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,aAAa,EAAE,OAAO,EAAE;QACpC,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,CAAC,CAAC;KACV,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IAC7C;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IAChD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IAChD;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;CAC9D"}
|
package/lib/State/State.js
CHANGED
|
@@ -3,6 +3,6 @@ import * as Data from "effect/Data";
|
|
|
3
3
|
import * as Effect from "effect/Effect";
|
|
4
4
|
export class StateStoreError extends Data.TaggedError("StateStoreError") {
|
|
5
5
|
}
|
|
6
|
-
export class State extends Context.Service()("
|
|
6
|
+
export class State extends Context.Service()("alchemy/State") {
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=State.js.map
|
package/lib/State/State.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"State.js","sourceRoot":"","sources":["../../src/State/State.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;CAAG;AAEL,MAAM,OAAO,KAAM,SAAQ,OAAO,CAAC,OAAO,EAAuB,CAC/D,
|
|
1
|
+
{"version":3,"file":"State.js","sourceRoot":"","sources":["../../src/State/State.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAGrE;CAAG;AAEL,MAAM,OAAO,KAAM,SAAQ,OAAO,CAAC,OAAO,EAAuB,CAC/D,eAAe,CAChB;CAAG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON marker used to tag a `Redacted<T>` value when writing state.
|
|
3
|
+
* The reviver recognises objects with exactly this key and rebuilds
|
|
4
|
+
* the `Redacted` wrapper on read.
|
|
5
|
+
*/
|
|
6
|
+
export declare const REDACTED_MARKER = "__redacted__";
|
|
7
|
+
/**
|
|
8
|
+
* Recursively encode a state value for JSON serialisation.
|
|
9
|
+
*
|
|
10
|
+
* - `Redacted<T>` values are wrapped as `{ [REDACTED_MARKER]: <inner> }`
|
|
11
|
+
* so the actual string is persisted rather than the `<redacted>`
|
|
12
|
+
* placeholder produced by the default `toJSON`.
|
|
13
|
+
* - `Resource` instances are flattened to `{ id, type, props, attr }`
|
|
14
|
+
* so persisted state matches the schema used by the loader.
|
|
15
|
+
* - Plain objects and arrays are walked structurally.
|
|
16
|
+
*/
|
|
17
|
+
export declare const encodeState: (value: unknown) => unknown;
|
|
18
|
+
/**
|
|
19
|
+
* JSON reviver that rebuilds `Redacted<T>` values that were written
|
|
20
|
+
* through {@link encodeState}. Intended for use with `JSON.parse`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const reviveState: (_key: string, value: unknown) => unknown;
|
|
23
|
+
/**
|
|
24
|
+
* Recursively walk an already-decoded value and rebuild `Redacted<T>`
|
|
25
|
+
* instances from `{ [REDACTED_MARKER]: <inner> }` envelopes. Mirror
|
|
26
|
+
* image of {@link encodeState} for callers that hold a parsed JS
|
|
27
|
+
* value rather than a JSON string (e.g. the HTTP state-store client,
|
|
28
|
+
* which receives values pre-parsed by `HttpApiClient`).
|
|
29
|
+
*/
|
|
30
|
+
export declare const reviveStateRecursive: (value: unknown) => unknown;
|
|
31
|
+
//# sourceMappingURL=StateEncoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateEncoding.d.ts","sourceRoot":"","sources":["../../src/State/StateEncoding.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,OAwB5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,OAAO,OAAO,KAAG,OAU1D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,OAAO,OAAO,KAAG,OAarD,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as Redacted from "effect/Redacted";
|
|
2
|
+
import { isResource } from "../Resource.js";
|
|
3
|
+
/**
|
|
4
|
+
* JSON marker used to tag a `Redacted<T>` value when writing state.
|
|
5
|
+
* The reviver recognises objects with exactly this key and rebuilds
|
|
6
|
+
* the `Redacted` wrapper on read.
|
|
7
|
+
*/
|
|
8
|
+
export const REDACTED_MARKER = "__redacted__";
|
|
9
|
+
/**
|
|
10
|
+
* Recursively encode a state value for JSON serialisation.
|
|
11
|
+
*
|
|
12
|
+
* - `Redacted<T>` values are wrapped as `{ [REDACTED_MARKER]: <inner> }`
|
|
13
|
+
* so the actual string is persisted rather than the `<redacted>`
|
|
14
|
+
* placeholder produced by the default `toJSON`.
|
|
15
|
+
* - `Resource` instances are flattened to `{ id, type, props, attr }`
|
|
16
|
+
* so persisted state matches the schema used by the loader.
|
|
17
|
+
* - Plain objects and arrays are walked structurally.
|
|
18
|
+
*/
|
|
19
|
+
export const encodeState = (value) => {
|
|
20
|
+
if (value === null || value === undefined)
|
|
21
|
+
return value;
|
|
22
|
+
if (Redacted.isRedacted(value)) {
|
|
23
|
+
return {
|
|
24
|
+
[REDACTED_MARKER]: encodeState(Redacted.value(value)),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (isResource(value)) {
|
|
28
|
+
return {
|
|
29
|
+
id: value.LogicalId,
|
|
30
|
+
type: value.Type,
|
|
31
|
+
props: encodeState(value.Props),
|
|
32
|
+
attr: encodeState(value.Attributes),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(value))
|
|
36
|
+
return value.map(encodeState);
|
|
37
|
+
if (typeof value === "object") {
|
|
38
|
+
const result = {};
|
|
39
|
+
for (const [k, v] of Object.entries(value)) {
|
|
40
|
+
result[k] = encodeState(v);
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* JSON reviver that rebuilds `Redacted<T>` values that were written
|
|
48
|
+
* through {@link encodeState}. Intended for use with `JSON.parse`.
|
|
49
|
+
*/
|
|
50
|
+
export const reviveState = (_key, value) => {
|
|
51
|
+
if (value !== null &&
|
|
52
|
+
typeof value === "object" &&
|
|
53
|
+
!Array.isArray(value) &&
|
|
54
|
+
REDACTED_MARKER in value) {
|
|
55
|
+
return Redacted.make(value[REDACTED_MARKER]);
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Recursively walk an already-decoded value and rebuild `Redacted<T>`
|
|
61
|
+
* instances from `{ [REDACTED_MARKER]: <inner> }` envelopes. Mirror
|
|
62
|
+
* image of {@link encodeState} for callers that hold a parsed JS
|
|
63
|
+
* value rather than a JSON string (e.g. the HTTP state-store client,
|
|
64
|
+
* which receives values pre-parsed by `HttpApiClient`).
|
|
65
|
+
*/
|
|
66
|
+
export const reviveStateRecursive = (value) => {
|
|
67
|
+
if (value === null || typeof value !== "object")
|
|
68
|
+
return value;
|
|
69
|
+
if (Array.isArray(value))
|
|
70
|
+
return value.map(reviveStateRecursive);
|
|
71
|
+
const obj = value;
|
|
72
|
+
const keys = Object.keys(obj);
|
|
73
|
+
if (keys.length === 1 && keys[0] === REDACTED_MARKER) {
|
|
74
|
+
return Redacted.make(reviveStateRecursive(obj[REDACTED_MARKER]));
|
|
75
|
+
}
|
|
76
|
+
const result = {};
|
|
77
|
+
for (const [k, v] of Object.entries(obj)) {
|
|
78
|
+
result[k] = reviveStateRecursive(v);
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=StateEncoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateEncoding.js","sourceRoot":"","sources":["../../src/State/StateEncoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import { type StateService } from "./State.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Synchronize all state (every stack/stage/resource) from `source` into
|
|
5
|
+
* `destination` so that `destination` becomes a mirror of `source`.
|
|
6
|
+
*
|
|
7
|
+
* For each `{ stack, stage, fqn }` present in `source`, the resource is
|
|
8
|
+
* written into `destination`, overwriting any existing entry under the same
|
|
9
|
+
* key. Any keys present in `destination` but absent from `source` are
|
|
10
|
+
* deleted, ensuring the two stores end up structurally identical.
|
|
11
|
+
*
|
|
12
|
+
* Stacks are walked sequentially; stages within a stack and resources
|
|
13
|
+
* within a stage are processed concurrently for throughput.
|
|
14
|
+
*/
|
|
15
|
+
export declare const syncState: (source: StateService, destination: StateService, options?: {
|
|
16
|
+
stacks?: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Maximum number of resources to copy in parallel within a single stage.
|
|
19
|
+
* @default "unbounded".
|
|
20
|
+
*/
|
|
21
|
+
concurrency?: number | "unbounded";
|
|
22
|
+
} | undefined) => Effect.Effect<void, import("./State.ts").StateStoreError, never>;
|
|
23
|
+
//# sourceMappingURL=Sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sync.d.ts","sourceRoot":"","sources":["../../src/State/Sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS;aAIT,MAAM,EAAE;IACjB;;;OAGG;kBACW,MAAM,GAAG,WAAW;kFA4DpC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import {} from "./State.js";
|
|
3
|
+
/**
|
|
4
|
+
* Synchronize all state (every stack/stage/resource) from `source` into
|
|
5
|
+
* `destination` so that `destination` becomes a mirror of `source`.
|
|
6
|
+
*
|
|
7
|
+
* For each `{ stack, stage, fqn }` present in `source`, the resource is
|
|
8
|
+
* written into `destination`, overwriting any existing entry under the same
|
|
9
|
+
* key. Any keys present in `destination` but absent from `source` are
|
|
10
|
+
* deleted, ensuring the two stores end up structurally identical.
|
|
11
|
+
*
|
|
12
|
+
* Stacks are walked sequentially; stages within a stack and resources
|
|
13
|
+
* within a stage are processed concurrently for throughput.
|
|
14
|
+
*/
|
|
15
|
+
export const syncState = Effect.fnUntraced(function* (source, destination, options) {
|
|
16
|
+
const concurrency = options?.concurrency ?? "unbounded";
|
|
17
|
+
const [sourceStacks, destStacks] = yield* Effect.all([
|
|
18
|
+
source.listStacks(),
|
|
19
|
+
destination.listStacks(),
|
|
20
|
+
]);
|
|
21
|
+
const sourceStackSet = new Set(sourceStacks.filter((stack) => options?.stacks?.includes(stack) ?? true));
|
|
22
|
+
yield* Effect.forEach(sourceStacks, Effect.fnUntraced(function* (stack) {
|
|
23
|
+
const [sourceStages, destStages] = yield* Effect.all([
|
|
24
|
+
source.listStages(stack),
|
|
25
|
+
destination.listStages(stack),
|
|
26
|
+
]);
|
|
27
|
+
const stages = union(sourceStages, destStages);
|
|
28
|
+
yield* Effect.forEach(stages, Effect.fnUntraced(function* (stage) {
|
|
29
|
+
const sourceFqns = yield* source.list({ stack, stage });
|
|
30
|
+
const destFqns = yield* destination.list({ stack, stage });
|
|
31
|
+
const sourceSet = new Set(sourceFqns);
|
|
32
|
+
const toDelete = destFqns.filter((fqn) => !sourceSet.has(fqn));
|
|
33
|
+
yield* Effect.all([
|
|
34
|
+
Effect.forEach(sourceFqns, Effect.fnUntraced(function* (fqn) {
|
|
35
|
+
const value = yield* source.get({ stack, stage, fqn });
|
|
36
|
+
if (value) {
|
|
37
|
+
yield* destination.set({ stack, stage, fqn, value });
|
|
38
|
+
}
|
|
39
|
+
}), { concurrency }),
|
|
40
|
+
Effect.forEach(toDelete, (fqn) => destination.delete({ stack, stage, fqn }), { concurrency }),
|
|
41
|
+
], { concurrency: "unbounded" });
|
|
42
|
+
}), { concurrency: "unbounded" });
|
|
43
|
+
}));
|
|
44
|
+
yield* Effect.forEach(destStacks.filter((stack) => !sourceStackSet.has(stack)), (stack) => destination.deleteStack({ stack }));
|
|
45
|
+
});
|
|
46
|
+
const union = (left, right) => [
|
|
47
|
+
...new Set([...left, ...right]),
|
|
48
|
+
];
|
|
49
|
+
//# sourceMappingURL=Sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../src/State/Sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAqB,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAClD,MAAoB,EACpB,WAAyB,EACzB,OAOC;IAED,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,WAAW,CAAC;IACxD,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACnD,MAAM,CAAC,UAAU,EAAE;QACnB,WAAW,CAAC,UAAU,EAAE;KACzB,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CACzE,CAAC;IAEF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,YAAY,EACZ,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK;QAChC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACnD,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;YACxB,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC;SAC9B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAE/C,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,MAAM,EACN,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK;YAChC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAE/D,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACf;gBACE,MAAM,CAAC,OAAO,CACZ,UAAU,EACV,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG;oBAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACvD,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC,CAAC,EACF,EAAE,WAAW,EAAE,CAChB;gBACD,MAAM,CAAC,OAAO,CACZ,QAAQ,EACR,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAClD,EAAE,WAAW,EAAE,CAChB;aACF,EACD,EAAE,WAAW,EAAE,WAAW,EAAE,CAC7B,CAAC;QACJ,CAAC,CAAC,EACF,EAAE,WAAW,EAAE,WAAW,EAAE,CAC7B,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EACxD,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAC9C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,CAAI,IAAiB,EAAE,KAAkB,EAAE,EAAE,CAAC;IAC1D,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;CAChC,CAAC"}
|
package/lib/State/index.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
export * from "./HttpStateApi.ts";
|
|
2
|
+
export * from "./HttpStateStore.ts";
|
|
1
3
|
export * from "./InMemoryState.ts";
|
|
2
4
|
export * from "./LocalState.ts";
|
|
3
5
|
export * from "./ResourceState.ts";
|
|
4
6
|
export * from "./State.ts";
|
|
7
|
+
export * from "./StateEncoding.ts";
|
|
8
|
+
export * from "./Sync.ts";
|
|
5
9
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/State/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/State/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/State/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC"}
|