alchemy 0.55.3 → 0.57.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/bin/alchemy.js +14245 -14406
- package/bin/commands/create.ts +7 -7
- package/bin/commands/deploy.ts +2 -2
- package/bin/commands/destroy.ts +2 -2
- package/bin/commands/dev.ts +2 -2
- package/bin/commands/init.ts +6 -6
- package/bin/commands/login.ts +3 -3
- package/bin/commands/run.ts +2 -2
- package/bin/services/execute-alchemy.ts +3 -3
- package/bin/trpc.ts +49 -0
- package/lib/alchemy.d.ts.map +1 -1
- package/lib/alchemy.js +7 -0
- package/lib/alchemy.js.map +1 -1
- package/lib/apply.d.ts.map +1 -1
- package/lib/apply.js +3 -4
- package/lib/apply.js.map +1 -1
- package/lib/cloudflare/{astro.d.ts → astro/astro.d.ts} +6 -5
- package/lib/cloudflare/astro/astro.d.ts.map +1 -0
- package/lib/cloudflare/astro/astro.js +91 -0
- package/lib/cloudflare/astro/astro.js.map +1 -0
- package/lib/cloudflare/astro/plugin.d.ts +4 -0
- package/lib/cloudflare/astro/plugin.d.ts.map +1 -0
- package/lib/cloudflare/astro/plugin.js +10 -0
- package/lib/cloudflare/astro/plugin.js.map +1 -0
- package/lib/cloudflare/bundle/plugin-hot-reload.d.ts +1 -3
- package/lib/cloudflare/bundle/plugin-hot-reload.d.ts.map +1 -1
- package/lib/cloudflare/bundle/plugin-hot-reload.js +4 -1
- package/lib/cloudflare/bundle/plugin-hot-reload.js.map +1 -1
- package/lib/cloudflare/cloudflare-env-proxy.d.ts +4 -0
- package/lib/cloudflare/cloudflare-env-proxy.d.ts.map +1 -0
- package/lib/cloudflare/cloudflare-env-proxy.js +34 -0
- package/lib/cloudflare/cloudflare-env-proxy.js.map +1 -0
- package/lib/cloudflare/compatibility-date.gen.d.ts +1 -1
- package/lib/cloudflare/compatibility-date.gen.js +1 -1
- package/lib/cloudflare/compatibility-presets.d.ts +1 -1
- package/lib/cloudflare/compatibility-presets.js +1 -1
- package/lib/cloudflare/compatibility-presets.js.map +1 -1
- package/lib/cloudflare/d1-local-migrations.js +1 -1
- package/lib/cloudflare/d1-local-migrations.js.map +1 -1
- package/lib/cloudflare/index.d.ts +8 -8
- package/lib/cloudflare/index.d.ts.map +1 -1
- package/lib/cloudflare/index.js +8 -8
- package/lib/cloudflare/index.js.map +1 -1
- package/lib/cloudflare/miniflare/build-worker-options.d.ts +22 -0
- package/lib/cloudflare/miniflare/build-worker-options.d.ts.map +1 -0
- package/lib/cloudflare/miniflare/build-worker-options.js +394 -0
- package/lib/cloudflare/miniflare/build-worker-options.js.map +1 -0
- package/lib/cloudflare/miniflare/miniflare-controller.d.ts +23 -0
- package/lib/cloudflare/miniflare/miniflare-controller.d.ts.map +1 -0
- package/lib/cloudflare/miniflare/miniflare-controller.js +111 -0
- package/lib/cloudflare/miniflare/miniflare-controller.js.map +1 -0
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js +5 -15
- package/lib/cloudflare/miniflare/miniflare-worker-proxy.js.map +1 -1
- package/lib/cloudflare/miniflare/paths.d.ts +5 -0
- package/lib/cloudflare/miniflare/paths.d.ts.map +1 -0
- package/lib/cloudflare/miniflare/paths.js +35 -0
- package/lib/cloudflare/miniflare/paths.js.map +1 -0
- package/lib/cloudflare/miniflare/remote-binding-proxy.d.ts +1 -5
- package/lib/cloudflare/miniflare/remote-binding-proxy.d.ts.map +1 -1
- package/lib/cloudflare/miniflare/remote-binding-proxy.js +17 -22
- package/lib/cloudflare/miniflare/remote-binding-proxy.js.map +1 -1
- package/lib/cloudflare/{nuxt.d.ts → nuxt/nuxt.d.ts} +4 -4
- package/lib/cloudflare/nuxt/nuxt.d.ts.map +1 -0
- package/lib/cloudflare/{nuxt.js → nuxt/nuxt.js} +8 -13
- package/lib/cloudflare/nuxt/nuxt.js.map +1 -0
- package/lib/cloudflare/nuxt/plugin.d.ts +4 -0
- package/lib/cloudflare/nuxt/plugin.d.ts.map +1 -0
- package/lib/cloudflare/nuxt/plugin.js +14 -0
- package/lib/cloudflare/nuxt/plugin.js.map +1 -0
- package/lib/cloudflare/oauth.js +2 -2
- package/lib/cloudflare/oauth.js.map +1 -1
- package/lib/cloudflare/orange.d.ts +3 -3
- package/lib/cloudflare/orange.d.ts.map +1 -1
- package/lib/cloudflare/orange.js +11 -21
- package/lib/cloudflare/orange.js.map +1 -1
- package/lib/cloudflare/react-router/plugin.d.ts +4 -0
- package/lib/cloudflare/react-router/plugin.d.ts.map +1 -0
- package/lib/cloudflare/react-router/plugin.js +11 -0
- package/lib/cloudflare/react-router/plugin.js.map +1 -0
- package/lib/cloudflare/react-router/react-router.d.ts +17 -0
- package/lib/cloudflare/react-router/react-router.d.ts.map +1 -0
- package/lib/cloudflare/react-router/react-router.js +21 -0
- package/lib/cloudflare/react-router/react-router.js.map +1 -0
- package/lib/cloudflare/redwood/plugin.d.ts +4 -0
- package/lib/cloudflare/redwood/plugin.d.ts.map +1 -0
- package/lib/cloudflare/redwood/plugin.js +19 -0
- package/lib/cloudflare/redwood/plugin.js.map +1 -0
- package/lib/cloudflare/{redwood.d.ts → redwood/redwood.d.ts} +5 -5
- package/lib/cloudflare/redwood/redwood.d.ts.map +1 -0
- package/lib/cloudflare/{redwood.js → redwood/redwood.js} +12 -13
- package/lib/cloudflare/redwood/redwood.js.map +1 -0
- package/lib/cloudflare/sveltekit/plugin.d.ts +4 -0
- package/lib/cloudflare/sveltekit/plugin.d.ts.map +1 -0
- package/lib/cloudflare/sveltekit/plugin.js +11 -0
- package/lib/cloudflare/sveltekit/plugin.js.map +1 -0
- package/lib/cloudflare/{sveltekit.d.ts → sveltekit/sveltekit.d.ts} +5 -5
- package/lib/cloudflare/sveltekit/sveltekit.d.ts.map +1 -0
- package/lib/cloudflare/{sveltekit.js → sveltekit/sveltekit.js} +4 -4
- package/lib/cloudflare/sveltekit/sveltekit.js.map +1 -0
- package/lib/cloudflare/tanstack-start/plugin.d.ts +16 -0
- package/lib/cloudflare/tanstack-start/plugin.d.ts.map +1 -0
- package/lib/cloudflare/tanstack-start/plugin.js +28 -0
- package/lib/cloudflare/tanstack-start/plugin.js.map +1 -0
- package/lib/cloudflare/{tanstack-start.d.ts → tanstack-start/tanstack-start.d.ts} +5 -5
- package/lib/cloudflare/tanstack-start/tanstack-start.d.ts.map +1 -0
- package/lib/cloudflare/tanstack-start/tanstack-start.js +11 -0
- package/lib/cloudflare/tanstack-start/tanstack-start.js.map +1 -0
- package/lib/cloudflare/vite/plugin.d.ts +4 -0
- package/lib/cloudflare/vite/plugin.d.ts.map +1 -0
- package/lib/cloudflare/vite/plugin.js +23 -0
- package/lib/cloudflare/vite/plugin.js.map +1 -0
- package/lib/cloudflare/{vite.d.ts → vite/vite.d.ts} +4 -4
- package/lib/cloudflare/vite/vite.d.ts.map +1 -0
- package/lib/cloudflare/vite/vite.js +19 -0
- package/lib/cloudflare/vite/vite.js.map +1 -0
- package/lib/cloudflare/website.d.ts +92 -70
- package/lib/cloudflare/website.d.ts.map +1 -1
- package/lib/cloudflare/website.js +225 -94
- package/lib/cloudflare/website.js.map +1 -1
- package/lib/cloudflare/worker-bundle.d.ts +3 -1
- package/lib/cloudflare/worker-bundle.d.ts.map +1 -1
- package/lib/cloudflare/worker-bundle.js +42 -16
- package/lib/cloudflare/worker-bundle.js.map +1 -1
- package/lib/cloudflare/worker-stub.d.ts.map +1 -1
- package/lib/cloudflare/worker-stub.js +3 -6
- package/lib/cloudflare/worker-stub.js.map +1 -1
- package/lib/cloudflare/worker.d.ts +2 -7
- package/lib/cloudflare/worker.d.ts.map +1 -1
- package/lib/cloudflare/worker.js +17 -157
- package/lib/cloudflare/worker.js.map +1 -1
- package/lib/cloudflare/wrangler.json.d.ts +6 -0
- package/lib/cloudflare/wrangler.json.d.ts.map +1 -1
- package/lib/cloudflare/wrangler.json.js +23 -6
- package/lib/cloudflare/wrangler.json.js.map +1 -1
- package/lib/context.d.ts +11 -0
- package/lib/context.d.ts.map +1 -1
- package/lib/context.js +8 -0
- package/lib/context.js.map +1 -1
- package/lib/env.d.ts +2 -2
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +5 -6
- package/lib/env.js.map +1 -1
- package/lib/random/index.d.ts +2 -0
- package/lib/random/index.d.ts.map +1 -0
- package/lib/random/index.js +2 -0
- package/lib/random/index.js.map +1 -0
- package/lib/random/random-string.d.ts +87 -0
- package/lib/random/random-string.d.ts.map +1 -0
- package/lib/random/random-string.js +72 -0
- package/lib/random/random-string.js.map +1 -0
- package/lib/runtime/bind.d.ts +1 -1
- package/lib/runtime/bind.d.ts.map +1 -1
- package/lib/runtime/bind.js.map +1 -1
- package/lib/scope.d.ts +11 -0
- package/lib/scope.d.ts.map +1 -1
- package/lib/scope.js +24 -0
- package/lib/scope.js.map +1 -1
- package/lib/secret.d.ts +2 -2
- package/lib/secret.d.ts.map +1 -1
- package/lib/secret.js +2 -2
- package/lib/secret.js.map +1 -1
- package/lib/state/cloudflare-state-store.js +1 -1
- package/lib/state/cloudflare-state-store.js.map +1 -1
- package/lib/state/dofs-state-store/index.js +1 -1
- package/lib/state/dofs-state-store/index.js.map +1 -1
- package/lib/util/detect-package-manager.d.ts +1 -0
- package/lib/util/detect-package-manager.d.ts.map +1 -1
- package/lib/util/detect-package-manager.js +10 -0
- package/lib/util/detect-package-manager.js.map +1 -1
- package/lib/util/telemetry/client.d.ts +1 -1
- package/lib/util/telemetry/client.d.ts.map +1 -1
- package/lib/util/telemetry/client.js +22 -1
- package/lib/util/telemetry/client.js.map +1 -1
- package/lib/util/telemetry/constants.d.ts.map +1 -1
- package/lib/util/telemetry/constants.js +2 -3
- package/lib/util/telemetry/constants.js.map +1 -1
- package/lib/util/telemetry/context.d.ts +1 -1
- package/lib/util/telemetry/context.d.ts.map +1 -1
- package/lib/util/telemetry/types.d.ts +7 -3
- package/lib/util/telemetry/types.d.ts.map +1 -1
- package/lib/vercel/api.d.ts.map +1 -1
- package/lib/vercel/api.js +1 -1
- package/lib/vercel/api.js.map +1 -1
- package/package.json +43 -4
- package/src/alchemy.ts +7 -0
- package/src/apply.ts +3 -7
- package/src/cloudflare/{astro.ts → astro/astro.ts} +46 -29
- package/src/cloudflare/astro/plugin.ts +11 -0
- package/src/cloudflare/bundle/plugin-hot-reload.ts +4 -3
- package/src/cloudflare/cloudflare-env-proxy.ts +50 -0
- package/src/cloudflare/compatibility-date.gen.ts +1 -1
- package/src/cloudflare/compatibility-presets.ts +1 -1
- package/src/cloudflare/d1-local-migrations.ts +1 -1
- package/src/cloudflare/index.ts +8 -8
- package/src/cloudflare/miniflare/build-worker-options.ts +454 -0
- package/src/cloudflare/miniflare/miniflare-controller.ts +129 -0
- package/src/cloudflare/miniflare/miniflare-worker-proxy.ts +6 -15
- package/src/cloudflare/miniflare/paths.ts +52 -0
- package/src/cloudflare/miniflare/remote-binding-proxy.ts +18 -23
- package/src/cloudflare/{nuxt.ts → nuxt/nuxt.ts} +11 -16
- package/src/cloudflare/nuxt/plugin.ts +18 -0
- package/src/cloudflare/oauth.ts +2 -2
- package/src/cloudflare/orange.ts +13 -23
- package/src/cloudflare/react-router/plugin.ts +13 -0
- package/src/cloudflare/react-router/react-router.ts +41 -0
- package/src/cloudflare/redwood/plugin.ts +20 -0
- package/src/cloudflare/{redwood.ts → redwood/redwood.ts} +16 -19
- package/src/cloudflare/sveltekit/plugin.ts +12 -0
- package/src/cloudflare/{sveltekit.ts → sveltekit/sveltekit.ts} +9 -8
- package/src/cloudflare/tanstack-start/plugin.ts +30 -0
- package/src/cloudflare/tanstack-start/tanstack-start.ts +24 -0
- package/src/cloudflare/vite/plugin.ts +30 -0
- package/src/cloudflare/vite/vite.ts +34 -0
- package/src/cloudflare/website.ts +379 -204
- package/src/cloudflare/worker-bundle.ts +55 -16
- package/src/cloudflare/worker-stub.ts +11 -14
- package/src/cloudflare/worker.ts +23 -205
- package/src/cloudflare/wrangler.json.ts +32 -4
- package/src/context.ts +19 -0
- package/src/env.ts +8 -9
- package/src/random/index.ts +1 -0
- package/src/random/random-string.ts +126 -0
- package/src/runtime/bind.ts +2 -2
- package/src/scope.ts +25 -0
- package/src/secret.ts +4 -8
- package/src/state/cloudflare-state-store.ts +2 -2
- package/src/state/dofs-state-store/index.ts +1 -1
- package/src/util/detect-package-manager.ts +11 -0
- package/src/util/telemetry/client.ts +25 -2
- package/src/util/telemetry/constants.ts +2 -4
- package/src/util/telemetry/context.ts +1 -1
- package/src/util/telemetry/types.ts +8 -2
- package/src/vercel/api.ts +2 -4
- package/templates/astro/alchemy.run.ts +1 -3
- package/templates/astro/astro.config.mjs +2 -2
- package/templates/nuxt/alchemy.run.ts +1 -3
- package/templates/nuxt/nuxt.config.ts +4 -5
- package/templates/nuxt/package.json +0 -1
- package/templates/react-router/alchemy.run.ts +1 -4
- package/templates/react-router/vite.config.ts +2 -2
- package/templates/rwsdk/alchemy.run.ts +0 -1
- package/templates/rwsdk/package.json +0 -2
- package/templates/rwsdk/vite.config.mts +2 -2
- package/templates/sveltekit/alchemy.run.ts +1 -3
- package/templates/sveltekit/svelte.config.js +2 -2
- package/templates/tanstack-start/vite.config.ts +2 -2
- package/templates/vite/alchemy.run.ts +1 -1
- package/templates/vite/vite.config.ts +4 -5
- package/workers/cloudflare-state-store.js +12 -14
- package/lib/cloudflare/astro.d.ts.map +0 -1
- package/lib/cloudflare/astro.js +0 -69
- package/lib/cloudflare/astro.js.map +0 -1
- package/lib/cloudflare/local-dev-cloudflare-shim.d.ts +0 -13
- package/lib/cloudflare/local-dev-cloudflare-shim.d.ts.map +0 -1
- package/lib/cloudflare/local-dev-cloudflare-shim.js +0 -26
- package/lib/cloudflare/local-dev-cloudflare-shim.js.map +0 -1
- package/lib/cloudflare/miniflare/miniflare-worker-options.d.ts +0 -14
- package/lib/cloudflare/miniflare/miniflare-worker-options.d.ts.map +0 -1
- package/lib/cloudflare/miniflare/miniflare-worker-options.js +0 -468
- package/lib/cloudflare/miniflare/miniflare-worker-options.js.map +0 -1
- package/lib/cloudflare/miniflare/miniflare.d.ts +0 -40
- package/lib/cloudflare/miniflare/miniflare.d.ts.map +0 -1
- package/lib/cloudflare/miniflare/miniflare.js +0 -142
- package/lib/cloudflare/miniflare/miniflare.js.map +0 -1
- package/lib/cloudflare/nuxt.d.ts.map +0 -1
- package/lib/cloudflare/nuxt.js.map +0 -1
- package/lib/cloudflare/react-router.d.ts +0 -17
- package/lib/cloudflare/react-router.d.ts.map +0 -1
- package/lib/cloudflare/react-router.js +0 -35
- package/lib/cloudflare/react-router.js.map +0 -1
- package/lib/cloudflare/redwood.d.ts.map +0 -1
- package/lib/cloudflare/redwood.js.map +0 -1
- package/lib/cloudflare/sveltekit.d.ts.map +0 -1
- package/lib/cloudflare/sveltekit.js.map +0 -1
- package/lib/cloudflare/tanstack-start.d.ts.map +0 -1
- package/lib/cloudflare/tanstack-start.js +0 -21
- package/lib/cloudflare/tanstack-start.js.map +0 -1
- package/lib/cloudflare/vite.d.ts.map +0 -1
- package/lib/cloudflare/vite.js +0 -20
- package/lib/cloudflare/vite.js.map +0 -1
- package/src/cloudflare/local-dev-cloudflare-shim.ts +0 -25
- package/src/cloudflare/miniflare/miniflare-worker-options.ts +0 -599
- package/src/cloudflare/miniflare/miniflare.ts +0 -183
- package/src/cloudflare/react-router.ts +0 -56
- package/src/cloudflare/tanstack-start.ts +0 -35
- package/src/cloudflare/vite.ts +0 -35
- package/templates/react-router/wrangler.jsonc +0 -6
- package/templates/rwsdk/wrangler.jsonc +0 -31
- package/templates/sveltekit/wrangler.jsonc +0 -7
- package/templates/tanstack-start/wrangler.jsonc +0 -7
- package/templates/typescript/index.ts +0 -1
- package/templates/vite/wrangler.jsonc +0 -6
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { alchemy } from "../alchemy.ts";
|
|
2
|
+
import { Resource } from "../resource.ts";
|
|
3
|
+
import type { Secret } from "../secret.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Properties for configuring a random string generation
|
|
7
|
+
*/
|
|
8
|
+
export interface RandomStringProps {
|
|
9
|
+
/**
|
|
10
|
+
* The number of random bytes to generate.
|
|
11
|
+
* The actual string length will depend on the encoding:
|
|
12
|
+
* - hex: length * 2 characters
|
|
13
|
+
* - base64: approximately length * 1.33 characters
|
|
14
|
+
* @default 32
|
|
15
|
+
*/
|
|
16
|
+
length?: number;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The encoding format for the random string.
|
|
20
|
+
* - "hex": Hexadecimal encoding (0-9, a-f)
|
|
21
|
+
* - "base64": Base64 encoding (A-Z, a-z, 0-9, +, /)
|
|
22
|
+
* @default "hex"
|
|
23
|
+
*/
|
|
24
|
+
encoding?: "hex" | "base64";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A cryptographically secure random string resource
|
|
29
|
+
*/
|
|
30
|
+
export interface RandomString extends Resource<"random::String"> {
|
|
31
|
+
/**
|
|
32
|
+
* The generated random string value, stored as a secret
|
|
33
|
+
*/
|
|
34
|
+
value: Secret;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The length of the random string
|
|
38
|
+
*/
|
|
39
|
+
length: number;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The encoding format of the random string
|
|
43
|
+
*/
|
|
44
|
+
encoding: "hex" | "base64";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Generates a cryptographically secure random string that can be used
|
|
49
|
+
* for API keys, tokens, passwords, or other security-sensitive values.
|
|
50
|
+
* The generated value is automatically wrapped as a secret to prevent
|
|
51
|
+
* accidental exposure in logs or console output.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* // Generate a default random string (32 bytes, hex encoded)
|
|
55
|
+
* const apiKey = await RandomString("api-key");
|
|
56
|
+
* // Result: 64 character hex string (e.g., "a1b2c3d4...")
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // Generate a shorter random string for a verification code
|
|
60
|
+
* const verificationCode = await RandomString("email-verification", {
|
|
61
|
+
* length: 8,
|
|
62
|
+
* encoding: "hex"
|
|
63
|
+
* });
|
|
64
|
+
* // Result: 16 character hex string
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* // Generate a base64-encoded random string for a session token
|
|
68
|
+
* const sessionToken = await RandomString("session-token", {
|
|
69
|
+
* length: 48,
|
|
70
|
+
* encoding: "base64"
|
|
71
|
+
* });
|
|
72
|
+
* // Result: ~64 character base64 string
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* // Use with other resources that require secrets
|
|
76
|
+
* const database = await PostgresDatabase("mydb", {
|
|
77
|
+
* name: "production",
|
|
78
|
+
* password: (await RandomString("db-password")).value
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* // Generate multiple unique secrets
|
|
83
|
+
* const jwtSecret = await RandomString("jwt-secret", { length: 64 });
|
|
84
|
+
* const encryptionKey = await RandomString("encryption-key", {
|
|
85
|
+
* length: 32,
|
|
86
|
+
* encoding: "base64"
|
|
87
|
+
* });
|
|
88
|
+
*
|
|
89
|
+
* @param id - Unique identifier for this random string resource
|
|
90
|
+
* @param props - Configuration options for the random string generation
|
|
91
|
+
* @returns A RandomString resource containing the generated secret value
|
|
92
|
+
*/
|
|
93
|
+
export const RandomString = Resource(
|
|
94
|
+
"random::String",
|
|
95
|
+
async function (
|
|
96
|
+
_id: string,
|
|
97
|
+
props: RandomStringProps = {},
|
|
98
|
+
): Promise<RandomString> {
|
|
99
|
+
if (this.phase === "delete") {
|
|
100
|
+
return this.destroy();
|
|
101
|
+
}
|
|
102
|
+
const length = props.length ?? 32;
|
|
103
|
+
const encoding = props.encoding ?? "hex";
|
|
104
|
+
|
|
105
|
+
if (
|
|
106
|
+
this.phase === "update" &&
|
|
107
|
+
this.props.length === length &&
|
|
108
|
+
this.props.encoding === encoding
|
|
109
|
+
) {
|
|
110
|
+
// this is an update (input props changed)
|
|
111
|
+
// but the length and encoding did not change
|
|
112
|
+
// so, we can just return the existing output (no-op)
|
|
113
|
+
return this(this.output);
|
|
114
|
+
}
|
|
115
|
+
const crypto = await import("node:crypto");
|
|
116
|
+
return this({
|
|
117
|
+
length,
|
|
118
|
+
encoding,
|
|
119
|
+
value: alchemy.secret(
|
|
120
|
+
crypto
|
|
121
|
+
.randomBytes(props.length ?? 32)
|
|
122
|
+
.toString(props.encoding ?? "hex"),
|
|
123
|
+
),
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
);
|
package/src/runtime/bind.ts
CHANGED
|
@@ -10,8 +10,8 @@ import { isRuntime } from "./global.ts";
|
|
|
10
10
|
/**
|
|
11
11
|
* Get a Resource's Binding from the Environment.
|
|
12
12
|
*/
|
|
13
|
-
export function getBinding<T extends Resource>(resource: T):
|
|
14
|
-
return env[getBindKey(resource)] as
|
|
13
|
+
export function getBinding<T extends Resource>(resource: T): Bound<T> {
|
|
14
|
+
return env[getBindKey(resource)] as Bound<T>;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function tryGetBinding<T extends Resource>(
|
package/src/scope.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import kleur from "kleur";
|
|
1
2
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
3
|
import util from "node:util";
|
|
3
4
|
import type { Phase } from "./alchemy.ts";
|
|
@@ -144,6 +145,7 @@ export class Scope {
|
|
|
144
145
|
private finalized = false;
|
|
145
146
|
private startedAt = performance.now();
|
|
146
147
|
private deferred: (() => Promise<any>)[] = [];
|
|
148
|
+
private cleanups: (() => Promise<void>)[] = [];
|
|
147
149
|
|
|
148
150
|
public get appName(): string {
|
|
149
151
|
if (this.parent) {
|
|
@@ -466,6 +468,7 @@ export class Scope {
|
|
|
466
468
|
});
|
|
467
469
|
|
|
468
470
|
if (!this.parent && process.env.ALCHEMY_TEST_KILL_ON_FINALIZE) {
|
|
471
|
+
await this.cleanup();
|
|
469
472
|
process.exit(0);
|
|
470
473
|
}
|
|
471
474
|
}
|
|
@@ -537,6 +540,28 @@ export class Scope {
|
|
|
537
540
|
return promise;
|
|
538
541
|
}
|
|
539
542
|
|
|
543
|
+
/**
|
|
544
|
+
* Run all cleanup functions registered with `onCleanup`.
|
|
545
|
+
* This should only be called on the root scope.
|
|
546
|
+
*/
|
|
547
|
+
public async cleanup() {
|
|
548
|
+
if (this.parent || this.cleanups.length === 0) return;
|
|
549
|
+
this.logger.log(kleur.gray("Exiting..."));
|
|
550
|
+
await Promise.allSettled(this.cleanups.map((cleanup) => cleanup()));
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* Register a cleanup function that will be called when the process exits.
|
|
555
|
+
* This should only be called on the root scope.
|
|
556
|
+
*/
|
|
557
|
+
public onCleanup(fn: () => Promise<void>) {
|
|
558
|
+
if (this.parent) {
|
|
559
|
+
this.root.onCleanup(fn);
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
this.cleanups.push(fn);
|
|
563
|
+
}
|
|
564
|
+
|
|
540
565
|
/**
|
|
541
566
|
* Returns a string representation of the scope.
|
|
542
567
|
*/
|
package/src/secret.ts
CHANGED
|
@@ -123,8 +123,8 @@ export function secret<S = string>(
|
|
|
123
123
|
|
|
124
124
|
export namespace secret {
|
|
125
125
|
export interface Env {
|
|
126
|
-
[key: string]:
|
|
127
|
-
(name: string, value?: string, error?: string):
|
|
126
|
+
[key: string]: Secret;
|
|
127
|
+
(name: string, value?: string, error?: string): Secret;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
export const env = new Proxy(_env, {
|
|
@@ -132,12 +132,8 @@ export namespace secret {
|
|
|
132
132
|
apply: (_, __, args: [string, any?, string?]) => _env(...args),
|
|
133
133
|
}) as Env;
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
name
|
|
137
|
-
value?: string,
|
|
138
|
-
error?: string,
|
|
139
|
-
): Promise<Secret> {
|
|
140
|
-
const result = await alchemy.env(name, value, error);
|
|
135
|
+
function _env(name: string, value?: string, error?: string): Secret {
|
|
136
|
+
const result = alchemy.env(name, value, error);
|
|
141
137
|
if (typeof result === "string") {
|
|
142
138
|
return secret(result, name);
|
|
143
139
|
}
|
|
@@ -105,11 +105,11 @@ const provision = memoize(
|
|
|
105
105
|
const scriptName = options.scriptName ?? "alchemy-state-service";
|
|
106
106
|
const token =
|
|
107
107
|
options.stateToken ??
|
|
108
|
-
|
|
108
|
+
alchemy.secret.env(
|
|
109
109
|
"ALCHEMY_STATE_TOKEN",
|
|
110
110
|
undefined,
|
|
111
111
|
"Missing token for DOStateStore. Please set ALCHEMY_STATE_TOKEN in the environment or set the `stateToken` option in the DOStateStore constructor.",
|
|
112
|
-
)
|
|
112
|
+
);
|
|
113
113
|
|
|
114
114
|
const api = await createCloudflareApi(options);
|
|
115
115
|
const [bundle, settings, subdomain] = await Promise.all([
|
|
@@ -66,7 +66,7 @@ export class DOFSStateStore implements StateStore {
|
|
|
66
66
|
private async createClient() {
|
|
67
67
|
const token =
|
|
68
68
|
this.options.worker?.token ??
|
|
69
|
-
|
|
69
|
+
alchemy.secret.env.ALCHEMY_STATE_TOKEN.unencrypted;
|
|
70
70
|
if (this.options.worker && "url" in this.options.worker) {
|
|
71
71
|
const client = new DOFSStateStoreClient({
|
|
72
72
|
app: this.scope.appName ?? "alchemy",
|
|
@@ -34,3 +34,14 @@ export async function detectPackageManager(
|
|
|
34
34
|
|
|
35
35
|
return "npm";
|
|
36
36
|
}
|
|
37
|
+
|
|
38
|
+
export async function getPackageManagerRunner(): Promise<string> {
|
|
39
|
+
const packageManager = await detectPackageManager();
|
|
40
|
+
return {
|
|
41
|
+
bun: "bun run",
|
|
42
|
+
pnpm: "pnpm",
|
|
43
|
+
yarn: "yarn",
|
|
44
|
+
npm: "npx",
|
|
45
|
+
deno: "deno run",
|
|
46
|
+
}[packageManager];
|
|
47
|
+
}
|
|
@@ -10,7 +10,7 @@ import type { Telemetry } from "./types.ts";
|
|
|
10
10
|
|
|
11
11
|
export interface TelemetryClientOptions {
|
|
12
12
|
sessionId: string;
|
|
13
|
-
phase
|
|
13
|
+
phase?: Phase;
|
|
14
14
|
enabled: boolean;
|
|
15
15
|
quiet: boolean;
|
|
16
16
|
}
|
|
@@ -85,7 +85,28 @@ export class TelemetryClient implements ITelemetryClient {
|
|
|
85
85
|
if (events.length === 0) {
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
|
-
const { userId, ...context } = await this.context;
|
|
88
|
+
const { userId, projectId, ...context } = await this.context;
|
|
89
|
+
const safeProjectId = projectId ?? `temp_${userId}`;
|
|
90
|
+
const groupResponse = await fetch(`${POSTHOG_CLIENT_API_HOST}/i/v0/e/`, {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers: {
|
|
93
|
+
"Content-Type": "application/json",
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify({
|
|
96
|
+
api_key: POSTHOG_PROJECT_ID,
|
|
97
|
+
event: "$groupidentify",
|
|
98
|
+
distinct_id: "project-identify",
|
|
99
|
+
properties: {
|
|
100
|
+
$group_type: "project",
|
|
101
|
+
$group_key: safeProjectId,
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
if (!groupResponse.ok) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
`Failed to send group identify: ${groupResponse.status} ${groupResponse.statusText} - ${await groupResponse.text()}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
89
110
|
const response = await fetch(`${POSTHOG_CLIENT_API_HOST}/batch`, {
|
|
90
111
|
method: "POST",
|
|
91
112
|
headers: {
|
|
@@ -100,6 +121,8 @@ export class TelemetryClient implements ITelemetryClient {
|
|
|
100
121
|
distinct_id: userId,
|
|
101
122
|
...context,
|
|
102
123
|
...properties,
|
|
124
|
+
projectId: safeProjectId,
|
|
125
|
+
$groups: { project: safeProjectId },
|
|
103
126
|
},
|
|
104
127
|
timestamp: new Date(timestamp).toISOString(),
|
|
105
128
|
})),
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import envPaths from "env-paths";
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
export const CONFIG_DIR = xdg.config();
|
|
3
|
+
export const CONFIG_DIR = envPaths("alchemy", { suffix: "" }).config;
|
|
6
4
|
|
|
7
5
|
export const TELEMETRY_DISABLED =
|
|
8
6
|
!!process.env.ALCHEMY_TELEMETRY_DISABLED || !!process.env.DO_NOT_TRACK;
|
|
@@ -132,7 +132,7 @@ function environment(): Telemetry.Context["environment"] {
|
|
|
132
132
|
|
|
133
133
|
export async function context(input: {
|
|
134
134
|
sessionId: string;
|
|
135
|
-
phase
|
|
135
|
+
phase?: Phase;
|
|
136
136
|
}): Promise<Telemetry.Context> {
|
|
137
137
|
const env = environment();
|
|
138
138
|
const [uid, pid] = await Promise.all([
|
|
@@ -29,7 +29,7 @@ export namespace Telemetry {
|
|
|
29
29
|
|
|
30
30
|
alchemy: {
|
|
31
31
|
version: string;
|
|
32
|
-
phase
|
|
32
|
+
phase?: Phase;
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -72,6 +72,11 @@ export namespace Telemetry {
|
|
|
72
72
|
replaced?: boolean;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
export interface CliEvent extends BaseEvent {
|
|
76
|
+
event: "cli.start" | "cli.success" | "cli.error";
|
|
77
|
+
command: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
75
80
|
export interface StateStoreEvent extends BaseEvent {
|
|
76
81
|
event:
|
|
77
82
|
| "stateStore.init"
|
|
@@ -88,11 +93,12 @@ export namespace Telemetry {
|
|
|
88
93
|
error?: SerializedError;
|
|
89
94
|
}
|
|
90
95
|
|
|
91
|
-
export type Event = AppEvent | ResourceEvent | StateStoreEvent;
|
|
96
|
+
export type Event = AppEvent | ResourceEvent | StateStoreEvent | CliEvent;
|
|
92
97
|
export type EventInput = (
|
|
93
98
|
| Omit<AppEvent, "timestamp" | "error">
|
|
94
99
|
| Omit<ResourceEvent, "timestamp" | "error">
|
|
95
100
|
| Omit<StateStoreEvent, "timestamp" | "error">
|
|
101
|
+
| Omit<CliEvent, "timestamp" | "error">
|
|
96
102
|
) & {
|
|
97
103
|
error?: ErrorInput;
|
|
98
104
|
};
|
package/src/vercel/api.ts
CHANGED
|
@@ -26,10 +26,8 @@ export interface VercelApiOptions {
|
|
|
26
26
|
export async function createVercelApi(
|
|
27
27
|
options: VercelApiOptions,
|
|
28
28
|
): Promise<VercelApi> {
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
-
baseUrl,
|
|
32
|
-
} = options;
|
|
29
|
+
const { accessToken = alchemy.secret.env.VERCEL_ACCESS_TOKEN, baseUrl } =
|
|
30
|
+
options;
|
|
33
31
|
|
|
34
32
|
return new VercelApi({
|
|
35
33
|
baseUrl,
|
|
@@ -5,9 +5,7 @@ import { Astro } from "alchemy/cloudflare";
|
|
|
5
5
|
|
|
6
6
|
const app = await alchemy("my-alchemy-app");
|
|
7
7
|
|
|
8
|
-
export const worker = await Astro("website"
|
|
9
|
-
command: "bun run build",
|
|
10
|
-
});
|
|
8
|
+
export const worker = await Astro("website");
|
|
11
9
|
|
|
12
10
|
console.log({
|
|
13
11
|
url: worker.url,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import alchemy from 'alchemy/cloudflare/astro';
|
|
1
2
|
import { defineConfig } from 'astro/config';
|
|
2
|
-
import cloudflare from '@astrojs/cloudflare';
|
|
3
3
|
|
|
4
4
|
// https://astro.build/config
|
|
5
5
|
export default defineConfig({
|
|
6
6
|
output: 'server',
|
|
7
|
-
adapter:
|
|
7
|
+
adapter: alchemy(),
|
|
8
8
|
});
|
|
@@ -5,9 +5,7 @@ import { Nuxt } from "alchemy/cloudflare";
|
|
|
5
5
|
|
|
6
6
|
const app = await alchemy("my-alchemy-app");
|
|
7
7
|
|
|
8
|
-
export const worker = await Nuxt("website"
|
|
9
|
-
command: "bun run build",
|
|
10
|
-
});
|
|
8
|
+
export const worker = await Nuxt("website");
|
|
11
9
|
|
|
12
10
|
console.log({
|
|
13
11
|
url: worker.url,
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
+
import alchemy from "alchemy/cloudflare/nuxt";
|
|
2
|
+
import { defineNuxtConfig } from "nuxt/config";
|
|
3
|
+
|
|
1
4
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
|
2
5
|
export default defineNuxtConfig({
|
|
3
|
-
compatibilityDate: '2025-05-15',
|
|
4
6
|
devtools: { enabled: true },
|
|
5
7
|
nitro: {
|
|
6
8
|
preset: "cloudflare_module",
|
|
7
|
-
cloudflare:
|
|
8
|
-
deployConfig: true,
|
|
9
|
-
nodeCompat: true
|
|
10
|
-
}
|
|
9
|
+
cloudflare: alchemy(),
|
|
11
10
|
},
|
|
12
11
|
modules: ["nitro-cloudflare-dev"],
|
|
13
12
|
});
|
|
@@ -5,10 +5,7 @@ import { ReactRouter } from "alchemy/cloudflare";
|
|
|
5
5
|
|
|
6
6
|
const app = await alchemy("my-alchemy-app");
|
|
7
7
|
|
|
8
|
-
export const worker = await ReactRouter("website"
|
|
9
|
-
main: "workers/app.ts",
|
|
10
|
-
command: "bun run build",
|
|
11
|
-
});
|
|
8
|
+
export const worker = await ReactRouter("website");
|
|
12
9
|
|
|
13
10
|
console.log({
|
|
14
11
|
url: worker.url,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { reactRouter } from "@react-router/dev/vite";
|
|
2
|
-
import { cloudflare } from "@cloudflare/vite-plugin";
|
|
3
2
|
import tailwindcss from "@tailwindcss/vite";
|
|
3
|
+
import alchemy from "alchemy/cloudflare/react-router";
|
|
4
4
|
import { defineConfig } from "vite";
|
|
5
5
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
6
6
|
|
|
7
7
|
export default defineConfig({
|
|
8
8
|
plugins: [
|
|
9
|
-
|
|
9
|
+
alchemy(),
|
|
10
10
|
tailwindcss(),
|
|
11
11
|
reactRouter(),
|
|
12
12
|
tsconfigPaths(),
|
|
@@ -11,7 +11,6 @@ const database = await D1Database("database", {
|
|
|
11
11
|
|
|
12
12
|
export const worker = await Redwood("website", {
|
|
13
13
|
name: "my-alchemy-app-website",
|
|
14
|
-
command: "bun run build",
|
|
15
14
|
bindings: {
|
|
16
15
|
AUTH_SECRET_KEY: alchemy.secret(process.env.AUTH_SECRET_KEY),
|
|
17
16
|
DB: database,
|
|
@@ -16,7 +16,6 @@
|
|
|
16
16
|
"deploy": "alchemy deploy",
|
|
17
17
|
"destroy": "alchemy destroy",
|
|
18
18
|
"dev": "alchemy dev",
|
|
19
|
-
"dev:init": "rw-scripts dev-init",
|
|
20
19
|
"generate": "rw-scripts ensure-env && prisma generate && wrangler types",
|
|
21
20
|
"migrate:dev": "prisma generate && wrangler d1 migrations apply DB --local",
|
|
22
21
|
"migrate:new": "rw-scripts migrate-new",
|
|
@@ -24,7 +23,6 @@
|
|
|
24
23
|
"prepare": "vibe-rules install cursor",
|
|
25
24
|
"preview": "vite preview",
|
|
26
25
|
"release": "rw-scripts ensure-deploy-env && npm run clean && prisma generate && RWSDK_DEPLOY=1 npm run build && wrangler deploy",
|
|
27
|
-
"seed": "npm run worker:run ./src/scripts/seed.ts",
|
|
28
26
|
"types": "tsc",
|
|
29
27
|
"worker:run": "rw-scripts worker-run"
|
|
30
28
|
},
|
|
@@ -5,9 +5,7 @@ import { SvelteKit } from "alchemy/cloudflare";
|
|
|
5
5
|
|
|
6
6
|
const app = await alchemy("my-alchemy-app");
|
|
7
7
|
|
|
8
|
-
export const worker = await SvelteKit("website"
|
|
9
|
-
command: "bun run build",
|
|
10
|
-
});
|
|
8
|
+
export const worker = await SvelteKit("website");
|
|
11
9
|
|
|
12
10
|
console.log({
|
|
13
11
|
url: worker.url,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import adapter from '@sveltejs/adapter-cloudflare';
|
|
2
1
|
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
|
|
2
|
+
import alchemy from 'alchemy/cloudflare/sveltekit';
|
|
3
3
|
|
|
4
4
|
/** @type {import('@sveltejs/kit').Config} */
|
|
5
5
|
const config = {
|
|
6
6
|
preprocess: vitePreprocess(),
|
|
7
7
|
kit: {
|
|
8
|
-
adapter:
|
|
8
|
+
adapter: alchemy()
|
|
9
9
|
}
|
|
10
10
|
};
|
|
11
11
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import tailwindcss from "@tailwindcss/vite";
|
|
2
2
|
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
|
|
3
3
|
import viteReact from "@vitejs/plugin-react";
|
|
4
|
-
import
|
|
4
|
+
import alchemy from "alchemy/cloudflare/tanstack-start";
|
|
5
5
|
import { defineConfig, PluginOption } from "vite";
|
|
6
6
|
import tsConfigPaths from "vite-tsconfig-paths";
|
|
7
7
|
|
|
@@ -17,7 +17,7 @@ export default defineConfig({
|
|
|
17
17
|
},
|
|
18
18
|
plugins: [
|
|
19
19
|
tailwindcss() as PluginOption,
|
|
20
|
-
|
|
20
|
+
alchemy(),
|
|
21
21
|
tsConfigPaths({
|
|
22
22
|
projects: ["./tsconfig.json"],
|
|
23
23
|
}),
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import { cloudflare } from "@cloudflare/vite-plugin";
|
|
1
|
+
import react from '@vitejs/plugin-react';
|
|
2
|
+
import alchemy from "alchemy/cloudflare/vite";
|
|
3
|
+
import { defineConfig } from 'vite';
|
|
5
4
|
|
|
6
5
|
// https://vite.dev/config/
|
|
7
6
|
export default defineConfig({
|
|
8
|
-
plugins: [react(),
|
|
7
|
+
plugins: [react(), alchemy()],
|
|
9
8
|
});
|
|
@@ -736,7 +736,7 @@ var WithSubquery = class extends Subquery {
|
|
|
736
736
|
};
|
|
737
737
|
|
|
738
738
|
// ../node_modules/drizzle-orm/version.js
|
|
739
|
-
var version = "0.44.
|
|
739
|
+
var version = "0.44.4";
|
|
740
740
|
|
|
741
741
|
// ../node_modules/drizzle-orm/tracing.js
|
|
742
742
|
var otel;
|
|
@@ -2739,6 +2739,17 @@ var DrizzleError = class extends Error {
|
|
|
2739
2739
|
this.cause = cause;
|
|
2740
2740
|
}
|
|
2741
2741
|
};
|
|
2742
|
+
var DrizzleQueryError = class _DrizzleQueryError extends Error {
|
|
2743
|
+
constructor(query, params, cause) {
|
|
2744
|
+
super(`Failed query: ${query}
|
|
2745
|
+
params: ${params}`);
|
|
2746
|
+
this.query = query;
|
|
2747
|
+
this.params = params;
|
|
2748
|
+
this.cause = cause;
|
|
2749
|
+
Error.captureStackTrace(this, _DrizzleQueryError);
|
|
2750
|
+
if (cause) this.cause = cause;
|
|
2751
|
+
}
|
|
2752
|
+
};
|
|
2742
2753
|
var TransactionRollbackError = class extends DrizzleError {
|
|
2743
2754
|
static [entityKind] = "TransactionRollbackError";
|
|
2744
2755
|
constructor() {
|
|
@@ -4985,19 +4996,6 @@ async function hashQuery(sql2, params) {
|
|
|
4985
4996
|
return hashHex;
|
|
4986
4997
|
}
|
|
4987
4998
|
|
|
4988
|
-
// ../node_modules/drizzle-orm/errors/index.js
|
|
4989
|
-
var DrizzleQueryError = class _DrizzleQueryError extends Error {
|
|
4990
|
-
constructor(query, params, cause) {
|
|
4991
|
-
super(`Failed query: ${query}
|
|
4992
|
-
params: ${params}`);
|
|
4993
|
-
this.query = query;
|
|
4994
|
-
this.params = params;
|
|
4995
|
-
this.cause = cause;
|
|
4996
|
-
Error.captureStackTrace(this, _DrizzleQueryError);
|
|
4997
|
-
if (cause) this.cause = cause;
|
|
4998
|
-
}
|
|
4999
|
-
};
|
|
5000
|
-
|
|
5001
4999
|
// ../node_modules/drizzle-orm/sqlite-core/session.js
|
|
5002
5000
|
var ExecuteResultSync = class extends QueryPromise {
|
|
5003
5001
|
constructor(resultCb) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["../../src/cloudflare/astro.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,QAAQ,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;CAAG;AAE1E;;;;GAIG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS;IAAE,MAAM,EAAE,GAAG,CAAA;CAAE,GAC7D,KAAK,GACL,MAAM,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,KAAK,CAAC,CAAC,SAAS,QAAQ,EAC5C,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,UAAU,CAAC,CAAC,CAAM,GACxB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CA0BnB"}
|