alchemy 0.1.11 → 0.1.13

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 (312) hide show
  1. package/README.md +324 -0
  2. package/lib/$.d.ts +8 -3
  3. package/lib/$.d.ts.map +1 -1
  4. package/lib/$.js +38 -27
  5. package/lib/$.js.map +1 -1
  6. package/lib/alchemize.d.ts.map +1 -1
  7. package/lib/alchemize.js +7 -0
  8. package/lib/alchemize.js.map +1 -1
  9. package/lib/apply.d.ts +2 -2
  10. package/lib/apply.d.ts.map +1 -1
  11. package/lib/apply.js +3 -3
  12. package/lib/apply.js.map +1 -1
  13. package/lib/aws/index.d.ts +1 -0
  14. package/lib/aws/index.d.ts.map +1 -1
  15. package/lib/aws/index.js +1 -0
  16. package/lib/aws/index.js.map +1 -1
  17. package/lib/aws/ses.d.ts +75 -0
  18. package/lib/aws/ses.d.ts.map +1 -0
  19. package/lib/aws/ses.js +197 -0
  20. package/lib/aws/ses.js.map +1 -0
  21. package/lib/cloudflare/api.d.ts +88 -0
  22. package/lib/cloudflare/api.d.ts.map +1 -0
  23. package/lib/cloudflare/api.js +184 -0
  24. package/lib/cloudflare/api.js.map +1 -0
  25. package/lib/cloudflare/asset-manifest.d.ts +15 -0
  26. package/lib/cloudflare/asset-manifest.d.ts.map +1 -0
  27. package/lib/cloudflare/asset-manifest.js +2 -0
  28. package/lib/cloudflare/asset-manifest.js.map +1 -0
  29. package/lib/cloudflare/auth.d.ts +52 -0
  30. package/lib/cloudflare/auth.d.ts.map +1 -0
  31. package/lib/cloudflare/auth.js +114 -0
  32. package/lib/cloudflare/auth.js.map +1 -0
  33. package/lib/cloudflare/bindings.d.ts +254 -0
  34. package/lib/cloudflare/bindings.d.ts.map +1 -0
  35. package/lib/cloudflare/bindings.js +2 -0
  36. package/lib/cloudflare/bindings.js.map +1 -0
  37. package/lib/cloudflare/durable-object-namespace.d.ts +23 -0
  38. package/lib/cloudflare/durable-object-namespace.d.ts.map +1 -0
  39. package/lib/cloudflare/durable-object-namespace.js +26 -0
  40. package/lib/cloudflare/durable-object-namespace.js.map +1 -0
  41. package/lib/cloudflare/generate-asset-manifest.d.ts +3 -0
  42. package/lib/cloudflare/generate-asset-manifest.d.ts.map +1 -0
  43. package/lib/cloudflare/generate-asset-manifest.js +69 -0
  44. package/lib/cloudflare/generate-asset-manifest.js.map +1 -0
  45. package/lib/cloudflare/index.d.ts +7 -0
  46. package/lib/cloudflare/index.d.ts.map +1 -0
  47. package/lib/cloudflare/index.js +7 -0
  48. package/lib/cloudflare/index.js.map +1 -0
  49. package/lib/cloudflare/kv-namespace.d.ts +61 -0
  50. package/lib/cloudflare/kv-namespace.d.ts.map +1 -0
  51. package/lib/cloudflare/kv-namespace.js +93 -0
  52. package/lib/cloudflare/kv-namespace.js.map +1 -0
  53. package/lib/cloudflare/state.d.ts +83 -0
  54. package/lib/cloudflare/state.d.ts.map +1 -0
  55. package/lib/cloudflare/state.js +109 -0
  56. package/lib/cloudflare/state.js.map +1 -0
  57. package/lib/cloudflare/static-site-router.d.ts +19 -0
  58. package/lib/cloudflare/static-site-router.d.ts.map +1 -0
  59. package/lib/cloudflare/static-site-router.js +110 -0
  60. package/lib/cloudflare/static-site-router.js.map +1 -0
  61. package/lib/cloudflare/static-site.d.ts +166 -0
  62. package/lib/cloudflare/static-site.d.ts.map +1 -0
  63. package/lib/cloudflare/static-site.js +168 -0
  64. package/lib/cloudflare/static-site.js.map +1 -0
  65. package/lib/cloudflare/types.d.ts +52 -0
  66. package/lib/cloudflare/types.d.ts.map +1 -0
  67. package/lib/cloudflare/types.js +21 -0
  68. package/lib/cloudflare/types.js.map +1 -0
  69. package/lib/cloudflare/upload-asset-manifest.d.ts +12 -0
  70. package/lib/cloudflare/upload-asset-manifest.d.ts.map +1 -0
  71. package/lib/cloudflare/upload-asset-manifest.js +55 -0
  72. package/lib/cloudflare/upload-asset-manifest.js.map +1 -0
  73. package/lib/cloudflare/worker-metadata.d.ts +130 -0
  74. package/lib/cloudflare/worker-metadata.d.ts.map +1 -0
  75. package/lib/cloudflare/worker-metadata.js +2 -0
  76. package/lib/cloudflare/worker-metadata.js.map +1 -0
  77. package/lib/cloudflare/worker-migration.d.ts +110 -0
  78. package/lib/cloudflare/worker-migration.d.ts.map +1 -0
  79. package/lib/cloudflare/worker-migration.js +11 -0
  80. package/lib/cloudflare/worker-migration.js.map +1 -0
  81. package/lib/cloudflare/worker.d.ts +105 -0
  82. package/lib/cloudflare/worker.d.ts.map +1 -0
  83. package/lib/cloudflare/worker.js +358 -0
  84. package/lib/cloudflare/worker.js.map +1 -0
  85. package/lib/destroy.d.ts +1 -1
  86. package/lib/destroy.d.ts.map +1 -1
  87. package/lib/destroy.js +2 -1
  88. package/lib/destroy.js.map +1 -1
  89. package/lib/esbuild.d.ts +83 -1
  90. package/lib/esbuild.d.ts.map +1 -1
  91. package/lib/esbuild.js +27 -18
  92. package/lib/esbuild.js.map +1 -1
  93. package/lib/fs.d.ts +1 -1
  94. package/lib/global.d.ts +0 -2
  95. package/lib/global.d.ts.map +1 -1
  96. package/lib/global.js +3 -3
  97. package/lib/global.js.map +1 -1
  98. package/lib/index.d.ts +1 -0
  99. package/lib/index.d.ts.map +1 -1
  100. package/lib/index.js +1 -0
  101. package/lib/index.js.map +1 -1
  102. package/lib/main.js +1 -1
  103. package/lib/main.js.map +1 -1
  104. package/lib/output.d.ts +18 -13
  105. package/lib/output.d.ts.map +1 -1
  106. package/lib/output.js +12 -5
  107. package/lib/output.js.map +1 -1
  108. package/lib/print.d.ts +7 -0
  109. package/lib/print.d.ts.map +1 -0
  110. package/lib/print.js +10 -0
  111. package/lib/print.js.map +1 -0
  112. package/lib/resource.d.ts +9 -4
  113. package/lib/resource.d.ts.map +1 -1
  114. package/lib/resource.js +127 -93
  115. package/lib/resource.js.map +1 -1
  116. package/lib/scope.d.ts +3 -0
  117. package/lib/scope.d.ts.map +1 -1
  118. package/lib/scope.js +4 -12
  119. package/lib/scope.js.map +1 -1
  120. package/lib/utils/content-type.d.ts +8 -0
  121. package/lib/utils/content-type.d.ts.map +1 -0
  122. package/lib/utils/content-type.js +41 -0
  123. package/lib/utils/content-type.js.map +1 -0
  124. package/package.json +27 -8
  125. package/src/$.ts +63 -30
  126. package/src/alchemize.ts +12 -0
  127. package/src/apply.ts +6 -6
  128. package/src/aws/index.ts +1 -0
  129. package/src/aws/ses.ts +346 -0
  130. package/src/cloudflare/api.ts +282 -0
  131. package/src/cloudflare/asset-manifest.ts +16 -0
  132. package/src/cloudflare/auth.ts +187 -0
  133. package/src/cloudflare/bindings.ts +297 -0
  134. package/src/cloudflare/durable-object-namespace.ts +43 -0
  135. package/src/cloudflare/generate-asset-manifest.ts +93 -0
  136. package/src/cloudflare/index.ts +6 -0
  137. package/src/cloudflare/kv-namespace.ts +195 -0
  138. package/src/cloudflare/state.ts +138 -0
  139. package/src/cloudflare/static-site-router.ts +150 -0
  140. package/src/cloudflare/static-site.ts +395 -0
  141. package/src/cloudflare/types.ts +71 -0
  142. package/src/cloudflare/upload-asset-manifest.ts +83 -0
  143. package/src/cloudflare/worker-metadata.ts +154 -0
  144. package/src/cloudflare/worker-migration.ts +145 -0
  145. package/src/cloudflare/worker.ts +666 -0
  146. package/src/destroy.ts +2 -2
  147. package/src/esbuild.ts +34 -22
  148. package/src/global.ts +1 -3
  149. package/src/index.ts +1 -1
  150. package/src/main.ts +1 -1
  151. package/src/output.ts +53 -37
  152. package/src/print.ts +18 -0
  153. package/src/resource.ts +163 -116
  154. package/src/scope.ts +7 -12
  155. package/src/utils/content-type.ts +42 -0
  156. package/lib/agent/ai.d.ts +0 -40
  157. package/lib/agent/ai.d.ts.map +0 -1
  158. package/lib/agent/ai.js +0 -132
  159. package/lib/agent/ai.js.map +0 -1
  160. package/lib/agent/anthropic.d.ts +0 -9
  161. package/lib/agent/anthropic.d.ts.map +0 -1
  162. package/lib/agent/anthropic.js +0 -25
  163. package/lib/agent/anthropic.js.map +0 -1
  164. package/lib/agent/dependencies.d.ts +0 -4
  165. package/lib/agent/dependencies.d.ts.map +0 -1
  166. package/lib/agent/dependencies.js +0 -48
  167. package/lib/agent/dependencies.js.map +0 -1
  168. package/lib/agent/file-context.d.ts +0 -13
  169. package/lib/agent/file-context.d.ts.map +0 -1
  170. package/lib/agent/file-context.js +0 -6
  171. package/lib/agent/file-context.js.map +0 -1
  172. package/lib/agent/index.d.ts +0 -10
  173. package/lib/agent/index.d.ts.map +0 -1
  174. package/lib/agent/index.js +0 -10
  175. package/lib/agent/index.js.map +0 -1
  176. package/lib/agent/model.d.ts +0 -8
  177. package/lib/agent/model.d.ts.map +0 -1
  178. package/lib/agent/model.js +0 -29
  179. package/lib/agent/model.js.map +0 -1
  180. package/lib/agent/module.d.ts +0 -81
  181. package/lib/agent/module.d.ts.map +0 -1
  182. package/lib/agent/module.js +0 -309
  183. package/lib/agent/module.js.map +0 -1
  184. package/lib/agent/openai.d.ts +0 -6
  185. package/lib/agent/openai.d.ts.map +0 -1
  186. package/lib/agent/openai.js +0 -41
  187. package/lib/agent/openai.js.map +0 -1
  188. package/lib/agent/program.d.ts +0 -12
  189. package/lib/agent/program.d.ts.map +0 -1
  190. package/lib/agent/program.js +0 -21
  191. package/lib/agent/program.js.map +0 -1
  192. package/lib/agent/prompts.d.ts +0 -4
  193. package/lib/agent/prompts.d.ts.map +0 -1
  194. package/lib/agent/prompts.js +0 -11
  195. package/lib/agent/prompts.js.map +0 -1
  196. package/lib/agent/scrape.d.ts +0 -71
  197. package/lib/agent/scrape.d.ts.map +0 -1
  198. package/lib/agent/scrape.js +0 -45
  199. package/lib/agent/scrape.js.map +0 -1
  200. package/lib/aws/auto/docs.d.ts +0 -11
  201. package/lib/aws/auto/docs.d.ts.map +0 -1
  202. package/lib/aws/auto/docs.js +0 -56
  203. package/lib/aws/auto/docs.js.map +0 -1
  204. package/lib/aws/auto/index.d.ts +0 -5
  205. package/lib/aws/auto/index.d.ts.map +0 -1
  206. package/lib/aws/auto/index.js +0 -5
  207. package/lib/aws/auto/index.js.map +0 -1
  208. package/lib/aws/auto/resource.d.ts +0 -24
  209. package/lib/aws/auto/resource.d.ts.map +0 -1
  210. package/lib/aws/auto/resource.js +0 -194
  211. package/lib/aws/auto/resource.js.map +0 -1
  212. package/lib/aws/auto/service.d.ts +0 -10
  213. package/lib/aws/auto/service.d.ts.map +0 -1
  214. package/lib/aws/auto/service.js +0 -34
  215. package/lib/aws/auto/service.js.map +0 -1
  216. package/lib/aws/auto/spec.d.ts +0 -83
  217. package/lib/aws/auto/spec.d.ts.map +0 -1
  218. package/lib/aws/auto/spec.js +0 -58
  219. package/lib/aws/auto/spec.js.map +0 -1
  220. package/lib/markdown/design.d.ts +0 -17
  221. package/lib/markdown/design.d.ts.map +0 -1
  222. package/lib/markdown/design.js +0 -92
  223. package/lib/markdown/design.js.map +0 -1
  224. package/lib/markdown/extract.d.ts +0 -7
  225. package/lib/markdown/extract.d.ts.map +0 -1
  226. package/lib/markdown/extract.js +0 -10
  227. package/lib/markdown/extract.js.map +0 -1
  228. package/lib/markdown/index.d.ts +0 -4
  229. package/lib/markdown/index.d.ts.map +0 -1
  230. package/lib/markdown/index.js +0 -4
  231. package/lib/markdown/index.js.map +0 -1
  232. package/lib/markdown/requirements.d.ts +0 -79
  233. package/lib/markdown/requirements.d.ts.map +0 -1
  234. package/lib/markdown/requirements.js +0 -105
  235. package/lib/markdown/requirements.js.map +0 -1
  236. package/lib/typescript/check-omission.d.ts +0 -2
  237. package/lib/typescript/check-omission.d.ts.map +0 -1
  238. package/lib/typescript/check-omission.js +0 -43
  239. package/lib/typescript/check-omission.js.map +0 -1
  240. package/lib/typescript/debug-type-errors.d.ts +0 -3
  241. package/lib/typescript/debug-type-errors.d.ts.map +0 -1
  242. package/lib/typescript/debug-type-errors.js +0 -35
  243. package/lib/typescript/debug-type-errors.js.map +0 -1
  244. package/lib/typescript/extract.d.ts +0 -7
  245. package/lib/typescript/extract.d.ts.map +0 -1
  246. package/lib/typescript/extract.js +0 -10
  247. package/lib/typescript/extract.js.map +0 -1
  248. package/lib/typescript/index.d.ts +0 -7
  249. package/lib/typescript/index.d.ts.map +0 -1
  250. package/lib/typescript/index.js +0 -7
  251. package/lib/typescript/index.js.map +0 -1
  252. package/lib/typescript/install-dependencies.d.ts +0 -29
  253. package/lib/typescript/install-dependencies.d.ts.map +0 -1
  254. package/lib/typescript/install-dependencies.js +0 -52
  255. package/lib/typescript/install-dependencies.js.map +0 -1
  256. package/lib/typescript/package.d.ts +0 -157
  257. package/lib/typescript/package.d.ts.map +0 -1
  258. package/lib/typescript/package.js +0 -115
  259. package/lib/typescript/package.js.map +0 -1
  260. package/lib/typescript/repair-omissions.d.ts +0 -3
  261. package/lib/typescript/repair-omissions.d.ts.map +0 -1
  262. package/lib/typescript/repair-omissions.js +0 -23
  263. package/lib/typescript/repair-omissions.js.map +0 -1
  264. package/lib/typescript/repair.d.ts +0 -3
  265. package/lib/typescript/repair.d.ts.map +0 -1
  266. package/lib/typescript/repair.js +0 -34
  267. package/lib/typescript/repair.js.map +0 -1
  268. package/lib/typescript/tsconfig.d.ts +0 -469
  269. package/lib/typescript/tsconfig.d.ts.map +0 -1
  270. package/lib/typescript/tsconfig.js +0 -143
  271. package/lib/typescript/tsconfig.js.map +0 -1
  272. package/lib/typescript/typescript.d.ts +0 -107
  273. package/lib/typescript/typescript.d.ts.map +0 -1
  274. package/lib/typescript/typescript.js +0 -180
  275. package/lib/typescript/typescript.js.map +0 -1
  276. package/lib/typescript/validate.d.ts +0 -10
  277. package/lib/typescript/validate.d.ts.map +0 -1
  278. package/lib/typescript/validate.js +0 -49
  279. package/lib/typescript/validate.js.map +0 -1
  280. package/src/agent/ai.ts +0 -215
  281. package/src/agent/anthropic.ts +0 -31
  282. package/src/agent/dependencies.ts +0 -62
  283. package/src/agent/file-context.ts +0 -8
  284. package/src/agent/index.ts +0 -9
  285. package/src/agent/model.ts +0 -39
  286. package/src/agent/module.ts +0 -418
  287. package/src/agent/openai.ts +0 -50
  288. package/src/agent/program.md +0 -38
  289. package/src/agent/program.ts +0 -37
  290. package/src/agent/prompts.ts +0 -20
  291. package/src/agent/scrape.ts +0 -47
  292. package/src/aws/auto/cfn.json +0 -225310
  293. package/src/aws/auto/docs.ts +0 -73
  294. package/src/aws/auto/index.ts +0 -4
  295. package/src/aws/auto/resource.ts +0 -269
  296. package/src/aws/auto/service.ts +0 -51
  297. package/src/aws/auto/spec.ts +0 -160
  298. package/src/markdown/design.ts +0 -125
  299. package/src/markdown/extract.ts +0 -9
  300. package/src/markdown/index.ts +0 -3
  301. package/src/markdown/requirements.ts +0 -135
  302. package/src/typescript/check-omission.ts +0 -47
  303. package/src/typescript/debug-type-errors.ts +0 -42
  304. package/src/typescript/extract.ts +0 -9
  305. package/src/typescript/index.ts +0 -6
  306. package/src/typescript/install-dependencies.ts +0 -61
  307. package/src/typescript/package.ts +0 -143
  308. package/src/typescript/repair-omissions.ts +0 -31
  309. package/src/typescript/repair.ts +0 -45
  310. package/src/typescript/tsconfig.ts +0 -170
  311. package/src/typescript/typescript.ts +0 -217
  312. package/src/typescript/validate.ts +0 -73
@@ -0,0 +1,93 @@
1
+ import { Resource } from "../resource";
2
+ import { createCloudflareApi } from "./api";
3
+ export class KVNamespace extends Resource("cloudflare::KVNamespace", async (ctx, props) => {
4
+ // Create Cloudflare API client with automatic account discovery
5
+ const api = await createCloudflareApi();
6
+ if (ctx.event === "delete") {
7
+ // For delete operations, we need to check if the namespace ID exists in the output
8
+ const namespaceId = ctx.output?.id;
9
+ if (namespaceId) {
10
+ // Delete KV namespace
11
+ const deleteResponse = await api.delete(`/accounts/${api.accountId}/storage/kv/namespaces/${namespaceId}`);
12
+ if (!deleteResponse.ok && deleteResponse.status !== 404) {
13
+ const errorData = await deleteResponse.json().catch(() => ({
14
+ errors: [{ message: deleteResponse.statusText }],
15
+ }));
16
+ console.error("Error deleting KV namespace:", errorData.errors?.[0]?.message || deleteResponse.statusText);
17
+ }
18
+ }
19
+ // Return minimal output for deleted state
20
+ return;
21
+ }
22
+ else {
23
+ // For create or update operations
24
+ // If ctx.event is "update", we expect ctx.output to exist
25
+ let namespaceId = ctx.event === "update" ? ctx.output?.id || "" : "";
26
+ let createdAt = ctx.event === "update"
27
+ ? ctx.output?.createdAt || Date.now()
28
+ : Date.now();
29
+ if (ctx.event === "update" && namespaceId) {
30
+ // Can't update a KV namespace title directly, just work with existing ID
31
+ }
32
+ else {
33
+ // Create new KV namespace
34
+ const createResponse = await api.post(`/accounts/${api.accountId}/storage/kv/namespaces`, {
35
+ title: props.title,
36
+ });
37
+ if (!createResponse.ok) {
38
+ const errorData = await createResponse.json().catch(() => ({
39
+ errors: [{ message: createResponse.statusText }],
40
+ }));
41
+ throw new Error(`Error creating KV namespace '${props.title}': ${errorData.errors?.[0]?.message || createResponse.statusText}`);
42
+ }
43
+ const createResult = await createResponse.json();
44
+ namespaceId = createResult.result.id;
45
+ createdAt = Date.now();
46
+ }
47
+ // Handle KV pairs if provided
48
+ if (props.values && props.values.length > 0 && namespaceId) {
49
+ // Process KV pairs in batches of 10000 (API limit)
50
+ const BATCH_SIZE = 10000;
51
+ for (let i = 0; i < props.values.length; i += BATCH_SIZE) {
52
+ const batch = props.values.slice(i, i + BATCH_SIZE);
53
+ const bulkPayload = batch.map((entry) => {
54
+ const item = {
55
+ key: entry.key,
56
+ value: typeof entry.value === "string"
57
+ ? entry.value
58
+ : JSON.stringify(entry.value),
59
+ };
60
+ if (entry.expiration) {
61
+ item.expiration = entry.expiration;
62
+ }
63
+ if (entry.expirationTtl) {
64
+ item.expiration_ttl = entry.expirationTtl;
65
+ }
66
+ if (entry.metadata) {
67
+ item.metadata = entry.metadata;
68
+ }
69
+ return item;
70
+ });
71
+ const bulkResponse = await api.put(`/accounts/${api.accountId}/storage/kv/namespaces/${namespaceId}/bulk`, bulkPayload);
72
+ if (!bulkResponse.ok) {
73
+ const errorData = await bulkResponse.json().catch(() => ({
74
+ errors: [{ message: bulkResponse.statusText }],
75
+ }));
76
+ console.warn(`Error writing KV batch: ${errorData.errors?.[0]?.message || bulkResponse.statusText}`);
77
+ }
78
+ }
79
+ }
80
+ const now = Date.now();
81
+ // Construct the output
82
+ const output = {
83
+ id: namespaceId,
84
+ title: props.title,
85
+ values: props.values,
86
+ createdAt: createdAt,
87
+ modifiedAt: now,
88
+ };
89
+ return output;
90
+ }
91
+ }) {
92
+ }
93
+ //# sourceMappingURL=kv-namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kv-namespace.js","sourceRoot":"","sources":["../../src/cloudflare/kv-namespace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { KVNamespace } from "@cloudflare/workers-types";
2
+ import type { State, StateStore } from "../state";
3
+ /**
4
+ * Options for CloudflareStateStore
5
+ */
6
+ export interface CloudflareStateStoreOptions {
7
+ /**
8
+ * The prefix to use for keys in the KV namespace
9
+ * This allows multiple state stores to use the same KV namespace
10
+ */
11
+ prefix?: string;
12
+ }
13
+ /**
14
+ * State store implementation using Cloudflare KV Namespace
15
+ */
16
+ export declare class CloudflareStateStore implements StateStore {
17
+ private namespace;
18
+ private prefix;
19
+ /**
20
+ * Create a new CloudflareStateStore
21
+ *
22
+ * @param namespace The KV namespace to use for storing state
23
+ * @param options Options for the state store
24
+ */
25
+ constructor(namespace: KVNamespace, options?: CloudflareStateStoreOptions);
26
+ /**
27
+ * No initialization needed for KV namespaces as they are pre-provisioned
28
+ */
29
+ init(): Promise<void>;
30
+ /**
31
+ * KV namespaces cannot be deleted programmatically
32
+ */
33
+ deinit(): Promise<void>;
34
+ /**
35
+ * List all resources in the state store
36
+ */
37
+ list(): Promise<string[]>;
38
+ /**
39
+ * Count the number of items in the state store
40
+ */
41
+ count(): Promise<number>;
42
+ /**
43
+ * Get a state by key
44
+ *
45
+ * @param key The key to look up
46
+ * @returns The state or undefined if not found
47
+ */
48
+ get(key: string): Promise<State | undefined>;
49
+ /**
50
+ * Get multiple states by their keys
51
+ *
52
+ * @param ids Array of keys to fetch
53
+ * @returns Record mapping keys to their states
54
+ */
55
+ getBatch(ids: string[]): Promise<Record<string, State>>;
56
+ /**
57
+ * Get all states in the store
58
+ *
59
+ * @returns Record mapping all keys to their states
60
+ */
61
+ all(): Promise<Record<string, State>>;
62
+ /**
63
+ * Set a state for a key
64
+ *
65
+ * @param key The key to set
66
+ * @param value The state to store
67
+ */
68
+ set(key: string, value: State): Promise<void>;
69
+ /**
70
+ * Delete a state by key
71
+ *
72
+ * @param key The key to delete
73
+ */
74
+ delete(key: string): Promise<void>;
75
+ /**
76
+ * Get the namespaced key for storage
77
+ *
78
+ * @param key The original key
79
+ * @returns The key with prefix for use in the KV namespace
80
+ */
81
+ private getNamespacedKey;
82
+ }
83
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/cloudflare/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,UAAU;IACrD,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;;OAKG;gBAED,SAAS,EAAE,WAAW,EACtB,OAAO,GAAE,2BAAgC;IAM3C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAK9B;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAKlD;;;;;OAKG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAgB7D;;;;OAIG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAK3C;;;;;OAKG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;CAGzB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * State store implementation using Cloudflare KV Namespace
3
+ */
4
+ export class CloudflareStateStore {
5
+ namespace;
6
+ prefix;
7
+ /**
8
+ * Create a new CloudflareStateStore
9
+ *
10
+ * @param namespace The KV namespace to use for storing state
11
+ * @param options Options for the state store
12
+ */
13
+ constructor(namespace, options = {}) {
14
+ this.namespace = namespace;
15
+ this.prefix = options.prefix || "alchemy-state:";
16
+ }
17
+ /**
18
+ * No initialization needed for KV namespaces as they are pre-provisioned
19
+ */
20
+ async init() {
21
+ // KV namespaces are pre-provisioned in Cloudflare, so no initialization is needed
22
+ }
23
+ /**
24
+ * KV namespaces cannot be deleted programmatically
25
+ */
26
+ async deinit() {
27
+ // KV namespaces can only be deleted through the Cloudflare dashboard or API
28
+ // We cannot delete the namespace itself here
29
+ }
30
+ /**
31
+ * List all resources in the state store
32
+ */
33
+ async list() {
34
+ const list = await this.namespace.list({ prefix: this.prefix });
35
+ return list.keys.map((key) => key.name.slice(this.prefix.length));
36
+ }
37
+ /**
38
+ * Count the number of items in the state store
39
+ */
40
+ async count() {
41
+ const list = await this.namespace.list({ prefix: this.prefix });
42
+ return list.keys.length;
43
+ }
44
+ /**
45
+ * Get a state by key
46
+ *
47
+ * @param key The key to look up
48
+ * @returns The state or undefined if not found
49
+ */
50
+ async get(key) {
51
+ const data = await this.namespace.get(this.getNamespacedKey(key), "json");
52
+ return data;
53
+ }
54
+ /**
55
+ * Get multiple states by their keys
56
+ *
57
+ * @param ids Array of keys to fetch
58
+ * @returns Record mapping keys to their states
59
+ */
60
+ async getBatch(ids) {
61
+ const result = {};
62
+ // KV doesn't have a native batch get operation, so we need to make multiple requests
63
+ // We could optimize this with Promise.all for parallel fetching
64
+ const promises = ids.map(async (id) => {
65
+ const state = await this.get(id);
66
+ if (state) {
67
+ result[id] = state;
68
+ }
69
+ });
70
+ await Promise.all(promises);
71
+ return result;
72
+ }
73
+ /**
74
+ * Get all states in the store
75
+ *
76
+ * @returns Record mapping all keys to their states
77
+ */
78
+ async all() {
79
+ const keys = await this.list();
80
+ return this.getBatch(keys);
81
+ }
82
+ /**
83
+ * Set a state for a key
84
+ *
85
+ * @param key The key to set
86
+ * @param value The state to store
87
+ */
88
+ async set(key, value) {
89
+ await this.namespace.put(this.getNamespacedKey(key), JSON.stringify(value));
90
+ }
91
+ /**
92
+ * Delete a state by key
93
+ *
94
+ * @param key The key to delete
95
+ */
96
+ async delete(key) {
97
+ await this.namespace.delete(this.getNamespacedKey(key));
98
+ }
99
+ /**
100
+ * Get the namespaced key for storage
101
+ *
102
+ * @param key The original key
103
+ * @returns The key with prefix for use in the KV namespace
104
+ */
105
+ getNamespacedKey(key) {
106
+ return `${this.prefix}${key}`;
107
+ }
108
+ }
109
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/cloudflare/state.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACvB,SAAS,CAAc;IACvB,MAAM,CAAS;IAEvB;;;;;OAKG;IACH,YACE,SAAsB,EACtB,UAAuC,EAAE;QAEzC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,kFAAkF;IACpF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,4EAA4E;QAC5E,6CAA6C;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,OAAO,IAAyB,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAa;QAC1B,MAAM,MAAM,GAA0B,EAAE,CAAC;QAEzC,qFAAqF;QACrF,gEAAgE;QAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAY;QACjC,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,GAAW;QAClC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ export type Env = {
2
+ ASSETS: KVNamespace;
3
+ INDEX_PAGE: string;
4
+ ERROR_PAGE?: string;
5
+ /**
6
+ * Optional backend worker bound to this static site
7
+ * Used to handle requests that don't match any static files
8
+ */
9
+ BACKEND_WORKER?: Service;
10
+ } & {
11
+ [key in `ROUTE_${string}`]: Service;
12
+ } & {
13
+ [key in `__ROUTE_${string}`]: string;
14
+ };
15
+ declare const _default: {
16
+ fetch(request: Request, env: Env): Promise<Response>;
17
+ };
18
+ export default _default;
19
+ //# sourceMappingURL=static-site-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-router.d.ts","sourceRoot":"","sources":["../../src/cloudflare/static-site-router.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,GAAG,GAAG;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG;KAED,GAAG,IAAI,SAAS,MAAM,EAAE,GAAG,OAAO;CACpC,GAAG;KAED,GAAG,IAAI,WAAW,MAAM,EAAE,GAAG,MAAM;CACrC,CAAC;;mBAMqB,OAAO,OAAO,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAD5D,wBAqBE"}
@@ -0,0 +1,110 @@
1
+ import { Hono } from "hono";
2
+ let isInit = false;
3
+ const app = new Hono();
4
+ export default {
5
+ async fetch(request, env) {
6
+ if (!isInit) {
7
+ isInit = true;
8
+ for (const [key, value] of Object.entries(env)) {
9
+ if (key.startsWith("ROUTE_")) {
10
+ console.log(key, value);
11
+ const service = value;
12
+ const patternKey = `__${key}`;
13
+ if (!(patternKey in env)) {
14
+ throw new Error(`Missing pattern key: ${patternKey}`);
15
+ }
16
+ const pattern = env[`__${key}`];
17
+ console.log("pattern", pattern);
18
+ // TODO(sam): we should support narrowing down METHOD
19
+ app.all(pattern, (ctx) => service.fetch(ctx.req.raw));
20
+ }
21
+ }
22
+ }
23
+ return app.fetch(request, env);
24
+ },
25
+ };
26
+ // fall back to assuming the request is a static file
27
+ app.notFound(async (ctx) => {
28
+ console.log("not found");
29
+ const request = ctx.req;
30
+ const env = ctx.env;
31
+ const url = new URL(request.url);
32
+ const pathname = url.pathname.replace(/^\//, "");
33
+ const filePath = pathname === "" ? env.INDEX_PAGE : pathname;
34
+ // Return from cache if available
35
+ const cachedResponse = await lookupCache();
36
+ if (cachedResponse) {
37
+ return cachedResponse;
38
+ }
39
+ // Fetch from KV
40
+ {
41
+ const object = await env.ASSETS.getWithMetadata(filePath);
42
+ if (object.value) {
43
+ return await respond(200, filePath, object);
44
+ }
45
+ }
46
+ {
47
+ const guess = filePath + (filePath.endsWith("/") ? "" : "/") + "index.html";
48
+ const object = await env.ASSETS.getWithMetadata(guess);
49
+ if (object.value) {
50
+ return await respond(200, guess, object);
51
+ }
52
+ }
53
+ {
54
+ const guess = filePath + ".html";
55
+ const object = await env.ASSETS.getWithMetadata(guess);
56
+ if (object.value) {
57
+ return await respond(200, guess, object);
58
+ }
59
+ }
60
+ // Handle error page
61
+ if (env.ERROR_PAGE) {
62
+ const object = await env.ASSETS.getWithMetadata(env.ERROR_PAGE);
63
+ if (object.value) {
64
+ return await respond(404, env.ERROR_PAGE, object);
65
+ }
66
+ }
67
+ else {
68
+ const object = await env.ASSETS.getWithMetadata(env.INDEX_PAGE);
69
+ if (object.value) {
70
+ return await respond(200, env.INDEX_PAGE, object);
71
+ }
72
+ }
73
+ return new Response("Page Not Found", { status: 404 });
74
+ async function lookupCache() {
75
+ const cache = caches.default;
76
+ const r = await cache.match(request.url);
77
+ // cache does not exist
78
+ if (!r)
79
+ return;
80
+ // cache exists but etag does not match
81
+ if (r.headers.get("etag") !== __ASSET_MANIFEST__[filePath])
82
+ return;
83
+ // cache exists
84
+ return r;
85
+ }
86
+ async function saveCache(response) {
87
+ const cache = caches.default;
88
+ await cache.put(request.url, response.clone());
89
+ }
90
+ async function respond(status, filePath, object) {
91
+ // build response
92
+ const headers = new Headers();
93
+ if (__ASSET_MANIFEST__[filePath]) {
94
+ headers.set("etag", __ASSET_MANIFEST__[filePath]);
95
+ headers.set("content-type", object.metadata.contentType);
96
+ headers.set("cache-control", object.metadata.cacheControl);
97
+ }
98
+ // TODO: do we need base64 encoded here?
99
+ // const response = new Response(base64ToArrayBuffer(object.value), {
100
+ const response = new Response(object.value, {
101
+ status,
102
+ headers,
103
+ });
104
+ if (request.method === "GET") {
105
+ await saveCache(response);
106
+ }
107
+ return response;
108
+ }
109
+ });
110
+ //# sourceMappingURL=static-site-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site-router.js","sourceRoot":"","sources":["../../src/cloudflare/static-site-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,166 @@
1
+ import type { BundleProps } from "../esbuild";
2
+ import { Worker } from "./worker";
3
+ /**
4
+ * Idea of using KV with timeout inspired by SST: https://github.com/sst/sst/blob/dev/platform/src/components/cloudflare/static-site.ts
5
+ */
6
+ /**
7
+ * Properties for creating or updating a StaticSite
8
+ */
9
+ export interface StaticSiteProps {
10
+ /**
11
+ * Name for the site
12
+ * This is mandatory - must be explicitly specified
13
+ */
14
+ name: string;
15
+ /**
16
+ * Path to the directory containing static assets
17
+ */
18
+ dir: string;
19
+ /**
20
+ * Custom Worker script to serve the site
21
+ * If not provided, a default script will be used
22
+ */
23
+ workerScript?: string;
24
+ /**
25
+ * Worker script format
26
+ * 'esm' - ECMAScript modules (default)
27
+ * 'cjs' - CommonJS modules
28
+ * @default 'esm'
29
+ */
30
+ format?: "esm" | "cjs";
31
+ /**
32
+ * Custom error page path (relative to directory)
33
+ * @example "404.html"
34
+ */
35
+ errorPage?: string;
36
+ /**
37
+ * Index page filename
38
+ * @default "index.html"
39
+ */
40
+ indexPage?: string;
41
+ /**
42
+ * Configure how the static site's assets are uploaded to KV
43
+ */
44
+ assets?: {
45
+ /**
46
+ * File options for configuring caching behavior
47
+ */
48
+ fileOptions?: {
49
+ /**
50
+ * File pattern(s) to match
51
+ * Can be a glob string or array of glob strings
52
+ */
53
+ files: string | string[];
54
+ /**
55
+ * Files to ignore (glob patterns)
56
+ */
57
+ ignore?: string | string[];
58
+ /**
59
+ * Cache-Control header to set for matching files
60
+ */
61
+ cacheControl: string;
62
+ /**
63
+ * Content-Type to set (overrides auto-detection)
64
+ */
65
+ contentType?: string;
66
+ }[];
67
+ };
68
+ /**
69
+ * Whether the site should be deployed to production
70
+ * @default true
71
+ */
72
+ production?: boolean;
73
+ /**
74
+ * Custom domain for the site
75
+ */
76
+ domain?: string | {
77
+ name: string;
78
+ redirects?: string[];
79
+ };
80
+ build?: {
81
+ /**
82
+ * Command to run before deploying the site
83
+ * Will be executed in the shell to build the site
84
+ */
85
+ command?: string;
86
+ };
87
+ /**
88
+ * Bundle options for the worker script
89
+ */
90
+ bundle?: Partial<BundleProps>;
91
+ /**
92
+ * Additional workers to route requests to.
93
+ */
94
+ routes?: {
95
+ [key: string]: Worker;
96
+ };
97
+ }
98
+ /**
99
+ * Output returned after StaticSite creation/update
100
+ */
101
+ export interface StaticSiteOutput {
102
+ /**
103
+ * The ID of the site
104
+ */
105
+ id: string;
106
+ /**
107
+ * The ID of the worker
108
+ */
109
+ workerId: string;
110
+ /**
111
+ * Name for the site
112
+ */
113
+ name: string;
114
+ /**
115
+ * Path to the directory containing static assets
116
+ */
117
+ directory: string;
118
+ /**
119
+ * Worker script format
120
+ */
121
+ format?: "esm" | "cjs";
122
+ /**
123
+ * Custom error page path
124
+ */
125
+ errorPage?: string;
126
+ /**
127
+ * Index page filename
128
+ */
129
+ indexPage?: string;
130
+ /**
131
+ * Time at which the site was created
132
+ */
133
+ createdAt: number;
134
+ /**
135
+ * Time at which the site was last updated
136
+ */
137
+ updatedAt: number;
138
+ /**
139
+ * List of uploaded asset files
140
+ */
141
+ assets: string[];
142
+ /**
143
+ * Custom domain for the site
144
+ */
145
+ domain?: string | {
146
+ name: string;
147
+ redirects?: string[];
148
+ };
149
+ /**
150
+ * Whether the site is deployed to production
151
+ */
152
+ production?: boolean;
153
+ /**
154
+ * The URL of the deployed site
155
+ */
156
+ url?: string;
157
+ /**
158
+ * Information about the backend worker if configured
159
+ */
160
+ routes?: Record<string, string>;
161
+ }
162
+ declare const StaticSite_base: import("../resource").Provider<string, [props: StaticSiteProps], StaticSiteOutput>;
163
+ export declare class StaticSite extends StaticSite_base {
164
+ }
165
+ export {};
166
+ //# sourceMappingURL=static-site.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-site.d.ts","sourceRoot":"","sources":["../../src/cloudflare/static-site.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,WAAW,CAAC,EAAE;YACZ;;;eAGG;YACH,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAEzB;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;YAE3B;;eAEG;YACH,YAAY,EAAE,MAAM,CAAC;YAErB;;eAEG;YACH,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,EAAE,CAAC;KACL,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,MAAM,CAAC,EACH,MAAM,GACN;QACE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAEN,KAAK,CAAC,EAAE;QACN;;;WAGG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAEvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EACH,MAAM,GACN;QACE,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAEN;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;;AAED,qBAAa,UAAW,SAAQ,eAwL/B;CAAG"}