alchemy 0.22.4 → 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.
- package/lib/aws/bucket.d.ts.map +1 -1
- package/lib/aws/bucket.js +13 -12
- package/lib/aws/bucket.js.map +1 -1
- package/lib/aws/control/client.d.ts.map +1 -1
- package/lib/aws/control/client.js +5 -3
- package/lib/aws/control/client.js.map +1 -1
- package/lib/aws/control/resource.d.ts.map +1 -1
- package/lib/aws/control/resource.js +13 -4
- package/lib/aws/control/resource.js.map +1 -1
- package/lib/aws/control/types.d.ts +85129 -0
- package/lib/aws/function.d.ts.map +1 -1
- package/lib/aws/function.js +51 -42
- package/lib/aws/function.js.map +1 -1
- package/lib/aws/index.d.ts +1 -0
- package/lib/aws/index.d.ts.map +1 -1
- package/lib/aws/index.js +1 -0
- package/lib/aws/index.js.map +1 -1
- package/lib/aws/policy-attachment.d.ts.map +1 -1
- package/lib/aws/policy-attachment.js +5 -4
- package/lib/aws/policy-attachment.js.map +1 -1
- package/lib/aws/policy.d.ts.map +1 -1
- package/lib/aws/policy.js +21 -20
- package/lib/aws/policy.js.map +1 -1
- package/lib/aws/queue.d.ts.map +1 -1
- package/lib/aws/queue.js +19 -15
- package/lib/aws/queue.js.map +1 -1
- package/lib/aws/retry.d.ts +5 -0
- package/lib/aws/retry.d.ts.map +1 -0
- package/lib/aws/retry.js +27 -0
- package/lib/aws/retry.js.map +1 -0
- package/lib/aws/role.d.ts.map +1 -1
- package/lib/aws/role.js +31 -30
- package/lib/aws/role.js.map +1 -1
- package/lib/aws/ses.d.ts.map +1 -1
- package/lib/aws/ses.js +27 -26
- package/lib/aws/ses.js.map +1 -1
- package/lib/aws/ssm-parameter.d.ts +150 -0
- package/lib/aws/ssm-parameter.d.ts.map +1 -0
- package/lib/aws/ssm-parameter.js +184 -0
- package/lib/aws/ssm-parameter.js.map +1 -0
- package/lib/aws/table.d.ts.map +1 -1
- package/lib/aws/table.js +9 -27
- package/lib/aws/table.js.map +1 -1
- package/lib/cloudflare/account-id.d.ts +1 -0
- package/lib/cloudflare/account-id.d.ts.map +1 -1
- package/lib/cloudflare/account-id.js.map +1 -1
- package/lib/cloudflare/api.d.ts.map +1 -1
- package/lib/cloudflare/api.js +22 -2
- package/lib/cloudflare/api.js.map +1 -1
- package/lib/cloudflare/index.d.ts +2 -1
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +2 -1
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/queue.d.ts.map +1 -1
- package/lib/cloudflare/queue.js +1 -0
- package/lib/cloudflare/queue.js.map +1 -1
- package/lib/cloudflare/route.d.ts +7 -0
- package/lib/cloudflare/route.d.ts.map +1 -1
- package/lib/cloudflare/route.js +44 -2
- package/lib/cloudflare/route.js.map +1 -1
- package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
- package/lib/cloudflare/worker-metadata.js +1 -2
- package/lib/cloudflare/worker-metadata.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +2 -1
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +17 -8
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/workflow.d.ts +7 -0
- package/lib/cloudflare/workflow.d.ts.map +1 -1
- package/lib/cloudflare/workflow.js +2 -0
- package/lib/cloudflare/workflow.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +1 -0
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +1 -0
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/destroy.js +1 -1
- package/lib/destroy.js.map +1 -1
- package/lib/dns/godaddy.d.ts.map +1 -1
- package/lib/dns/godaddy.js +2 -1
- package/lib/dns/godaddy.js.map +1 -1
- package/lib/fs/file-system-state-store.d.ts.map +1 -1
- package/lib/fs/file-system-state-store.js +14 -2
- package/lib/fs/file-system-state-store.js.map +1 -1
- package/lib/github/secret.d.ts.map +1 -1
- package/lib/github/secret.js +1 -0
- package/lib/github/secret.js.map +1 -1
- package/lib/neon/api.d.ts.map +1 -1
- package/lib/neon/api.js +2 -1
- package/lib/neon/api.js.map +1 -1
- package/lib/runtime/shims.d.ts +6 -0
- package/lib/runtime/shims.d.ts.map +1 -0
- package/lib/runtime/shims.js +27 -0
- package/lib/runtime/shims.js.map +1 -0
- package/lib/sentry/api.d.ts.map +1 -1
- package/lib/sentry/api.js +2 -1
- package/lib/sentry/api.js.map +1 -1
- package/lib/test/bun.d.ts.map +1 -1
- package/lib/test/bun.js +1 -7
- package/lib/test/bun.js.map +1 -1
- package/lib/test/prune.d.ts +2 -1
- package/lib/test/prune.d.ts.map +1 -1
- package/lib/test/prune.js +29 -5
- package/lib/test/prune.js.map +1 -1
- package/lib/test/vitest.d.ts +92 -0
- package/lib/test/vitest.d.ts.map +1 -0
- package/lib/test/vitest.js +94 -0
- package/lib/test/vitest.js.map +1 -0
- package/lib/upstash/api.d.ts.map +1 -1
- package/lib/upstash/api.js +2 -1
- package/lib/upstash/api.js.map +1 -1
- package/lib/util/retry.js +2 -2
- package/lib/util/retry.js.map +1 -1
- package/lib/util/safe-fetch.d.ts +2 -0
- package/lib/util/safe-fetch.d.ts.map +1 -0
- package/lib/util/safe-fetch.js +48 -0
- package/lib/util/safe-fetch.js.map +1 -0
- package/lib/vercel/api.d.ts.map +1 -1
- package/lib/vercel/api.js +2 -1
- package/lib/vercel/api.js.map +1 -1
- package/lib/web/vitepress/process-front-matter-files.d.ts.map +1 -1
- package/lib/web/vitepress/process-front-matter-files.js +11 -7
- package/lib/web/vitepress/process-front-matter-files.js.map +1 -1
- package/package.json +10 -6
- package/src/alchemy.ts +2 -2
- package/src/aws/bucket.ts +55 -36
- package/src/aws/control/client.ts +13 -13
- package/src/aws/control/resource.ts +19 -3
- package/src/aws/function.ts +233 -178
- package/src/aws/index.ts +1 -0
- package/src/aws/policy-attachment.ts +15 -10
- package/src/aws/policy.ts +75 -54
- package/src/aws/queue.ts +53 -36
- package/src/aws/retry.ts +38 -0
- package/src/aws/role.ts +121 -90
- package/src/aws/ses.ts +101 -73
- package/src/aws/ssm-parameter.ts +315 -0
- package/src/aws/table.ts +61 -90
- package/src/cloudflare/account-id.ts +2 -0
- package/src/cloudflare/api.ts +26 -3
- package/src/cloudflare/index.ts +2 -1
- package/src/cloudflare/queue.ts +2 -0
- package/src/cloudflare/route.ts +86 -2
- package/src/cloudflare/worker-metadata.ts +1 -2
- package/src/cloudflare/worker.ts +21 -9
- package/src/cloudflare/workflow.ts +8 -0
- package/src/cloudflare/wrangler.json.ts +8 -1
- package/src/destroy.ts +1 -1
- package/src/dns/godaddy.ts +3 -1
- package/src/fs/file-system-state-store.ts +16 -2
- package/src/github/secret.ts +2 -0
- package/src/neon/api.ts +2 -1
- package/src/sentry/api.ts +2 -1
- package/src/test/bun.ts +1 -7
- package/src/test/prune.ts +31 -4
- package/src/test/vitest.ts +209 -0
- package/src/upstash/api.ts +2 -1
- package/src/util/retry.ts +3 -3
- package/src/util/safe-fetch.ts +61 -0
- package/src/vercel/api.ts +2 -1
- package/src/web/vitepress/process-front-matter-files.ts +15 -7
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(
|
|
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
|
}
|
package/lib/util/retry.js.map
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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"}
|
package/lib/vercel/api.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
59
|
+
const response = await safeFetch(`${this.baseUrl}${path}`, {
|
|
59
60
|
...init,
|
|
60
61
|
headers,
|
|
61
62
|
});
|
package/lib/vercel/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/vercel/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
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":"
|
|
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
|
-
|
|
37
|
-
if (
|
|
38
|
-
order
|
|
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
|
-
|
|
41
|
-
if (
|
|
42
|
-
title =
|
|
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":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
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,19 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alchemy",
|
|
3
|
-
"version": "0.
|
|
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
|
},
|
|
11
|
-
"repository": {
|
|
12
|
-
"type": "git",
|
|
13
|
-
"url": "https://github.com/sam-goodwin/alchemy.git"
|
|
14
|
-
},
|
|
15
18
|
"author": "Sam Goodwin <sam@alchemy.run>",
|
|
16
|
-
"license": "Apache-2.0",
|
|
17
19
|
"homepage": "https://alchemy.run",
|
|
18
20
|
"files": [
|
|
19
21
|
"lib",
|
|
@@ -119,6 +121,7 @@
|
|
|
119
121
|
"@aws-sdk/client-ses": "^3.0.0",
|
|
120
122
|
"@aws-sdk/client-sesv2": "^3.0.0",
|
|
121
123
|
"@aws-sdk/client-sqs": "^3.0.0",
|
|
124
|
+
"@aws-sdk/client-ssm": "^3.0.0",
|
|
122
125
|
"@aws-sdk/client-sts": "^3.0.0",
|
|
123
126
|
"@aws-sdk/credential-providers": "^3.0.0",
|
|
124
127
|
"@aws-sdk/node-config-provider": "^3.374.0",
|
|
@@ -165,6 +168,7 @@
|
|
|
165
168
|
"braintrust": "^0.0.201",
|
|
166
169
|
"change-case": "^5.4.4",
|
|
167
170
|
"cloudflare": "^4.2.0",
|
|
171
|
+
"cpx": "^1.5.0",
|
|
168
172
|
"libsodium-wrappers": "^0.7.15",
|
|
169
173
|
"openpgp": "^6.1.0",
|
|
170
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.
|
|
145
|
-
import("./fs/file-collection.
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
147
|
-
|
|
148
|
-
|
|
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
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
|
205
|
-
|
|
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]) || [],
|
|
@@ -2,6 +2,7 @@ import { fromNodeProviderChain } from "@aws-sdk/credential-providers";
|
|
|
2
2
|
import { loadConfig } from "@aws-sdk/node-config-provider";
|
|
3
3
|
import { AwsClient } from "aws4fetch";
|
|
4
4
|
|
|
5
|
+
import { safeFetch } from "../../util/safe-fetch.ts";
|
|
5
6
|
import {
|
|
6
7
|
AlreadyExistsError,
|
|
7
8
|
CloudControlError,
|
|
@@ -202,18 +203,17 @@ export class CloudControlClient {
|
|
|
202
203
|
identifier: string,
|
|
203
204
|
): Promise<Record<string, any> | undefined> {
|
|
204
205
|
try {
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
);
|
|
206
|
+
const resource = await this.fetch<{
|
|
207
|
+
Identifier: string;
|
|
208
|
+
TypeName: string;
|
|
209
|
+
ResourceDescription: {
|
|
210
|
+
Properties: string;
|
|
211
|
+
};
|
|
212
|
+
}>("GetResource", {
|
|
213
|
+
TypeName: typeName,
|
|
214
|
+
Identifier: identifier,
|
|
215
|
+
});
|
|
216
|
+
return JSON.parse(resource.ResourceDescription.Properties);
|
|
217
217
|
} catch (error: any) {
|
|
218
218
|
if (error instanceof ResourceNotFoundException) {
|
|
219
219
|
return undefined;
|
|
@@ -366,7 +366,7 @@ export class CloudControlClient {
|
|
|
366
366
|
},
|
|
367
367
|
] as const;
|
|
368
368
|
const signedRequest = await this.client.sign(...args);
|
|
369
|
-
const response = await
|
|
369
|
+
const response = await safeFetch(signedRequest);
|
|
370
370
|
|
|
371
371
|
if (!response.ok) {
|
|
372
372
|
const data: any = await response.json();
|
|
@@ -9,6 +9,7 @@ import { createCloudControlClient, type ProgressEvent } from "./client.ts";
|
|
|
9
9
|
import {
|
|
10
10
|
AlreadyExistsError,
|
|
11
11
|
ConcurrentOperationError,
|
|
12
|
+
NotFoundError,
|
|
12
13
|
UpdateFailedError,
|
|
13
14
|
} from "./error.ts";
|
|
14
15
|
import readOnlyPropertiesMap from "./properties.ts";
|
|
@@ -206,7 +207,19 @@ export const CloudControlResource = Resource(
|
|
|
206
207
|
// register a catch-all for AWS::* resources (Resources created with the Control API)
|
|
207
208
|
registerDynamicResource((typeName) => {
|
|
208
209
|
if (typeName.startsWith("AWS::")) {
|
|
209
|
-
return Resource(
|
|
210
|
+
return Resource(
|
|
211
|
+
typeName,
|
|
212
|
+
function (
|
|
213
|
+
this: Context<CloudControlResource, CloudControlResourceProps>,
|
|
214
|
+
id: string,
|
|
215
|
+
props: Omit<CloudControlResourceProps, "typeName">,
|
|
216
|
+
) {
|
|
217
|
+
return CloudControlLifecycle.bind(this)(id, {
|
|
218
|
+
typeName,
|
|
219
|
+
...props,
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
) as unknown as Provider;
|
|
210
223
|
}
|
|
211
224
|
return undefined;
|
|
212
225
|
});
|
|
@@ -228,8 +241,11 @@ async function CloudControlLifecycle(
|
|
|
228
241
|
try {
|
|
229
242
|
await client.deleteResource(props.typeName, this.output.id);
|
|
230
243
|
} catch (error) {
|
|
231
|
-
|
|
232
|
-
|
|
244
|
+
if (error instanceof NotFoundError) {
|
|
245
|
+
// great, this is the desired outcome
|
|
246
|
+
} else {
|
|
247
|
+
throw error;
|
|
248
|
+
}
|
|
233
249
|
}
|
|
234
250
|
}
|
|
235
251
|
return this.destroy();
|