alchemy 0.22.3 → 0.23.0

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.
Files changed (178) hide show
  1. package/lib/aws/bucket.d.ts.map +1 -1
  2. package/lib/aws/bucket.js +13 -12
  3. package/lib/aws/bucket.js.map +1 -1
  4. package/lib/aws/control/client.d.ts.map +1 -1
  5. package/lib/aws/control/client.js +5 -3
  6. package/lib/aws/control/client.js.map +1 -1
  7. package/lib/aws/control/resource.d.ts.map +1 -1
  8. package/lib/aws/control/resource.js +13 -4
  9. package/lib/aws/control/resource.js.map +1 -1
  10. package/lib/aws/control/types.d.ts +85129 -0
  11. package/lib/aws/function.d.ts.map +1 -1
  12. package/lib/aws/function.js +51 -42
  13. package/lib/aws/function.js.map +1 -1
  14. package/lib/aws/index.d.ts +1 -0
  15. package/lib/aws/index.d.ts.map +1 -1
  16. package/lib/aws/index.js +1 -0
  17. package/lib/aws/index.js.map +1 -1
  18. package/lib/aws/policy-attachment.d.ts.map +1 -1
  19. package/lib/aws/policy-attachment.js +5 -4
  20. package/lib/aws/policy-attachment.js.map +1 -1
  21. package/lib/aws/policy.d.ts.map +1 -1
  22. package/lib/aws/policy.js +21 -20
  23. package/lib/aws/policy.js.map +1 -1
  24. package/lib/aws/queue.d.ts.map +1 -1
  25. package/lib/aws/queue.js +19 -15
  26. package/lib/aws/queue.js.map +1 -1
  27. package/lib/aws/retry.d.ts +5 -0
  28. package/lib/aws/retry.d.ts.map +1 -0
  29. package/lib/aws/retry.js +27 -0
  30. package/lib/aws/retry.js.map +1 -0
  31. package/lib/aws/role.d.ts.map +1 -1
  32. package/lib/aws/role.js +31 -30
  33. package/lib/aws/role.js.map +1 -1
  34. package/lib/aws/ses.d.ts.map +1 -1
  35. package/lib/aws/ses.js +27 -26
  36. package/lib/aws/ses.js.map +1 -1
  37. package/lib/aws/ssm-parameter.d.ts +150 -0
  38. package/lib/aws/ssm-parameter.d.ts.map +1 -0
  39. package/lib/aws/ssm-parameter.js +184 -0
  40. package/lib/aws/ssm-parameter.js.map +1 -0
  41. package/lib/aws/table.d.ts.map +1 -1
  42. package/lib/aws/table.js +9 -27
  43. package/lib/aws/table.js.map +1 -1
  44. package/lib/cloudflare/account-id.d.ts +1 -0
  45. package/lib/cloudflare/account-id.d.ts.map +1 -1
  46. package/lib/cloudflare/account-id.js.map +1 -1
  47. package/lib/cloudflare/api.d.ts.map +1 -1
  48. package/lib/cloudflare/api.js +22 -2
  49. package/lib/cloudflare/api.js.map +1 -1
  50. package/lib/cloudflare/bindings.d.ts +2 -1
  51. package/lib/cloudflare/bindings.d.ts.map +1 -1
  52. package/lib/cloudflare/bindings.js.map +1 -1
  53. package/lib/cloudflare/bound.d.ts +2 -1
  54. package/lib/cloudflare/bound.d.ts.map +1 -1
  55. package/lib/cloudflare/index.d.ts +2 -0
  56. package/lib/cloudflare/index.d.ts.map +1 -1
  57. package/lib/cloudflare/index.js +2 -0
  58. package/lib/cloudflare/index.js.map +1 -1
  59. package/lib/cloudflare/queue.d.ts.map +1 -1
  60. package/lib/cloudflare/queue.js +1 -0
  61. package/lib/cloudflare/queue.js.map +1 -1
  62. package/lib/cloudflare/route.d.ts +7 -0
  63. package/lib/cloudflare/route.d.ts.map +1 -1
  64. package/lib/cloudflare/route.js +44 -2
  65. package/lib/cloudflare/route.js.map +1 -1
  66. package/lib/cloudflare/version-metadata.d.ts +7 -0
  67. package/lib/cloudflare/version-metadata.d.ts.map +1 -0
  68. package/lib/cloudflare/version-metadata.js +7 -0
  69. package/lib/cloudflare/version-metadata.js.map +1 -0
  70. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  71. package/lib/cloudflare/worker-metadata.js +7 -2
  72. package/lib/cloudflare/worker-metadata.js.map +1 -1
  73. package/lib/cloudflare/worker.d.ts +2 -1
  74. package/lib/cloudflare/worker.d.ts.map +1 -1
  75. package/lib/cloudflare/worker.js +17 -8
  76. package/lib/cloudflare/worker.js.map +1 -1
  77. package/lib/cloudflare/workflow.d.ts +7 -0
  78. package/lib/cloudflare/workflow.d.ts.map +1 -1
  79. package/lib/cloudflare/workflow.js +2 -0
  80. package/lib/cloudflare/workflow.js.map +1 -1
  81. package/lib/cloudflare/wrangler.json.d.ts +7 -0
  82. package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
  83. package/lib/cloudflare/wrangler.json.js +14 -2
  84. package/lib/cloudflare/wrangler.json.js.map +1 -1
  85. package/lib/destroy.js +1 -1
  86. package/lib/destroy.js.map +1 -1
  87. package/lib/dns/godaddy.d.ts.map +1 -1
  88. package/lib/dns/godaddy.js +2 -1
  89. package/lib/dns/godaddy.js.map +1 -1
  90. package/lib/fs/file-system-state-store.d.ts.map +1 -1
  91. package/lib/fs/file-system-state-store.js +14 -2
  92. package/lib/fs/file-system-state-store.js.map +1 -1
  93. package/lib/fs/static-json-file.d.ts +1 -0
  94. package/lib/fs/static-json-file.d.ts.map +1 -1
  95. package/lib/fs/static-json-file.js +11 -8
  96. package/lib/fs/static-json-file.js.map +1 -1
  97. package/lib/github/secret.d.ts.map +1 -1
  98. package/lib/github/secret.js +1 -0
  99. package/lib/github/secret.js.map +1 -1
  100. package/lib/neon/api.d.ts.map +1 -1
  101. package/lib/neon/api.js +2 -1
  102. package/lib/neon/api.js.map +1 -1
  103. package/lib/runtime/shims.d.ts +6 -0
  104. package/lib/runtime/shims.d.ts.map +1 -0
  105. package/lib/runtime/shims.js +27 -0
  106. package/lib/runtime/shims.js.map +1 -0
  107. package/lib/sentry/api.d.ts.map +1 -1
  108. package/lib/sentry/api.js +2 -1
  109. package/lib/sentry/api.js.map +1 -1
  110. package/lib/test/bun.d.ts.map +1 -1
  111. package/lib/test/bun.js +1 -7
  112. package/lib/test/bun.js.map +1 -1
  113. package/lib/test/prune.d.ts +2 -1
  114. package/lib/test/prune.d.ts.map +1 -1
  115. package/lib/test/prune.js +29 -5
  116. package/lib/test/prune.js.map +1 -1
  117. package/lib/test/vitest.d.ts +92 -0
  118. package/lib/test/vitest.d.ts.map +1 -0
  119. package/lib/test/vitest.js +94 -0
  120. package/lib/test/vitest.js.map +1 -0
  121. package/lib/upstash/api.d.ts.map +1 -1
  122. package/lib/upstash/api.js +2 -1
  123. package/lib/upstash/api.js.map +1 -1
  124. package/lib/util/retry.js +2 -2
  125. package/lib/util/retry.js.map +1 -1
  126. package/lib/util/safe-fetch.d.ts +2 -0
  127. package/lib/util/safe-fetch.d.ts.map +1 -0
  128. package/lib/util/safe-fetch.js +48 -0
  129. package/lib/util/safe-fetch.js.map +1 -0
  130. package/lib/vercel/api.d.ts.map +1 -1
  131. package/lib/vercel/api.js +2 -1
  132. package/lib/vercel/api.js.map +1 -1
  133. package/lib/web/vitepress/process-front-matter-files.d.ts.map +1 -1
  134. package/lib/web/vitepress/process-front-matter-files.js +11 -7
  135. package/lib/web/vitepress/process-front-matter-files.js.map +1 -1
  136. package/package.json +12 -1
  137. package/src/alchemy.ts +2 -2
  138. package/src/aws/bucket.ts +55 -36
  139. package/src/aws/control/client.ts +13 -13
  140. package/src/aws/control/resource.ts +19 -3
  141. package/src/aws/function.ts +233 -178
  142. package/src/aws/index.ts +1 -0
  143. package/src/aws/policy-attachment.ts +15 -10
  144. package/src/aws/policy.ts +75 -54
  145. package/src/aws/queue.ts +53 -36
  146. package/src/aws/retry.ts +38 -0
  147. package/src/aws/role.ts +121 -90
  148. package/src/aws/ses.ts +101 -73
  149. package/src/aws/ssm-parameter.ts +315 -0
  150. package/src/aws/table.ts +61 -90
  151. package/src/cloudflare/account-id.ts +2 -0
  152. package/src/cloudflare/api.ts +26 -3
  153. package/src/cloudflare/bindings.ts +2 -0
  154. package/src/cloudflare/bound.ts +8 -5
  155. package/src/cloudflare/index.ts +2 -0
  156. package/src/cloudflare/queue.ts +2 -0
  157. package/src/cloudflare/route.ts +86 -2
  158. package/src/cloudflare/version-metadata.ts +6 -0
  159. package/src/cloudflare/worker-metadata.ts +6 -2
  160. package/src/cloudflare/worker.ts +21 -9
  161. package/src/cloudflare/workflow.ts +8 -0
  162. package/src/cloudflare/wrangler.json.ts +29 -3
  163. package/src/destroy.ts +1 -1
  164. package/src/dns/godaddy.ts +3 -1
  165. package/src/fs/file-system-state-store.ts +16 -2
  166. package/src/fs/static-json-file.ts +12 -8
  167. package/src/github/secret.ts +2 -0
  168. package/src/neon/api.ts +2 -1
  169. package/src/sentry/api.ts +2 -1
  170. package/src/test/bun.ts +1 -7
  171. package/src/test/prune.ts +31 -4
  172. package/src/test/vitest.ts +209 -0
  173. package/src/upstash/api.ts +2 -1
  174. package/src/util/retry.ts +3 -3
  175. package/src/util/safe-fetch.ts +61 -0
  176. package/src/vercel/api.ts +2 -1
  177. package/src/web/vitepress/process-front-matter-files.ts +15 -7
  178. package/lib/tsconfig.test.tsbuildinfo +0 -1
@@ -0,0 +1,92 @@
1
+ import { Scope } from "../scope.ts";
2
+ import type { StateStoreType } from "../state.ts";
3
+ /**
4
+ * Extend the Alchemy interface to include test functionality
5
+ */
6
+ declare module "../alchemy.ts" {
7
+ interface Alchemy {
8
+ test: typeof test;
9
+ }
10
+ }
11
+ /**
12
+ * Options for configuring test behavior
13
+ */
14
+ export interface TestOptions {
15
+ /**
16
+ * Whether to suppress logging output.
17
+ * @default false.
18
+ */
19
+ quiet?: boolean;
20
+ /**
21
+ * Password to use for test resources.
22
+ * @default "test-password".
23
+ */
24
+ password?: string;
25
+ /**
26
+ * Override the default state store for the test.
27
+ */
28
+ stateStore?: StateStoreType;
29
+ /**
30
+ * Prefix to use for the scope to isolate tests and environments.
31
+ */
32
+ prefix?: string;
33
+ }
34
+ /**
35
+ * Test function type definition with overloads
36
+ */
37
+ type test = {
38
+ /**
39
+ * Create a test with default options
40
+ * @param name Test name
41
+ * @param fn Test function
42
+ * @param timeout Optional timeout in milliseconds
43
+ */
44
+ (name: string, fn: (scope: Scope) => Promise<any>, timeout?: number): void;
45
+ /**
46
+ * Create a test with custom options
47
+ * @param name Test name
48
+ * @param options Test configuration options
49
+ * @param fn Test function
50
+ * @param timeout Optional timeout in milliseconds
51
+ */
52
+ (name: string, options: TestOptions, fn: (scope: Scope) => Promise<any>, timeout?: number): void;
53
+ /**
54
+ * Skip test conditionally
55
+ * @param condition If true, test will be skipped
56
+ */
57
+ skipIf(condition: boolean): test;
58
+ beforeAll(fn: (scope: Scope) => Promise<void>): void;
59
+ afterAll(fn: (scope: Scope) => Promise<void>): void;
60
+ /**
61
+ * Current test scope
62
+ */
63
+ scope: Scope;
64
+ };
65
+ /**
66
+ * Creates a test helper function that provides scoped resource management
67
+ *
68
+ * @param meta Import meta object from the test file
69
+ * @param defaultOptions Default options to apply to all tests
70
+ * @returns Test function with scope management
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const test = alchemy.test(import.meta, {
75
+ prefix: BRANCH_PREFIX
76
+ });
77
+ *
78
+ * describe("My Resource", () => {
79
+ * test("create and delete", async (scope) => {
80
+ * try {
81
+ * const resource = await MyResource("test", { ... });
82
+ * expect(resource.id).toBeTruthy();
83
+ * } finally {
84
+ * await alchemy.destroy(scope);
85
+ * }
86
+ * });
87
+ * });
88
+ * ```
89
+ */
90
+ export declare function test(meta: ImportMeta, defaultOptions?: TestOptions): test;
91
+ export {};
92
+ //# sourceMappingURL=vitest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/test/vitest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,OAAO;QACf,IAAI,EAAE,OAAO,IAAI,CAAC;KACnB;CACF;AAOD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAE5B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,KAAK,IAAI,GAAG;IACV;;;;;OAKG;IACH,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3E;;;;;;OAMG;IACH,CACE,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,EAClC,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAAC;IAER;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAEjC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAErD,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAEpD;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,WAAW,GAAG,IAAI,CA6FzE"}
@@ -0,0 +1,94 @@
1
+ import path from "node:path";
2
+ import { afterAll, beforeAll, it } from "vitest";
3
+ import { alchemy } from "../alchemy.js";
4
+ import { R2RestStateStore } from "../cloudflare/r2-rest-state-store.js";
5
+ import { Scope } from "../scope.js";
6
+ /**
7
+ * Add test functionality to alchemy instance
8
+ */
9
+ alchemy.test = test;
10
+ /**
11
+ * Creates a test helper function that provides scoped resource management
12
+ *
13
+ * @param meta Import meta object from the test file
14
+ * @param defaultOptions Default options to apply to all tests
15
+ * @returns Test function with scope management
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const test = alchemy.test(import.meta, {
20
+ prefix: BRANCH_PREFIX
21
+ });
22
+ *
23
+ * describe("My Resource", () => {
24
+ * test("create and delete", async (scope) => {
25
+ * try {
26
+ * const resource = await MyResource("test", { ... });
27
+ * expect(resource.id).toBeTruthy();
28
+ * } finally {
29
+ * await alchemy.destroy(scope);
30
+ * }
31
+ * });
32
+ * });
33
+ * ```
34
+ */
35
+ export function test(meta, defaultOptions) {
36
+ defaultOptions = defaultOptions ?? {};
37
+ if (defaultOptions.stateStore === undefined &&
38
+ process.env.ALCHEMY_STATE_STORE === "cloudflare") {
39
+ defaultOptions.stateStore = (scope) => new R2RestStateStore(scope, {
40
+ apiKey: alchemy.secret(process.env.CLOUDFLARE_API_KEY),
41
+ email: process.env.CLOUDFLARE_EMAIL,
42
+ bucketName: process.env.CLOUDFLARE_BUCKET_NAME,
43
+ });
44
+ }
45
+ test.skipIf = (condition) => {
46
+ if (condition) {
47
+ return (..._args) => { };
48
+ }
49
+ return test;
50
+ };
51
+ const scope = new Scope({
52
+ scopeName: `${defaultOptions.prefix ? `${defaultOptions.prefix}-` : ""}${path.basename(meta.filename)}`,
53
+ stateStore: defaultOptions?.stateStore,
54
+ phase: "up",
55
+ });
56
+ test.beforeAll = (fn) => {
57
+ return beforeAll(() => scope.run(() => fn(scope)));
58
+ };
59
+ test.afterAll = (fn) => {
60
+ return afterAll(() => scope.run(() => fn(scope)));
61
+ };
62
+ return test;
63
+ function test(...args) {
64
+ const testName = args[0];
65
+ const _options = typeof args[1] === "object" ? args[1] : undefined;
66
+ const timeout = typeof args[args.length - 1] === "number"
67
+ ? args[args.length - 1]
68
+ : 120000;
69
+ const spread = (obj) => obj && typeof obj === "object"
70
+ ? Object.fromEntries(Object.entries(obj).flatMap(([k, v]) => v !== undefined ? [[k, v]] : []))
71
+ : {};
72
+ const options = {
73
+ quiet: false,
74
+ password: "test-password",
75
+ ...spread(defaultOptions),
76
+ ...spread(_options),
77
+ };
78
+ const fn = typeof args[1] === "function" ? args[1] : args[2];
79
+ return it(testName, (ctx) => {
80
+ // Get the current describe block name from the test context
81
+ let describeBlockName = "";
82
+ if (ctx.task.suite?.name) {
83
+ describeBlockName = `${ctx.task.suite.name}/`;
84
+ }
85
+ return alchemy.run(`${describeBlockName}${testName}`, {
86
+ ...options,
87
+ parent: scope,
88
+ }, async (scope) => {
89
+ await scope.run(() => fn(scope));
90
+ });
91
+ }, timeout);
92
+ }
93
+ }
94
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/test/vitest.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/upstash/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,cAAc;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY;IACZ,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;gBACS,OAAO,GAAE,iBAAsB;IAe3C;;;;;;OAMG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmBpE;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGtE"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/upstash/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,cAAc;IACd,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY;IACZ,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;gBACS,OAAO,GAAE,iBAAsB;IAe3C;;;;;;OAMG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmBpE;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGtE"}
@@ -1,3 +1,4 @@
1
+ import { safeFetch } from "../util/safe-fetch.js";
1
2
  /**
2
3
  * Minimal API client using raw fetch
3
4
  */
@@ -43,7 +44,7 @@ export class UpstashApi {
43
44
  headers[key] = initHeaders[key];
44
45
  });
45
46
  }
46
- return fetch(`${this.baseUrl}${path}`, {
47
+ return safeFetch(`${this.baseUrl}${path}`, {
47
48
  ...init,
48
49
  headers,
49
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/upstash/api.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,OAAO,UAAU;IACrB,uBAAuB;IACd,OAAO,CAAS;IAEzB,cAAc;IACL,MAAM,CAAS;IAExB,YAAY;IACH,KAAK,CAAS;IAEvB;;;;OAIG;IACH,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,OAAO,GAAG,4BAA4B,CAAC;QAC5C,IAAI,CAAC,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;QACnE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;QAE9D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC9C,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;SAC/D,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAiC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACrC,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,IAAS,EACT,OAAoB,EAAE;QAEtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,GAAG,IAAI;YACP,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/upstash/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAiBlD;;GAEG;AACH,MAAM,OAAO,UAAU;IACrB,uBAAuB;IACd,OAAO,CAAS;IAEzB,cAAc;IACL,MAAM,CAAS;IAExB,YAAY;IACH,KAAK,CAAS;IAEvB;;;;OAIG;IACH,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,OAAO,GAAG,4BAA4B,CAAC;QAC5C,IAAI,CAAC,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;QACnE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;QAE9D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC9C,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;SAC/D,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAiC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACzC,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,IAAS,EACT,OAAoB,EAAE;QAEtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,GAAG,IAAI;YACP,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
package/lib/util/retry.js CHANGED
@@ -17,16 +17,16 @@ export async function withExponentialBackoff(operation, isRetryable, maxAttempts
17
17
  return await operation();
18
18
  }
19
19
  catch (error) {
20
- console.log("error", error);
20
+ console.log(error.message);
21
21
  attempt++;
22
22
  if (attempt >= maxAttempts || !isRetryable(error)) {
23
- console.warn("Failed after ", attempt, " attempts");
24
23
  throw error;
25
24
  }
26
25
  // Exponential backoff with jitter
27
26
  const jitter = Math.random() * 0.1 * delay;
28
27
  await new Promise((resolve) => setTimeout(resolve, delay + jitter));
29
28
  delay *= 2; // Double the delay for next attempt
29
+ delay = Math.min(delay, 10000); // Cap at 10 seconds
30
30
  }
31
31
  }
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAA2B,EAC3B,WAAoC,EACpC,WAAW,GAAG,CAAC,EACf,cAAc,GAAG,GAAG;IAEpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,cAAc,CAAC;IAE3B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;gBACpD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;YAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;YACpE,KAAK,IAAI,CAAC,CAAC,CAAC,oCAAoC;QAClD,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/util/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAA2B,EAC3B,WAAoC,EACpC,WAAW,GAAG,CAAC,EACf,cAAc,GAAG,GAAG;IAEpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,KAAK,GAAG,cAAc,CAAC;IAE3B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC;YAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;YACpE,KAAK,IAAI,CAAC,CAAC,CAAC,oCAAoC;YAChD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,oBAAoB;QACtD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function safeFetch(url: string | URL | Request, options?: RequestInit, retries?: number): Promise<Response>;
2
+ //# sourceMappingURL=safe-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-fetch.d.ts","sourceRoot":"","sources":["../../src/util/safe-fetch.ts"],"names":[],"mappings":"AAEA,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAC3B,OAAO,GAAE,WAAgB,EACzB,OAAO,SAAI,qBA0BZ"}
@@ -0,0 +1,48 @@
1
+ export async function safeFetch(url, options = {}, retries = 3) {
2
+ let latestErr;
3
+ for (let attempt = 1; attempt <= retries; attempt++) {
4
+ try {
5
+ return await fetch(url, {
6
+ ...options,
7
+ // Type assertion to work around Cloudflare Workers type definitions
8
+ dispatcher: await dispatcher(),
9
+ });
10
+ }
11
+ catch (err) {
12
+ latestErr = err;
13
+ const shouldRetry = err?.code === "UND_ERR_SOCKET" ||
14
+ err?.code === "ECONNRESET" ||
15
+ err?.name === "FetchError";
16
+ if (!shouldRetry || attempt === retries) {
17
+ throw err;
18
+ }
19
+ console.warn(`Retry ${attempt}/${retries} for ${url}: ${err.code}`);
20
+ await new Promise((r) => setTimeout(r, 250 * attempt)); // exponential backoff
21
+ }
22
+ }
23
+ throw latestErr;
24
+ }
25
+ let agent;
26
+ async function dispatcher() {
27
+ if (agent) {
28
+ return agent.value;
29
+ }
30
+ try {
31
+ // undici not available in all runtimes
32
+ const { Agent } = await import("undici");
33
+ if (!agent) {
34
+ // Configure agent with connection limits to avoid socket errors
35
+ agent = {
36
+ value: new Agent({
37
+ pipelining: 0, // Disable pipelining to avoid connection issues
38
+ // connections: 5, // Limit concurrent connections per host
39
+ }),
40
+ };
41
+ }
42
+ }
43
+ catch {
44
+ agent = { value: undefined };
45
+ }
46
+ return agent.value;
47
+ }
48
+ //# sourceMappingURL=safe-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-fetch.js","sourceRoot":"","sources":["../../src/util/safe-fetch.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAA2B,EAC3B,UAAuB,EAAE,EACzB,OAAO,GAAG,CAAC;IAEX,IAAI,SAAc,CAAC;IACnB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE;gBACtB,GAAG,OAAO;gBACV,oEAAoE;gBACpE,UAAU,EAAE,MAAM,UAAU,EAAE;aAChB,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,WAAW,GACf,GAAG,EAAE,IAAI,KAAK,gBAAgB;gBAC9B,GAAG,EAAE,IAAI,KAAK,YAAY;gBAC1B,GAAG,EAAE,IAAI,KAAK,YAAY,CAAC;YAE7B,IAAI,CAAC,WAAW,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxC,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,SAAS,OAAO,IAAI,OAAO,QAAQ,GAAG,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,sBAAsB;QAChF,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,IAAI,KAIS,CAAC;AAEd,KAAK,UAAU,UAAU;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,gEAAgE;YAChE,KAAK,GAAG;gBACN,KAAK,EAAE,IAAI,KAAK,CAAC;oBACf,UAAU,EAAE,CAAC,EAAE,gDAAgD;oBAC/D,2DAA2D;iBAC5D,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/vercel/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,SAAS,CAAC,CAUpB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,uBAAuB;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;;;OAMG;gBACS,OAAO,EAAE,gBAAgB,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAK/D;;;;;;OAMG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2CpE;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAKpB;;OAEG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAKpB;;OAEG;IACG,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGtE"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/vercel/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,SAAS,CAAC,CAUpB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,uBAAuB;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B;;;;;;OAMG;gBACS,OAAO,EAAE,gBAAgB,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAK/D;;;;;;OAMG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2CpE;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAKpB;;OAEG;IACG,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAKpB;;OAEG;IACG,KAAK,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGtE"}
package/lib/vercel/api.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { alchemy } from "../alchemy.js";
2
+ import { safeFetch } from "../util/safe-fetch.js";
2
3
  /**
3
4
  * Creates a VercelApi instance with automatic token validation
4
5
  *
@@ -55,7 +56,7 @@ export class VercelApi {
55
56
  if (init.body instanceof FormData) {
56
57
  delete headers["Content-Type"];
57
58
  }
58
- const response = await fetch(`${this.baseUrl}${path}`, {
59
+ const response = await safeFetch(`${this.baseUrl}${path}`, {
59
60
  ...init,
60
61
  headers,
61
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/vercel/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAkBxC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAyB;IAEzB,MAAM,EACJ,WAAW,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAC1D,OAAO,GACR,GAAG,OAAO,CAAC;IAEZ,OAAO,IAAI,SAAS,CAAC;QACnB,OAAO;QACP,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IACpB,uBAAuB;IACd,OAAO,CAAS;IAEzB,uBAAuB;IACd,WAAW,CAAS;IAE7B;;;;;;OAMG;IACH,YAAY,OAAmD;QAC7D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC9C,gCAAgC;QAChC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;SACxD,CAAC;QAEF,oCAAoC;QACpC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAiC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,oCAAoC;QACpC,IAAI,IAAI,CAAC,IAAI,YAAY,QAAQ,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACrD,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,UAAU,EAAE,EAAE;gBACzD,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAClD,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,EAAE,KAAK,CACrD,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,IAAS,EACT,OAAoB,EAAE;QAEtB,MAAM,WAAW,GAAG,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,IAAS,EACT,OAAoB,EAAE;QAEtB,MAAM,WAAW,GAAG,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,IAAY,EACZ,IAAS,EACT,OAAoB,EAAE;QAEtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACtB,GAAG,IAAI;YACP,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,OAAoB,EAAE;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/vercel/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"process-front-matter-files.d.ts","sourceRoot":"","sources":["../../../src/web/vitepress/process-front-matter-files.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CACR;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC1C,EAAE,CAAC;CACL,EAAE,CACJ,CA4EA"}
1
+ {"version":3,"file":"process-front-matter-files.d.ts","sourceRoot":"","sources":["../../../src/web/vitepress/process-front-matter-files.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CACR;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC1C,EAAE,CAAC;CACL,EAAE,CACJ,CAmFA"}
@@ -1,5 +1,6 @@
1
1
  import fs from "node:fs/promises";
2
2
  import path from "node:path";
3
+ import { parse as parseYaml } from "yaml";
3
4
  /**
4
5
  * Process markdown files with frontmatter to generate navigation items
5
6
  * @param directoryPath The directory containing markdown files
@@ -32,14 +33,17 @@ export async function processFrontmatterFiles(directoryPath, linkPrefix) {
32
33
  let order = 10000;
33
34
  let title;
34
35
  if (frontmatterMatch) {
35
- const frontmatter = frontmatterMatch[1];
36
- const orderMatch = frontmatter.match(/order:\s*(\d+)/);
37
- if (orderMatch) {
38
- order = Number.parseFloat(orderMatch[1]);
36
+ const frontmatter = parseYaml(frontmatterMatch[1]);
37
+ // Parse order as a number (supports both integers and floats)
38
+ if (frontmatter.order !== undefined) {
39
+ if (typeof frontmatter.order !== "number") {
40
+ throw new Error(`Invalid order field in ${fullPath}: expected number, got ${typeof frontmatter.order}`);
41
+ }
42
+ order = frontmatter.order;
39
43
  }
40
- const titleMatch = frontmatter.match(/title:\s*(.+)/);
41
- if (titleMatch) {
42
- title = titleMatch[1].trim();
44
+ // Get title from frontmatter
45
+ if (frontmatter.title) {
46
+ title = String(frontmatter.title).trim();
43
47
  }
44
48
  }
45
49
  // If no title in frontmatter, try to get first heading
@@ -1 +1 @@
1
- {"version":3,"file":"process-front-matter-files.js","sourceRoot":"","sources":["../../../src/web/vitepress/process-front-matter-files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process-front-matter-files.js","sourceRoot":"","sources":["../../../src/web/vitepress/process-front-matter-files.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,22 @@
1
1
  {
2
2
  "name": "alchemy",
3
- "version": "0.22.3",
3
+ "version": "0.23.0",
4
4
  "type": "module",
5
5
  "module": "./lib/index.js",
6
+ "license": "Apache-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/sam-goodwin/alchemy",
10
+ "directory": "alchemy"
11
+ },
6
12
  "scripts": {
7
13
  "build": "rm -rf ./*.tsbuildinfo && rm -rf ./lib && tsc -b",
14
+ "postbuild": "cpx 'src/**/*/types.d.ts' lib",
8
15
  "publish:npm": "cp ../README.md . && bun run build && npm publish && rm README.md",
9
16
  "docs:gen": "rm -rf ./docs && typedoc"
10
17
  },
18
+ "author": "Sam Goodwin <sam@alchemy.run>",
19
+ "homepage": "https://alchemy.run",
11
20
  "files": [
12
21
  "lib",
13
22
  "src"
@@ -112,6 +121,7 @@
112
121
  "@aws-sdk/client-ses": "^3.0.0",
113
122
  "@aws-sdk/client-sesv2": "^3.0.0",
114
123
  "@aws-sdk/client-sqs": "^3.0.0",
124
+ "@aws-sdk/client-ssm": "^3.0.0",
115
125
  "@aws-sdk/client-sts": "^3.0.0",
116
126
  "@aws-sdk/credential-providers": "^3.0.0",
117
127
  "@aws-sdk/node-config-provider": "^3.374.0",
@@ -158,6 +168,7 @@
158
168
  "braintrust": "^0.0.201",
159
169
  "change-case": "^5.4.4",
160
170
  "cloudflare": "^4.2.0",
171
+ "cpx": "^1.5.0",
161
172
  "libsodium-wrappers": "^0.7.15",
162
173
  "openpgp": "^6.1.0",
163
174
  "prettier": "^3.5.3",
package/src/alchemy.ts CHANGED
@@ -141,8 +141,8 @@ async function _alchemy(
141
141
  const indent = " ".repeat(leadingSpaces);
142
142
 
143
143
  const [{ isFileRef }, { isFileCollection }] = await Promise.all([
144
- import("./fs/file-ref.ts"),
145
- import("./fs/file-collection.ts"),
144
+ import("./fs/file-ref.js"),
145
+ import("./fs/file-collection.js"),
146
146
  ]);
147
147
 
148
148
  const appendices: Record<string, string> = {};
package/src/aws/bucket.ts CHANGED
@@ -13,6 +13,7 @@ import {
13
13
  import type { Context } from "../context.ts";
14
14
  import { Resource } from "../resource.ts";
15
15
  import { ignore } from "../util/ignore.ts";
16
+ import { retry } from "./retry.ts";
16
17
 
17
18
  /**
18
19
  * Properties for creating or updating an S3 bucket
@@ -133,52 +134,60 @@ export const Bucket = Resource(
133
134
 
134
135
  if (this.phase === "delete") {
135
136
  await ignore(NoSuchBucket.name, () =>
136
- client.send(
137
- new DeleteBucketCommand({
138
- Bucket: props.bucketName,
139
- }),
137
+ retry(() =>
138
+ client.send(
139
+ new DeleteBucketCommand({
140
+ Bucket: props.bucketName,
141
+ }),
142
+ ),
140
143
  ),
141
144
  );
142
145
  return this.destroy();
143
146
  }
144
147
  try {
145
148
  // Check if bucket exists
146
- await client.send(
147
- new HeadBucketCommand({
148
- Bucket: props.bucketName,
149
- }),
149
+ await retry(() =>
150
+ client.send(
151
+ new HeadBucketCommand({
152
+ Bucket: props.bucketName,
153
+ }),
154
+ ),
150
155
  );
151
156
 
152
157
  // Update tags if they changed and bucket exists
153
158
  if (this.phase === "update" && props.tags) {
154
- await client.send(
155
- new PutBucketTaggingCommand({
156
- Bucket: props.bucketName,
157
- Tagging: {
158
- TagSet: Object.entries(props.tags).map(([Key, Value]) => ({
159
- Key,
160
- Value,
161
- })),
162
- },
163
- }),
164
- );
165
- }
166
- } catch (error: any) {
167
- if (error.name === "NotFound") {
168
- // Create bucket if it doesn't exist
169
- await client.send(
170
- new CreateBucketCommand({
171
- Bucket: props.bucketName,
172
- // Add tags during creation if specified
173
- ...(props.tags && {
159
+ await retry(() =>
160
+ client.send(
161
+ new PutBucketTaggingCommand({
162
+ Bucket: props.bucketName,
174
163
  Tagging: {
175
- TagSet: Object.entries(props.tags).map(([Key, Value]) => ({
164
+ TagSet: Object.entries(props.tags!).map(([Key, Value]) => ({
176
165
  Key,
177
166
  Value,
178
167
  })),
179
168
  },
180
169
  }),
181
- }),
170
+ ),
171
+ );
172
+ }
173
+ } catch (error: any) {
174
+ if (error.name === "NotFound") {
175
+ // Create bucket if it doesn't exist
176
+ await retry(() =>
177
+ client.send(
178
+ new CreateBucketCommand({
179
+ Bucket: props.bucketName,
180
+ // Add tags during creation if specified
181
+ ...(props.tags && {
182
+ Tagging: {
183
+ TagSet: Object.entries(props.tags).map(([Key, Value]) => ({
184
+ Key,
185
+ Value,
186
+ })),
187
+ },
188
+ }),
189
+ }),
190
+ ),
182
191
  );
183
192
  } else {
184
193
  throw error;
@@ -188,11 +197,19 @@ export const Bucket = Resource(
188
197
  // Get bucket details
189
198
  const [locationResponse, versioningResponse, aclResponse] =
190
199
  await Promise.all([
191
- client.send(new GetBucketLocationCommand({ Bucket: props.bucketName })),
192
- client.send(
193
- new GetBucketVersioningCommand({ Bucket: props.bucketName }),
200
+ retry(() =>
201
+ client.send(
202
+ new GetBucketLocationCommand({ Bucket: props.bucketName }),
203
+ ),
204
+ ),
205
+ retry(() =>
206
+ client.send(
207
+ new GetBucketVersioningCommand({ Bucket: props.bucketName }),
208
+ ),
209
+ ),
210
+ retry(() =>
211
+ client.send(new GetBucketAclCommand({ Bucket: props.bucketName })),
194
212
  ),
195
- client.send(new GetBucketAclCommand({ Bucket: props.bucketName })),
196
213
  ]);
197
214
 
198
215
  const region = locationResponse.LocationConstraint || "us-east-1";
@@ -201,8 +218,10 @@ export const Bucket = Resource(
201
218
  let tags = props.tags;
202
219
  if (!tags) {
203
220
  try {
204
- const taggingResponse = await client.send(
205
- new GetBucketTaggingCommand({ Bucket: props.bucketName }),
221
+ const taggingResponse = await retry(() =>
222
+ client.send(
223
+ new GetBucketTaggingCommand({ Bucket: props.bucketName }),
224
+ ),
206
225
  );
207
226
  tags = Object.fromEntries(
208
227
  taggingResponse.TagSet?.map(({ Key, Value }) => [Key, Value]) || [],