alchemy 0.29.1 → 0.29.3
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/cloudflare/bindings.d.ts +16 -3
- package/lib/cloudflare/bindings.d.ts.map +1 -1
- package/lib/cloudflare/bound.d.ts +3 -7
- package/lib/cloudflare/bound.d.ts.map +1 -1
- package/lib/cloudflare/secret.d.ts +4 -0
- package/lib/cloudflare/secret.d.ts.map +1 -1
- package/lib/cloudflare/secret.js +46 -7
- package/lib/cloudflare/secret.js.map +1 -1
- package/lib/cloudflare/secrets-store.d.ts +1 -7
- package/lib/cloudflare/secrets-store.d.ts.map +1 -1
- package/lib/cloudflare/secrets-store.js +2 -9
- package/lib/cloudflare/secrets-store.js.map +1 -1
- package/lib/cloudflare/worker-metadata.js +4 -4
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/wrangler.json.js +6 -10
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/destroy.d.ts.map +1 -1
- package/lib/destroy.js +2 -2
- package/lib/destroy.js.map +1 -1
- package/lib/scope.d.ts +5 -0
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +6 -1
- package/lib/scope.js.map +1 -1
- package/lib/secret.d.ts +8 -0
- package/lib/secret.d.ts.map +1 -1
- package/lib/secret.js +4 -2
- package/lib/secret.js.map +1 -1
- package/lib/serde.d.ts.map +1 -1
- package/lib/serde.js +5 -5
- package/lib/serde.js.map +1 -1
- package/package.json +1 -1
- package/src/cloudflare/bindings.ts +17 -2
- package/src/cloudflare/bound.ts +15 -23
- package/src/cloudflare/secret.ts +87 -7
- package/src/cloudflare/secrets-store.ts +3 -20
- package/src/cloudflare/worker-metadata.ts +4 -4
- package/src/cloudflare/wrangler.json.ts +6 -10
- package/src/destroy.ts +2 -2
- package/src/scope.ts +10 -1
- package/src/secret.ts +12 -2
- package/src/serde.ts +5 -5
package/lib/scope.js
CHANGED
|
@@ -5,11 +5,16 @@ import { ResourceID } from "./resource.js";
|
|
|
5
5
|
import { createDummyLogger, createLoggerInstance, } from "./util/cli.js";
|
|
6
6
|
// TODO: support browser
|
|
7
7
|
const DEFAULT_STAGE = process.env.ALCHEMY_STAGE ?? process.env.USER ?? "dev";
|
|
8
|
+
const ScopeSymbol = Symbol.for("alchemy::Scope");
|
|
9
|
+
export function isScope(value) {
|
|
10
|
+
return value instanceof Scope || value?.[ScopeSymbol] === true;
|
|
11
|
+
}
|
|
8
12
|
export class Scope {
|
|
13
|
+
[ScopeSymbol] = true;
|
|
9
14
|
static KIND = "alchemy::Scope";
|
|
10
15
|
static storage = (globalThis.__ALCHEMY_STORAGE__ ??=
|
|
11
16
|
new AsyncLocalStorage());
|
|
12
|
-
static globals = [];
|
|
17
|
+
static globals = (globalThis.__ALCHEMY_GLOBALS__ ??= []);
|
|
13
18
|
static get() {
|
|
14
19
|
const scope = Scope.storage.getStore();
|
|
15
20
|
if (!scope) {
|
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,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAwB,MAAM,eAAe,CAAC;AAEjE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,GAErB,MAAM,eAAe,CAAC;AAgBvB,wBAAwB;AACxB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
package/lib/secret.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
var __ALCHEMY_SECRETS__: {
|
|
3
|
+
[name: string]: Secret;
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
declare const SecretSymbol: unique symbol;
|
|
1
7
|
/**
|
|
2
8
|
* Internal wrapper for sensitive values like API keys and credentials.
|
|
3
9
|
* When stored in alchemy state files, the value is automatically encrypted
|
|
@@ -36,6 +42,7 @@
|
|
|
36
42
|
export declare class Secret {
|
|
37
43
|
readonly unencrypted: string;
|
|
38
44
|
readonly name: string;
|
|
45
|
+
[SecretSymbol]: boolean;
|
|
39
46
|
/**
|
|
40
47
|
* @internal
|
|
41
48
|
*/
|
|
@@ -84,4 +91,5 @@ export declare namespace secret {
|
|
|
84
91
|
}
|
|
85
92
|
const env: Env;
|
|
86
93
|
}
|
|
94
|
+
export {};
|
|
87
95
|
//# sourceMappingURL=secret.d.ts.map
|
package/lib/secret.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret.d.ts","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"secret.d.ts","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,mBAAmB,EAAE;QACvB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,CAAC;CACH;AAYD,QAAA,MAAM,YAAY,eAAgC,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,MAAM;IAYf,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAZvB,CAAC,YAAY,CAAC,UAAQ;IAEtB;;OAEG;WACW,GAAG,IAAI,MAAM,EAAE;IAI7B,SAAgB,IAAI,YAAY;gBAErB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,MAAmB;CAIrC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,IAAI,MAAM,CAKxD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EACjD,WAAW,EAAE,CAAC,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAKR;AAED,yBAAiB,MAAM,CAAC;IACtB,UAAiB,GAAG;QAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;KACjE;IAEM,MAAM,GAAG,EAGV,GAAG,CAAC;CAaX"}
|
package/lib/secret.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { alchemy } from "./alchemy.js";
|
|
2
2
|
// a global registry of all secrets that we will use when serializing an application
|
|
3
|
-
const globalSecrets = {};
|
|
3
|
+
const globalSecrets = (globalThis.__ALCHEMY_SECRETS__ ??= {});
|
|
4
4
|
let i = 0;
|
|
5
5
|
function nextName() {
|
|
6
6
|
return `alchemy:anonymous-secret-${i++}`;
|
|
7
7
|
}
|
|
8
|
+
const SecretSymbol = Symbol.for("alchemy::Secret");
|
|
8
9
|
/**
|
|
9
10
|
* Internal wrapper for sensitive values like API keys and credentials.
|
|
10
11
|
* When stored in alchemy state files, the value is automatically encrypted
|
|
@@ -43,6 +44,7 @@ function nextName() {
|
|
|
43
44
|
export class Secret {
|
|
44
45
|
unencrypted;
|
|
45
46
|
name;
|
|
47
|
+
[SecretSymbol] = true;
|
|
46
48
|
/**
|
|
47
49
|
* @internal
|
|
48
50
|
*/
|
|
@@ -61,7 +63,7 @@ export class Secret {
|
|
|
61
63
|
*/
|
|
62
64
|
export function isSecret(binding) {
|
|
63
65
|
return (binding instanceof Secret ||
|
|
64
|
-
(typeof binding === "object" && binding
|
|
66
|
+
(typeof binding === "object" && binding?.type === "secret"));
|
|
65
67
|
}
|
|
66
68
|
/**
|
|
67
69
|
* Wraps a sensitive value so it will be encrypted when stored in state files.
|
package/lib/secret.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC,oFAAoF;AACpF,MAAM,aAAa,GAEf,CAAC,UAAU,CAAC,mBAAmB,KAAK,EAAE,CAAC,CAAC;AAE5C,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,SAAS,QAAQ;IACf,OAAO,4BAA4B,CAAC,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,OAAO,MAAM;IAYN;IACA;IAZX,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAEtB;;OAEG;IACI,MAAM,CAAC,GAAG;QACf,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC;IAEe,IAAI,GAAG,QAAQ,CAAC;IAChC,YACW,WAAmB,EACnB,OAAe,QAAQ,EAAE;QADzB,gBAAW,GAAX,WAAW,CAAQ;QACnB,SAAI,GAAJ,IAAI,CAAqB;QAElC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAY;IACnC,OAAO,CACL,OAAO,YAAY,MAAM;QACzB,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,MAAM,CACpB,WAAc,EACd,IAAa;IAEb,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,WAAiB,MAAM;IAMR,UAAG,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE;QACjC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAC/D,CAAQ,CAAC;IAEV,KAAK,UAAU,IAAI,CACjB,IAAY,EACZ,KAAc,EACd,KAAc;QAEd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,kBAAkB,CAAC,CAAC;IACzE,CAAC;AACH,CAAC,EAtBgB,MAAM,KAAN,MAAM,QAsBtB"}
|
package/lib/serde.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serde.d.ts","sourceRoot":"","sources":["../src/serde.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EAEX,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,
|
|
1
|
+
{"version":3,"file":"serde.d.ts","sourceRoot":"","sources":["../src/serde.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EAEX,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAW,KAAK,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAY,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAWpC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,SACzB,SAAS,GACT,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,MAAM,GACN,CAAC,GACD,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GACtB;IACE,SAAS,EAAE,MAAM,CAAC;CACnB,GACD,CAAC,SAAS,MAAM,GACd;IACE,SAAS,EAAE,MAAM,CAAC;CACnB,GACD,CAAC,SAAS,IAAI,GACZ;IACE,OAAO,EAAE,MAAM,CAAC;CACjB,GACD,CAAC,SAAS,MAAM,GACd;IACE,SAAS,EAAE,MAAM,CAAC;CACnB,GACD,CAAC,SAAS,KAAK,GACb;IACE,QAAQ,EAAE,IAAI,CAAC;CAChB,GACD,CAAC,SAAS,QAAQ,GAChB,SAAS,GACT,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GACtB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GACpB,CAAC,SAAS,MAAM,GACd;KACG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,GAC7B,MAAM,GACN,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACzB,GACD,CAAC,CAAC;AAEtB,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,GAAG,EAAE,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;CAC1C,CAAC;AAEF,wBAAsB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC3E;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;CACjC,GACA,OAAO,CAAC,GAAG,CAAC,CAiEd;AAYD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KACnB,SAAS,GACT;QACE,KAAK,EAAE,GAAG,CAAC;KACZ,CAAC;CACP,GACA,OAAO,CAAC,GAAG,CAAC,CAwCd"}
|
package/lib/serde.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { decryptWithKey, encrypt } from "./encrypt.js";
|
|
2
2
|
import { InnerResourceScope, ResourceFQN, ResourceKind, } from "./resource.js";
|
|
3
|
-
import { Scope } from "./scope.js";
|
|
4
|
-
import { Secret } from "./secret.js";
|
|
3
|
+
import { isScope, Scope } from "./scope.js";
|
|
4
|
+
import { isSecret, Secret } from "./secret.js";
|
|
5
5
|
// zero-dependency type guard for ArkType
|
|
6
6
|
function isType(value) {
|
|
7
7
|
return (value &&
|
|
@@ -18,7 +18,7 @@ export async function serializeScope(scope) {
|
|
|
18
18
|
}
|
|
19
19
|
map[resource[ResourceFQN]] = await serialize(scope, await resource, {
|
|
20
20
|
transform: (value) => {
|
|
21
|
-
if (value
|
|
21
|
+
if (isSecret(value)) {
|
|
22
22
|
return {
|
|
23
23
|
"@secret-env": value.name,
|
|
24
24
|
};
|
|
@@ -42,7 +42,7 @@ export async function serialize(scope, value, options) {
|
|
|
42
42
|
if (Array.isArray(value)) {
|
|
43
43
|
return Promise.all(value.map((value) => serialize(scope, value, options)));
|
|
44
44
|
}
|
|
45
|
-
else if (value
|
|
45
|
+
else if (isSecret(value)) {
|
|
46
46
|
if (!scope.password) {
|
|
47
47
|
throw new Error("Cannot serialize secret without password, did you forget to set password when initializing your alchemy app?\n" +
|
|
48
48
|
"See: https://alchemy.run/docs/concepts/secret.html#encryption-password");
|
|
@@ -69,7 +69,7 @@ export async function serialize(scope, value, options) {
|
|
|
69
69
|
"@symbol": value.toString(),
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
-
else if (value
|
|
72
|
+
else if (isScope(value)) {
|
|
73
73
|
return {
|
|
74
74
|
"@scope": null,
|
|
75
75
|
};
|
package/lib/serde.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serde.js","sourceRoot":"","sources":["../src/serde.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,YAAY,GAEb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"serde.js","sourceRoot":"","sources":["../src/serde.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -18,13 +18,13 @@ import type { HyperdriveResource } from "./hyperdrive.ts";
|
|
|
18
18
|
import type { KVNamespaceResource } from "./kv-namespace.ts";
|
|
19
19
|
import type { PipelineResource } from "./pipeline.ts";
|
|
20
20
|
import type { QueueResource } from "./queue.ts";
|
|
21
|
-
import type { SecretsStore } from "./secrets-store.ts";
|
|
22
21
|
import type { VectorizeIndexResource } from "./vectorize-index.ts";
|
|
23
22
|
import type { VersionMetadata } from "./version-metadata.ts";
|
|
24
23
|
import type { WorkerStub } from "./worker-stub.ts";
|
|
25
24
|
import type { Worker, WorkerRef } from "./worker.ts";
|
|
26
25
|
import type { Workflow } from "./workflow.ts";
|
|
27
26
|
import type { Images } from "./images.ts";
|
|
27
|
+
import type { Secret as CloudflareSecret } from "./secret.ts";
|
|
28
28
|
|
|
29
29
|
export type Bindings = {
|
|
30
30
|
[bindingName: string]: Binding;
|
|
@@ -43,6 +43,7 @@ export type Binding =
|
|
|
43
43
|
| Ai
|
|
44
44
|
| AiGatewayResource
|
|
45
45
|
| Assets
|
|
46
|
+
| CloudflareSecret
|
|
46
47
|
| D1DatabaseResource
|
|
47
48
|
| DispatchNamespaceResource
|
|
48
49
|
| AnalyticsEngineDataset
|
|
@@ -53,7 +54,6 @@ export type Binding =
|
|
|
53
54
|
| PipelineResource
|
|
54
55
|
| QueueResource
|
|
55
56
|
| R2BucketResource
|
|
56
|
-
| SecretsStore<any>
|
|
57
57
|
| {
|
|
58
58
|
type: "kv_namespace";
|
|
59
59
|
id: string;
|
|
@@ -107,6 +107,7 @@ export type WorkerBindingSpec =
|
|
|
107
107
|
| WorkerBindingR2Bucket
|
|
108
108
|
| WorkerBindingSecretText
|
|
109
109
|
| WorkerBindingSecretsStore
|
|
110
|
+
| WorkerBindingSecretsStoreSecret
|
|
110
111
|
| WorkerBindingService
|
|
111
112
|
| WorkerBindingStaticContent
|
|
112
113
|
| WorkerBindingTailConsumer
|
|
@@ -313,6 +314,20 @@ export interface WorkerBindingSecretsStore {
|
|
|
313
314
|
secret_name: string;
|
|
314
315
|
}
|
|
315
316
|
|
|
317
|
+
/**
|
|
318
|
+
* Secrets Store Secret binding type for individual secrets
|
|
319
|
+
*/
|
|
320
|
+
export interface WorkerBindingSecretsStoreSecret {
|
|
321
|
+
/** The name of the binding */
|
|
322
|
+
name: string;
|
|
323
|
+
/** Type identifier for Secrets Store Secret binding */
|
|
324
|
+
type: "secrets_store_secret";
|
|
325
|
+
/** Store ID */
|
|
326
|
+
store_id: string;
|
|
327
|
+
/** Secret name */
|
|
328
|
+
secret_name: string;
|
|
329
|
+
}
|
|
330
|
+
|
|
316
331
|
/**
|
|
317
332
|
* Service binding type
|
|
318
333
|
*/
|
package/src/cloudflare/bound.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Pipeline } from "cloudflare:pipelines";
|
|
2
2
|
import type { Secret } from "../secret.ts";
|
|
3
|
+
import type { Secret as CloudflareSecret } from "./secret.ts";
|
|
3
4
|
import type { AiGatewayResource as _AiGateway } from "./ai-gateway.ts";
|
|
4
5
|
import type { Ai as _Ai } from "./ai.ts";
|
|
5
6
|
import type { AnalyticsEngineDataset as _AnalyticsEngineDataset } from "./analytics-engine.ts";
|
|
@@ -14,7 +15,6 @@ import type { HyperdriveResource as _Hyperdrive } from "./hyperdrive.ts";
|
|
|
14
15
|
import type { Images as _Images } from "./images.ts";
|
|
15
16
|
import type { PipelineResource as _Pipeline } from "./pipeline.ts";
|
|
16
17
|
import type { QueueResource as _Queue } from "./queue.ts";
|
|
17
|
-
import type { SecretsStore as _SecretsStore } from "./secrets-store.ts";
|
|
18
18
|
import type { VectorizeIndexResource as _VectorizeIndex } from "./vectorize-index.ts";
|
|
19
19
|
import type { VersionMetadata as _VersionMetadata } from "./version-metadata.ts";
|
|
20
20
|
import type { Worker as _Worker, WorkerRef } from "./worker.ts";
|
|
@@ -45,20 +45,20 @@ export type Bound<T extends Binding> = T extends _DurableObjectNamespace<
|
|
|
45
45
|
? Hyperdrive
|
|
46
46
|
: T extends Secret
|
|
47
47
|
? string
|
|
48
|
-
: T extends
|
|
49
|
-
?
|
|
50
|
-
: T extends
|
|
51
|
-
?
|
|
52
|
-
: T extends
|
|
53
|
-
?
|
|
54
|
-
: T extends
|
|
55
|
-
?
|
|
56
|
-
: T extends
|
|
57
|
-
?
|
|
58
|
-
: T extends
|
|
59
|
-
?
|
|
60
|
-
: T extends
|
|
61
|
-
?
|
|
48
|
+
: T extends CloudflareSecret
|
|
49
|
+
? string
|
|
50
|
+
: T extends Assets
|
|
51
|
+
? Service
|
|
52
|
+
: T extends _Workflow<infer P>
|
|
53
|
+
? Workflow<P>
|
|
54
|
+
: T extends D1DatabaseResource
|
|
55
|
+
? D1Database
|
|
56
|
+
: T extends DispatchNamespaceResource
|
|
57
|
+
? { get(name: string): Fetcher }
|
|
58
|
+
: T extends _VectorizeIndex
|
|
59
|
+
? VectorizeIndex
|
|
60
|
+
: T extends _Queue<infer Body>
|
|
61
|
+
? Queue<Body>
|
|
62
62
|
: T extends _AnalyticsEngineDataset
|
|
63
63
|
? AnalyticsEngineDataset
|
|
64
64
|
: T extends _Pipeline<infer R>
|
|
@@ -78,11 +78,3 @@ export type Bound<T extends Binding> = T extends _DurableObjectNamespace<
|
|
|
78
78
|
: T extends Json<infer T>
|
|
79
79
|
? T
|
|
80
80
|
: Service;
|
|
81
|
-
|
|
82
|
-
interface SecretsStoreBinding<
|
|
83
|
-
S extends Record<string, Secret> | undefined = undefined,
|
|
84
|
-
> {
|
|
85
|
-
get(
|
|
86
|
-
key: (S extends Record<string, any> ? keyof S : never) | (string & {}),
|
|
87
|
-
): Promise<string>;
|
|
88
|
-
}
|
package/src/cloudflare/secret.ts
CHANGED
|
@@ -74,6 +74,11 @@ export function isSecret(resource: Resource): resource is Secret {
|
|
|
74
74
|
export interface Secret
|
|
75
75
|
extends Resource<"cloudflare::Secret">,
|
|
76
76
|
Omit<_SecretProps, "delete"> {
|
|
77
|
+
/**
|
|
78
|
+
* The binding type for Cloudflare Workers
|
|
79
|
+
*/
|
|
80
|
+
type: "secrets_store_secret";
|
|
81
|
+
|
|
77
82
|
/**
|
|
78
83
|
* The name of the secret
|
|
79
84
|
*/
|
|
@@ -190,6 +195,7 @@ const _Secret = Resource(
|
|
|
190
195
|
await insertSecret(api, props.store.id, name, props.value);
|
|
191
196
|
|
|
192
197
|
return this({
|
|
198
|
+
type: "secrets_store_secret",
|
|
193
199
|
name,
|
|
194
200
|
storeId: props.store.id,
|
|
195
201
|
store: props.store,
|
|
@@ -209,24 +215,98 @@ export async function insertSecret(
|
|
|
209
215
|
secretName: string,
|
|
210
216
|
secretValue: AlchemySecret,
|
|
211
217
|
): Promise<void> {
|
|
212
|
-
|
|
218
|
+
// First try to create the secret
|
|
219
|
+
const createResponse = await api.post(
|
|
213
220
|
`/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets`,
|
|
214
221
|
[
|
|
215
222
|
{
|
|
216
223
|
name: secretName,
|
|
217
224
|
value: secretValue.unencrypted,
|
|
218
|
-
scopes: [],
|
|
225
|
+
scopes: ["workers"],
|
|
219
226
|
},
|
|
220
227
|
],
|
|
221
228
|
);
|
|
222
229
|
|
|
230
|
+
if (createResponse.ok) {
|
|
231
|
+
return; // Secret created successfully
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// If creation failed, check if it's because the secret already exists
|
|
235
|
+
const createErrorData: any = await createResponse.json().catch(() => ({
|
|
236
|
+
errors: [{ message: createResponse.statusText }],
|
|
237
|
+
}));
|
|
238
|
+
|
|
239
|
+
const isAlreadyExists = createErrorData.errors?.some(
|
|
240
|
+
(error: any) =>
|
|
241
|
+
error.code === 10021 ||
|
|
242
|
+
error.message?.includes("secret_name_already_exists"),
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
if (isAlreadyExists) {
|
|
246
|
+
// Secret already exists, find its ID and update it
|
|
247
|
+
const secretId = await getSecretId(api, storeId, secretName);
|
|
248
|
+
if (!secretId) {
|
|
249
|
+
throw new Error(`Secret '${secretName}' not found in store`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const updateResponse = await api.patch(
|
|
253
|
+
`/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets/${secretId}`,
|
|
254
|
+
{
|
|
255
|
+
value: secretValue.unencrypted,
|
|
256
|
+
scopes: ["workers"],
|
|
257
|
+
},
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
if (!updateResponse.ok) {
|
|
261
|
+
const updateErrorData: any = await updateResponse.json().catch(() => ({
|
|
262
|
+
errors: [{ message: updateResponse.statusText }],
|
|
263
|
+
}));
|
|
264
|
+
const updateErrorMessage =
|
|
265
|
+
updateErrorData.errors?.[0]?.message || updateResponse.statusText;
|
|
266
|
+
throw new Error(
|
|
267
|
+
`Error updating secret '${secretName}': ${updateErrorMessage}`,
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
} else {
|
|
271
|
+
// Some other error occurred during creation
|
|
272
|
+
const createErrorMessage =
|
|
273
|
+
createErrorData.errors?.[0]?.message || createResponse.statusText;
|
|
274
|
+
throw new Error(
|
|
275
|
+
`Error creating secret '${secretName}': ${createErrorMessage}`,
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Get the ID of a secret by its name
|
|
282
|
+
*/
|
|
283
|
+
async function getSecretId(
|
|
284
|
+
api: CloudflareApi,
|
|
285
|
+
storeId: string,
|
|
286
|
+
secretName: string,
|
|
287
|
+
): Promise<string | null> {
|
|
288
|
+
const response = await api.get(
|
|
289
|
+
`/accounts/${api.accountId}/secrets_store/stores/${storeId}/secrets`,
|
|
290
|
+
);
|
|
291
|
+
|
|
223
292
|
if (!response.ok) {
|
|
224
|
-
|
|
225
|
-
errors: [{ message: response.statusText }],
|
|
226
|
-
}));
|
|
227
|
-
const errorMessage = errorData.errors?.[0]?.message || response.statusText;
|
|
228
|
-
throw new Error(`Error creating secret '${secretName}': ${errorMessage}`);
|
|
293
|
+
return null;
|
|
229
294
|
}
|
|
295
|
+
|
|
296
|
+
const data = (await response.json()) as {
|
|
297
|
+
result: Array<{
|
|
298
|
+
id: string;
|
|
299
|
+
name: string;
|
|
300
|
+
created: string;
|
|
301
|
+
modified: string;
|
|
302
|
+
status: string;
|
|
303
|
+
}>;
|
|
304
|
+
success: boolean;
|
|
305
|
+
errors: any[];
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
const secret = data.result.find((s) => s.name === secretName);
|
|
309
|
+
return secret?.id || null;
|
|
230
310
|
}
|
|
231
311
|
|
|
232
312
|
/**
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Context } from "../context.ts";
|
|
2
2
|
import { Resource, ResourceKind } from "../resource.ts";
|
|
3
|
-
import { bind } from "../runtime/bind.ts";
|
|
4
3
|
import { secret, type Secret } from "../secret.ts";
|
|
5
4
|
import { handleApiError } from "./api-error.ts";
|
|
6
5
|
import {
|
|
@@ -8,7 +7,6 @@ import {
|
|
|
8
7
|
type CloudflareApi,
|
|
9
8
|
type CloudflareApiOptions,
|
|
10
9
|
} from "./api.ts";
|
|
11
|
-
import type { Bound } from "./bound.ts";
|
|
12
10
|
|
|
13
11
|
/**
|
|
14
12
|
* Properties for creating or updating a Secrets Store
|
|
@@ -66,11 +64,6 @@ export interface SecretsStore<
|
|
|
66
64
|
S extends Record<string, Secret> | undefined = undefined,
|
|
67
65
|
> extends Resource<"cloudflare::SecretsStore">,
|
|
68
66
|
Omit<SecretsStoreProps<S>, "delete"> {
|
|
69
|
-
/**
|
|
70
|
-
* The binding type for Cloudflare Workers
|
|
71
|
-
*/
|
|
72
|
-
type: "secrets_store";
|
|
73
|
-
|
|
74
67
|
/**
|
|
75
68
|
* The unique identifier of the secrets store
|
|
76
69
|
*/
|
|
@@ -98,10 +91,6 @@ export interface SecretsStore<
|
|
|
98
91
|
modifiedAt: number;
|
|
99
92
|
}
|
|
100
93
|
|
|
101
|
-
export type SecretsStoreWithBinding<
|
|
102
|
-
S extends Record<string, Secret> | undefined = undefined,
|
|
103
|
-
> = SecretsStore<S> & Bound<SecretsStore<S>>;
|
|
104
|
-
|
|
105
94
|
/**
|
|
106
95
|
* A Cloudflare Secrets Store is a secure, centralized location for storing account-level secrets.
|
|
107
96
|
*
|
|
@@ -162,7 +151,7 @@ export async function SecretsStore<
|
|
|
162
151
|
>(
|
|
163
152
|
name: string,
|
|
164
153
|
props: SecretsStoreProps<S> = {} as SecretsStoreProps<S>,
|
|
165
|
-
): Promise<
|
|
154
|
+
): Promise<SecretsStore<S>> {
|
|
166
155
|
// Convert string values to Secret instances
|
|
167
156
|
const normalizedProps: SecretsStoreProps<S> = {
|
|
168
157
|
...props,
|
|
@@ -176,12 +165,7 @@ export async function SecretsStore<
|
|
|
176
165
|
: undefined,
|
|
177
166
|
};
|
|
178
167
|
|
|
179
|
-
|
|
180
|
-
const binding = await bind(store);
|
|
181
|
-
return {
|
|
182
|
-
...store,
|
|
183
|
-
get: binding.get,
|
|
184
|
-
} as SecretsStoreWithBinding<S>;
|
|
168
|
+
return _SecretsStore(name, normalizedProps);
|
|
185
169
|
}
|
|
186
170
|
|
|
187
171
|
const _SecretsStore = Resource("cloudflare::SecretsStore", async function <
|
|
@@ -254,7 +238,6 @@ const _SecretsStore = Resource("cloudflare::SecretsStore", async function <
|
|
|
254
238
|
}
|
|
255
239
|
|
|
256
240
|
return this({
|
|
257
|
-
type: "secrets_store",
|
|
258
241
|
id: storeId,
|
|
259
242
|
name: name,
|
|
260
243
|
secrets: props.secrets as S,
|
|
@@ -345,7 +328,7 @@ export async function insertSecrets<
|
|
|
345
328
|
const bulkPayload = batch.map(([name, secretValue]) => ({
|
|
346
329
|
name,
|
|
347
330
|
value: (secretValue as Secret).unencrypted,
|
|
348
|
-
scopes: [],
|
|
331
|
+
scopes: ["workers"],
|
|
349
332
|
}));
|
|
350
333
|
|
|
351
334
|
const bulkResponse = await api.post(
|
|
@@ -387,12 +387,12 @@ export async function prepareWorkerMetadata<B extends Bindings>(
|
|
|
387
387
|
name: bindingName,
|
|
388
388
|
bucket_name: binding.name,
|
|
389
389
|
});
|
|
390
|
-
} else if (binding.type === "
|
|
390
|
+
} else if (binding.type === "secrets_store_secret") {
|
|
391
391
|
meta.bindings.push({
|
|
392
|
-
type: "
|
|
392
|
+
type: "secrets_store_secret",
|
|
393
393
|
name: bindingName,
|
|
394
|
-
store_id: binding.
|
|
395
|
-
secret_name:
|
|
394
|
+
store_id: binding.storeId,
|
|
395
|
+
secret_name: binding.name,
|
|
396
396
|
});
|
|
397
397
|
} else if (binding.type === "assets") {
|
|
398
398
|
meta.bindings.push({
|
|
@@ -596,16 +596,12 @@ function processBindings(
|
|
|
596
596
|
});
|
|
597
597
|
} else if (binding.type === "json") {
|
|
598
598
|
// TODO(sam): anything to do here? not sure wrangler.json supports this
|
|
599
|
-
} else if (binding.type === "
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
secret_name: secretName,
|
|
606
|
-
});
|
|
607
|
-
}
|
|
608
|
-
}
|
|
599
|
+
} else if (binding.type === "secrets_store_secret") {
|
|
600
|
+
secretsStoreSecrets.push({
|
|
601
|
+
binding: bindingName,
|
|
602
|
+
store_id: binding.storeId,
|
|
603
|
+
secret_name: binding.name,
|
|
604
|
+
});
|
|
609
605
|
} else if (binding.type === "dispatch_namespace") {
|
|
610
606
|
dispatchNamespaces.push({
|
|
611
607
|
binding: bindingName,
|
package/src/destroy.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
ResourceScope,
|
|
10
10
|
ResourceSeq,
|
|
11
11
|
} from "./resource.ts";
|
|
12
|
-
import { Scope } from "./scope.ts";
|
|
12
|
+
import { isScope, Scope } from "./scope.ts";
|
|
13
13
|
import { formatFQN } from "./util/cli.ts";
|
|
14
14
|
import { logger } from "./util/logger.ts";
|
|
15
15
|
|
|
@@ -21,7 +21,7 @@ export interface DestroyOptions {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
function isScopeArgs(a: any): a is [scope: Scope, options?: DestroyOptions] {
|
|
24
|
-
return a[0]
|
|
24
|
+
return isScope(a[0]);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
package/src/scope.ts
CHANGED
|
@@ -29,14 +29,23 @@ const DEFAULT_STAGE = process.env.ALCHEMY_STAGE ?? process.env.USER ?? "dev";
|
|
|
29
29
|
|
|
30
30
|
declare global {
|
|
31
31
|
var __ALCHEMY_STORAGE__: AsyncLocalStorage<Scope>;
|
|
32
|
+
var __ALCHEMY_GLOBALS__: Scope[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const ScopeSymbol = Symbol.for("alchemy::Scope");
|
|
36
|
+
|
|
37
|
+
export function isScope(value: any): value is Scope {
|
|
38
|
+
return value instanceof Scope || value?.[ScopeSymbol] === true;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
export class Scope {
|
|
42
|
+
readonly [ScopeSymbol] = true;
|
|
43
|
+
|
|
35
44
|
public static readonly KIND = "alchemy::Scope" as const;
|
|
36
45
|
|
|
37
46
|
public static storage = (globalThis.__ALCHEMY_STORAGE__ ??=
|
|
38
47
|
new AsyncLocalStorage<Scope>());
|
|
39
|
-
public static globals: Scope[] = [];
|
|
48
|
+
public static globals: Scope[] = (globalThis.__ALCHEMY_GLOBALS__ ??= []);
|
|
40
49
|
|
|
41
50
|
public static get(): Scope | undefined {
|
|
42
51
|
const scope = Scope.storage.getStore();
|