@vibesdotdev/infra-cloudflare 0.0.1

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 (128) hide show
  1. package/README.md +107 -0
  2. package/SPEC.md +166 -0
  3. package/dist/cloudflare.plugin.d.ts +73 -0
  4. package/dist/cloudflare.plugin.d.ts.map +1 -0
  5. package/dist/cloudflare.plugin.js +334 -0
  6. package/dist/cloudflare.plugin.js.map +1 -0
  7. package/dist/implementations/alerts.descriptor.d.ts +13 -0
  8. package/dist/implementations/alerts.descriptor.d.ts.map +1 -0
  9. package/dist/implementations/alerts.descriptor.js +30 -0
  10. package/dist/implementations/alerts.descriptor.js.map +1 -0
  11. package/dist/implementations/alerts.impl.d.ts +35 -0
  12. package/dist/implementations/alerts.impl.d.ts.map +1 -0
  13. package/dist/implementations/alerts.impl.js +283 -0
  14. package/dist/implementations/alerts.impl.js.map +1 -0
  15. package/dist/implementations/kv.impl.d.ts +29 -0
  16. package/dist/implementations/kv.impl.d.ts.map +1 -0
  17. package/dist/implementations/kv.impl.js +36 -0
  18. package/dist/implementations/kv.impl.js.map +1 -0
  19. package/dist/implementations/logs.descriptor.d.ts +15 -0
  20. package/dist/implementations/logs.descriptor.d.ts.map +1 -0
  21. package/dist/implementations/logs.descriptor.js +26 -0
  22. package/dist/implementations/logs.descriptor.js.map +1 -0
  23. package/dist/implementations/logs.impl.d.ts +108 -0
  24. package/dist/implementations/logs.impl.d.ts.map +1 -0
  25. package/dist/implementations/logs.impl.js +154 -0
  26. package/dist/implementations/logs.impl.js.map +1 -0
  27. package/dist/implementations/observability.descriptor.d.ts +9 -0
  28. package/dist/implementations/observability.descriptor.d.ts.map +1 -0
  29. package/dist/implementations/observability.descriptor.js +22 -0
  30. package/dist/implementations/observability.descriptor.js.map +1 -0
  31. package/dist/implementations/observability.impl.d.ts +35 -0
  32. package/dist/implementations/observability.impl.d.ts.map +1 -0
  33. package/dist/implementations/observability.impl.js +229 -0
  34. package/dist/implementations/observability.impl.js.map +1 -0
  35. package/dist/implementations/pages.impl.d.ts +98 -0
  36. package/dist/implementations/pages.impl.d.ts.map +1 -0
  37. package/dist/implementations/pages.impl.js +132 -0
  38. package/dist/implementations/pages.impl.js.map +1 -0
  39. package/dist/implementations/queues.impl.d.ts +29 -0
  40. package/dist/implementations/queues.impl.d.ts.map +1 -0
  41. package/dist/implementations/queues.impl.js +34 -0
  42. package/dist/implementations/queues.impl.js.map +1 -0
  43. package/dist/implementations/r2.impl.d.ts +31 -0
  44. package/dist/implementations/r2.impl.d.ts.map +1 -0
  45. package/dist/implementations/r2.impl.js +41 -0
  46. package/dist/implementations/r2.impl.js.map +1 -0
  47. package/dist/implementations/rum.descriptor.d.ts +13 -0
  48. package/dist/implementations/rum.descriptor.d.ts.map +1 -0
  49. package/dist/implementations/rum.descriptor.js +32 -0
  50. package/dist/implementations/rum.descriptor.js.map +1 -0
  51. package/dist/implementations/rum.impl.d.ts +34 -0
  52. package/dist/implementations/rum.impl.d.ts.map +1 -0
  53. package/dist/implementations/rum.impl.js +153 -0
  54. package/dist/implementations/rum.impl.js.map +1 -0
  55. package/dist/implementations/web-app.impl.d.ts +294 -0
  56. package/dist/implementations/web-app.impl.d.ts.map +1 -0
  57. package/dist/implementations/web-app.impl.js +208 -0
  58. package/dist/implementations/web-app.impl.js.map +1 -0
  59. package/dist/implementations/workers.impl.d.ts +157 -0
  60. package/dist/implementations/workers.impl.d.ts.map +1 -0
  61. package/dist/implementations/workers.impl.js +247 -0
  62. package/dist/implementations/workers.impl.js.map +1 -0
  63. package/dist/index.d.ts +17 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +12 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/pages.d.ts +9 -0
  68. package/dist/pages.d.ts.map +1 -0
  69. package/dist/pages.js +9 -0
  70. package/dist/pages.js.map +1 -0
  71. package/dist/regen.d.ts +58 -0
  72. package/dist/regen.d.ts.map +1 -0
  73. package/dist/regen.js +69 -0
  74. package/dist/regen.js.map +1 -0
  75. package/dist/secrets/cloudflare-api.descriptor.d.ts +18 -0
  76. package/dist/secrets/cloudflare-api.descriptor.d.ts.map +1 -0
  77. package/dist/secrets/cloudflare-api.descriptor.js +32 -0
  78. package/dist/secrets/cloudflare-api.descriptor.js.map +1 -0
  79. package/dist/secrets/cloudflare-api.impl.d.ts +30 -0
  80. package/dist/secrets/cloudflare-api.impl.d.ts.map +1 -0
  81. package/dist/secrets/cloudflare-api.impl.js +111 -0
  82. package/dist/secrets/cloudflare-api.impl.js.map +1 -0
  83. package/dist/secrets/cloudflare-secrets-store.descriptor.d.ts +10 -0
  84. package/dist/secrets/cloudflare-secrets-store.descriptor.d.ts.map +1 -0
  85. package/dist/secrets/cloudflare-secrets-store.descriptor.js +24 -0
  86. package/dist/secrets/cloudflare-secrets-store.descriptor.js.map +1 -0
  87. package/dist/secrets/cloudflare-secrets-store.impl.d.ts +27 -0
  88. package/dist/secrets/cloudflare-secrets-store.impl.d.ts.map +1 -0
  89. package/dist/secrets/cloudflare-secrets-store.impl.js +72 -0
  90. package/dist/secrets/cloudflare-secrets-store.impl.js.map +1 -0
  91. package/dist/secrets/index.d.ts +6 -0
  92. package/dist/secrets/index.d.ts.map +1 -0
  93. package/dist/secrets/index.js +6 -0
  94. package/dist/secrets/index.js.map +1 -0
  95. package/dist/secrets/resolve-cf-credentials.d.ts +18 -0
  96. package/dist/secrets/resolve-cf-credentials.d.ts.map +1 -0
  97. package/dist/secrets/resolve-cf-credentials.js +57 -0
  98. package/dist/secrets/resolve-cf-credentials.js.map +1 -0
  99. package/dist/web-app.d.ts +11 -0
  100. package/dist/web-app.d.ts.map +1 -0
  101. package/dist/web-app.js +11 -0
  102. package/dist/web-app.js.map +1 -0
  103. package/package.json +153 -0
  104. package/src/cloudflare.plugin.ts +477 -0
  105. package/src/implementations/alerts.descriptor.ts +33 -0
  106. package/src/implementations/alerts.impl.ts +332 -0
  107. package/src/implementations/kv.impl.ts +51 -0
  108. package/src/implementations/logs.descriptor.ts +29 -0
  109. package/src/implementations/logs.impl.ts +201 -0
  110. package/src/implementations/observability.descriptor.ts +25 -0
  111. package/src/implementations/observability.impl.ts +307 -0
  112. package/src/implementations/pages.impl.ts +189 -0
  113. package/src/implementations/queues.impl.ts +48 -0
  114. package/src/implementations/r2.impl.ts +58 -0
  115. package/src/implementations/rum.descriptor.ts +35 -0
  116. package/src/implementations/rum.impl.ts +192 -0
  117. package/src/implementations/web-app.impl.ts +494 -0
  118. package/src/implementations/workers.impl.ts +336 -0
  119. package/src/index.ts +60 -0
  120. package/src/pages.ts +18 -0
  121. package/src/regen.ts +87 -0
  122. package/src/secrets/cloudflare-api.descriptor.ts +35 -0
  123. package/src/secrets/cloudflare-api.impl.ts +131 -0
  124. package/src/secrets/cloudflare-secrets-store.descriptor.ts +27 -0
  125. package/src/secrets/cloudflare-secrets-store.impl.ts +87 -0
  126. package/src/secrets/index.ts +13 -0
  127. package/src/secrets/resolve-cf-credentials.ts +63 -0
  128. package/src/web-app.ts +32 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Cloudflare Pages Implementation
3
+ *
4
+ * Config generator and deployment helpers for Cloudflare Pages projects.
5
+ * Wraps an infra-core AppDeployment into a Cloudflare Pages-compatible
6
+ * wrangler.jsonc fragment and provides rendering utilities.
7
+ *
8
+ * Retained for ecosystem/SDK consumers that target Cloudflare Pages.
9
+ * Vibes monorepo apps deploy as Workers + Static Assets — see web-app.impl.ts.
10
+ */
11
+ import * as z from 'zod/v4';
12
+ export const CloudflarePagesDescriptorSchema = z.object({
13
+ kind: z.literal('infra/web-app'),
14
+ id: z.string().min(1),
15
+ name: z.string().min(1),
16
+ adapter: z.enum(['cloudflare-pages', 'cloudflare-workers']),
17
+ /** Cloudflare Pages project name (e.g., "vibes-platform") */
18
+ cfProjectName: z.string().min(1),
19
+ /** Build output directory */
20
+ outputDir: z.string().min(1),
21
+ /** Compatibility date for wrangler */
22
+ compatibilityDate: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional(),
23
+ /** Compatibility flags for wrangler */
24
+ compatibilityFlags: z.array(z.string()).default(['nodejs_compat']),
25
+ /** Environment variables to include */
26
+ env: z.record(z.string(), z.string()).default({}),
27
+ /**
28
+ * Account-level Cloudflare Secrets Store ID. When set, secret env vars
29
+ * emit as `secrets_store_secrets[]` bindings against this store. UUID,
30
+ * not a secret value — safe to commit.
31
+ */
32
+ secretsStoreId: z.string().min(1).optional()
33
+ });
34
+ /**
35
+ * Create a Cloudflare Pages deployment wrapper around an AppDeployment.
36
+ *
37
+ * @param options - Deployment options including projectName and the base deployment
38
+ * @returns A CloudflarePagesDeployment with wrangler config generation
39
+ */
40
+ export function createCloudflarePagesDeployment(options) {
41
+ const { projectName, deployment, compatibilityDate, secretsStoreId } = options;
42
+ const compatDate = compatibilityDate ?? new Date().toISOString().slice(0, 10);
43
+ return {
44
+ projectName,
45
+ deployment,
46
+ compatibilityDate: compatDate,
47
+ generateWranglerConfig() {
48
+ const config = {
49
+ $schema: 'node_modules/wrangler/config-schema.json',
50
+ name: projectName,
51
+ compatibility_date: compatDate,
52
+ compatibility_flags: ['nodejs_compat'],
53
+ pages_build_output_dir: deployment.build.outputDir
54
+ };
55
+ // Add non-secret env vars with explicit values as vars.
56
+ const plainEnvVars = {};
57
+ for (const envVar of deployment.env) {
58
+ if (!envVar.secret && envVar.value !== undefined) {
59
+ plainEnvVars[envVar.name] = envVar.value;
60
+ }
61
+ }
62
+ if (Object.keys(plainEnvVars).length > 0) {
63
+ config.vars = plainEnvVars;
64
+ }
65
+ const secretEnvVars = deployment.env
66
+ .filter((envVar) => envVar.secret)
67
+ .sort((a, b) => a.name.localeCompare(b.name));
68
+ if (secretEnvVars.length > 0) {
69
+ if (secretsStoreId) {
70
+ config.secrets_store_secrets = secretEnvVars.map((envVar) => ({
71
+ binding: envVar.name,
72
+ store_id: secretsStoreId,
73
+ secret_name: envVar.storeKey ?? envVar.name
74
+ }));
75
+ }
76
+ else {
77
+ config.secrets = {
78
+ required: secretEnvVars
79
+ .filter((envVar) => envVar.required !== false)
80
+ .map((envVar) => envVar.name)
81
+ };
82
+ }
83
+ }
84
+ return config;
85
+ }
86
+ };
87
+ }
88
+ /**
89
+ * Render a wrangler.jsonc string from a wrangler config object.
90
+ *
91
+ * Canonical output: tab-indented JSON with a leading JSONC header and a
92
+ * trailing newline. The same renderer is used for Pages and Workers
93
+ * (`infra-cloudflare/web-app`) — pass `headerLines` to customize the
94
+ * leading comment block.
95
+ *
96
+ * @param config - The wrangler config object to render
97
+ * @param options - Optional header override
98
+ * @returns JSONC-formatted string (JSON with comments)
99
+ */
100
+ export function renderWranglerJson(config, options) {
101
+ const headerLines = options?.headerLines ?? [
102
+ 'Generated by @vibesdotdev/infra-cloudflare',
103
+ 'https://developers.cloudflare.com/workers/wrangler/configuration/'
104
+ ];
105
+ const header = headerLines.map((line) => `// ${line}`).join('\n');
106
+ const jsonContent = JSON.stringify(config, null, '\t');
107
+ return `${header}\n${jsonContent}\n`;
108
+ }
109
+ /**
110
+ * Generate a Pages deployment descriptor from an existing AppDeployment.
111
+ * This creates a descriptor that can be used for runtime discovery.
112
+ *
113
+ * @param deployment - The base AppDeployment
114
+ * @param cfProjectName - Explicit Cloudflare project name (required, no hardcoded conventions)
115
+ * @returns A validated Pages descriptor
116
+ */
117
+ export function generateCloudflarePagesDescriptor(deployment, cfProjectName) {
118
+ return CloudflarePagesDescriptorSchema.parse({
119
+ kind: 'infra/web-app',
120
+ id: deployment.appId,
121
+ name: deployment.appName,
122
+ adapter: 'cloudflare-workers', // Our apps use Workers Static Assets via adapter
123
+ cfProjectName,
124
+ outputDir: deployment.build.outputDir,
125
+ env: deployment.env.reduce((acc, e) => {
126
+ if (e.value)
127
+ acc[e.name] = e.value;
128
+ return acc;
129
+ }, {})
130
+ });
131
+ }
132
+ //# sourceMappingURL=pages.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.impl.js","sourceRoot":"","sources":["../../src/implementations/pages.impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Cloudflare Queues Implementation
3
+ *
4
+ * Config generator for `infra/queue` kind when engine is `cloudflare-queues`.
5
+ * Produces queue binding config to be merged into the producer app's wrangler config.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export declare const CloudflareQueueDescriptorSchema: z.ZodObject<{
9
+ kind: z.ZodLiteral<"infra/queue">;
10
+ id: z.ZodString;
11
+ name: z.ZodString;
12
+ engine: z.ZodLiteral<"cloudflare-queues">;
13
+ queueName: z.ZodString;
14
+ binding: z.ZodString;
15
+ }, z.core.$strip>;
16
+ export type CloudflareQueueDescriptor = z.infer<typeof CloudflareQueueDescriptorSchema>;
17
+ export interface WranglerQueueProducerConfig {
18
+ queues: {
19
+ producers: Array<{
20
+ queue: string;
21
+ binding: string;
22
+ }>;
23
+ };
24
+ }
25
+ /**
26
+ * Generate queue producer binding config to merge into a wrangler config.
27
+ */
28
+ export declare function generateCloudflareQueueConfig(descriptor: CloudflareQueueDescriptor): WranglerQueueProducerConfig;
29
+ //# sourceMappingURL=queues.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queues.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/queues.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,eAAO,MAAM,+BAA+B;;;;;;;iBAS1C,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,MAAM,WAAW,2BAA2B;IAC3C,MAAM,EAAE;QACP,SAAS,EAAE,KAAK,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;SAChB,CAAC,CAAC;KACH,CAAC;CACF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,yBAAyB,GAAG,2BAA2B,CAahH"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Cloudflare Queues Implementation
3
+ *
4
+ * Config generator for `infra/queue` kind when engine is `cloudflare-queues`.
5
+ * Produces queue binding config to be merged into the producer app's wrangler config.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export const CloudflareQueueDescriptorSchema = z.object({
9
+ kind: z.literal('infra/queue'),
10
+ id: z.string().min(1),
11
+ name: z.string().min(1),
12
+ engine: z.literal('cloudflare-queues'),
13
+ /** Queue name in Cloudflare (e.g. "billing-jobs") */
14
+ queueName: z.string().min(1),
15
+ /** Binding name for the producer (e.g. "BILLING_QUEUE") */
16
+ binding: z.string().regex(/^[_A-Z0-9]+$/)
17
+ });
18
+ /**
19
+ * Generate queue producer binding config to merge into a wrangler config.
20
+ */
21
+ export function generateCloudflareQueueConfig(descriptor) {
22
+ const parsed = CloudflareQueueDescriptorSchema.parse(descriptor);
23
+ return {
24
+ queues: {
25
+ producers: [
26
+ {
27
+ queue: parsed.queueName,
28
+ binding: parsed.binding
29
+ }
30
+ ]
31
+ }
32
+ };
33
+ }
34
+ //# sourceMappingURL=queues.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queues.impl.js","sourceRoot":"","sources":["../../src/implementations/queues.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACtC,qDAAqD;IACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,2DAA2D;IAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;CACzC,CAAC,CAAC;AAaH;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,UAAqC;IAClF,MAAM,MAAM,GAAG,+BAA+B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEjE,OAAO;QACN,MAAM,EAAE;YACP,SAAS,EAAE;gBACV;oBACC,KAAK,EAAE,MAAM,CAAC,SAAS;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;iBACvB;aACD;SACD;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Cloudflare R2 Implementation
3
+ *
4
+ * Config generator for `infra/object-storage` kind when adapter is `cloudflare-r2`.
5
+ * Produces R2 bucket binding config to merge into a wrangler config.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export declare const CloudflareR2DescriptorSchema: z.ZodObject<{
9
+ kind: z.ZodLiteral<"infra/object-storage">;
10
+ id: z.ZodString;
11
+ name: z.ZodString;
12
+ adapter: z.ZodLiteral<"cloudflare-r2">;
13
+ binding: z.ZodString;
14
+ bucketName: z.ZodString;
15
+ previewBucketName: z.ZodOptional<z.ZodString>;
16
+ jurisdiction: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ export type CloudflareR2Descriptor = z.infer<typeof CloudflareR2DescriptorSchema>;
19
+ export interface WranglerR2Config {
20
+ r2_buckets: Array<{
21
+ binding: string;
22
+ bucket_name: string;
23
+ preview_bucket_name?: string;
24
+ jurisdiction?: string;
25
+ }>;
26
+ }
27
+ /**
28
+ * Generate R2 bucket binding config to merge into a wrangler config.
29
+ */
30
+ export declare function generateCloudflareR2Config(descriptor: CloudflareR2Descriptor): WranglerR2Config;
31
+ //# sourceMappingURL=r2.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/r2.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,eAAO,MAAM,4BAA4B;;;;;;;;;iBAavC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAChC,UAAU,EAAE,KAAK,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,sBAAsB,GAAG,gBAAgB,CAmB/F"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Cloudflare R2 Implementation
3
+ *
4
+ * Config generator for `infra/object-storage` kind when adapter is `cloudflare-r2`.
5
+ * Produces R2 bucket binding config to merge into a wrangler config.
6
+ */
7
+ import * as z from 'zod/v4';
8
+ export const CloudflareR2DescriptorSchema = z.object({
9
+ kind: z.literal('infra/object-storage'),
10
+ id: z.string().min(1),
11
+ name: z.string().min(1),
12
+ adapter: z.literal('cloudflare-r2'),
13
+ /** Binding name (e.g. "ASSETS") */
14
+ binding: z.string().regex(/^[_A-Z0-9]+$/),
15
+ /** R2 bucket name (e.g. "vibes-assets") */
16
+ bucketName: z.string().min(1),
17
+ /** Optional preview bucket for non-production environments */
18
+ previewBucketName: z.string().optional(),
19
+ /** Jurisdiction restriction (e.g. "eu") */
20
+ jurisdiction: z.string().optional()
21
+ });
22
+ /**
23
+ * Generate R2 bucket binding config to merge into a wrangler config.
24
+ */
25
+ export function generateCloudflareR2Config(descriptor) {
26
+ const parsed = CloudflareR2DescriptorSchema.parse(descriptor);
27
+ const bucket = {
28
+ binding: parsed.binding,
29
+ bucket_name: parsed.bucketName
30
+ };
31
+ if (parsed.previewBucketName) {
32
+ bucket.preview_bucket_name = parsed.previewBucketName;
33
+ }
34
+ if (parsed.jurisdiction) {
35
+ bucket.jurisdiction = parsed.jurisdiction;
36
+ }
37
+ return {
38
+ r2_buckets: [bucket]
39
+ };
40
+ }
41
+ //# sourceMappingURL=r2.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"r2.impl.js","sourceRoot":"","sources":["../../src/implementations/r2.impl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IACnC,mCAAmC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IACzC,2CAA2C;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,2CAA2C;IAC3C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAaH;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,UAAkC;IAC5E,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAE9D,MAAM,MAAM,GAA2C;QACtD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;IAEF,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC9B,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACvD,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED,OAAO;QACN,UAAU,EAAE,CAAC,MAAM,CAAC;KACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Default Cloudflare Web Analytics RUM descriptor — registered at
3
+ * plugin load so `runtime.assets('infra/rum').descriptors()` surfaces
4
+ * the production vibes.dev site without each consumer declaring one.
5
+ *
6
+ * Site token (`96bb815cb0bc4afc87a793e6f34652b2`) is the existing
7
+ * vibes.dev site created in the CF dashboard months ago. Public —
8
+ * embedded in client HTML.
9
+ */
10
+ import type { InfraRumDescriptor } from '@vibesdotdev/infra-core';
11
+ declare const descriptor: InfraRumDescriptor;
12
+ export default descriptor;
13
+ //# sourceMappingURL=rum.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rum.descriptor.d.ts","sourceRoot":"","sources":["../../src/implementations/rum.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,QAAA,MAAM,UAAU,EAAE,kBAoBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Default Cloudflare Web Analytics RUM descriptor — registered at
3
+ * plugin load so `runtime.assets('infra/rum').descriptors()` surfaces
4
+ * the production vibes.dev site without each consumer declaring one.
5
+ *
6
+ * Site token (`96bb815cb0bc4afc87a793e6f34652b2`) is the existing
7
+ * vibes.dev site created in the CF dashboard months ago. Public —
8
+ * embedded in client HTML.
9
+ */
10
+ const descriptor = {
11
+ kind: 'infra/rum',
12
+ id: 'cloudflare-web-analytics',
13
+ name: 'Cloudflare Web Analytics',
14
+ description: 'CF Web Analytics RUM for vibes.dev (beacon-based page-load + Core Web Vitals)',
15
+ adapter: 'cloudflare-web-analytics',
16
+ adapterConfig: {
17
+ apiTokenEnvVar: 'CLOUDFLARE_API_TOKEN',
18
+ accountIdEnvVar: 'CLOUDFLARE_ACCOUNT_ID'
19
+ },
20
+ environment: 'local',
21
+ siteToken: '96bb815cb0bc4afc87a793e6f34652b2',
22
+ hostnames: ['*'],
23
+ // SSR Workers (every customer-facing surface in this monorepo) need
24
+ // manual beacon injection — CF auto-injection only fires for origin
25
+ // / cache responses. The cloudflare-web-analytics SvelteKit hook
26
+ // covers the runtime side.
27
+ injection: 'sveltekit-hook',
28
+ privacy: { excludeEU: false, respectDoNotTrack: true, stripQueryParams: false },
29
+ enabled: true
30
+ };
31
+ export default descriptor;
32
+ //# sourceMappingURL=rum.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rum.descriptor.js","sourceRoot":"","sources":["../../src/implementations/rum.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,UAAU,GAAuB;IACtC,IAAI,EAAE,WAAW;IACjB,EAAE,EAAE,0BAA0B;IAC9B,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,+EAA+E;IAC5F,OAAO,EAAE,0BAA0B;IACnC,aAAa,EAAE;QACd,cAAc,EAAE,sBAAsB;QACtC,eAAe,EAAE,uBAAuB;KACxC;IACD,WAAW,EAAE,OAAO;IACpB,SAAS,EAAE,kCAAkC;IAC7C,SAAS,EAAE,CAAC,GAAG,CAAC;IAChB,oEAAoE;IACpE,oEAAoE;IACpE,iEAAiE;IACjE,2BAA2B;IAC3B,SAAS,EAAE,gBAAgB;IAC3B,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE;IAC/E,OAAO,EAAE,IAAI;CACb,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Cloudflare Web Analytics RUM Implementation
3
+ *
4
+ * Maps the provider-agnostic `infra/rum` kind onto CF Web Analytics:
5
+ *
6
+ * GET /accounts/:account/rum/site_info/list list sites
7
+ * POST /accounts/:account/rum/site_info create site
8
+ * PATCH /accounts/:account/rum/site_info/:siteTag update site
9
+ * DELETE /accounts/:account/rum/site_info/:siteTag delete
10
+ *
11
+ * Credentials route through `resolveAdapterCredential` (vibes secrets
12
+ * → `secrets/store`); no CF-specific helpers. Token candidates default
13
+ * to CLOUDFLARE_API_TOKEN (Account → RUM: Edit scope required for write).
14
+ */
15
+ import * as z from 'zod/v4';
16
+ import { type RumImplementation } from '@vibesdotdev/infra-core';
17
+ export declare const CloudflareRumDescriptorSchema: z.ZodObject<{
18
+ kind: z.ZodLiteral<"infra/rum">;
19
+ id: z.ZodString;
20
+ name: z.ZodString;
21
+ description: z.ZodOptional<z.ZodString>;
22
+ adapter: z.ZodLiteral<"cloudflare-web-analytics">;
23
+ adapterConfig: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
24
+ environment: z.ZodDefault<z.ZodString>;
25
+ siteToken: z.ZodOptional<z.ZodUnknown>;
26
+ hostnames: z.ZodDefault<z.ZodArray<z.ZodString>>;
27
+ injection: z.ZodDefault<z.ZodString>;
28
+ privacy: z.ZodOptional<z.ZodUnknown>;
29
+ enabled: z.ZodDefault<z.ZodBoolean>;
30
+ }, z.core.$strip>;
31
+ export type CloudflareRumDescriptorInput = z.input<typeof CloudflareRumDescriptorSchema>;
32
+ export type CloudflareRumDescriptor = z.infer<typeof CloudflareRumDescriptorSchema>;
33
+ export declare function createCloudflareRumImplementation(input: CloudflareRumDescriptorInput): RumImplementation;
34
+ //# sourceMappingURL=rum.impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rum.impl.d.ts","sourceRoot":"","sources":["../../src/implementations/rum.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAGN,KAAK,iBAAiB,EAEtB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;iBAaxC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACzF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAoJpF,wBAAgB,iCAAiC,CAChD,KAAK,EAAE,4BAA4B,GACjC,iBAAiB,CAEnB"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Cloudflare Web Analytics RUM Implementation
3
+ *
4
+ * Maps the provider-agnostic `infra/rum` kind onto CF Web Analytics:
5
+ *
6
+ * GET /accounts/:account/rum/site_info/list list sites
7
+ * POST /accounts/:account/rum/site_info create site
8
+ * PATCH /accounts/:account/rum/site_info/:siteTag update site
9
+ * DELETE /accounts/:account/rum/site_info/:siteTag delete
10
+ *
11
+ * Credentials route through `resolveAdapterCredential` (vibes secrets
12
+ * → `secrets/store`); no CF-specific helpers. Token candidates default
13
+ * to CLOUDFLARE_API_TOKEN (Account → RUM: Edit scope required for write).
14
+ */
15
+ import * as z from 'zod/v4';
16
+ import { resolveAdapterCredential } from '@vibesdotdev/infra-core';
17
+ export const CloudflareRumDescriptorSchema = z.object({
18
+ kind: z.literal('infra/rum'),
19
+ id: z.string().min(1),
20
+ name: z.string().min(1),
21
+ description: z.string().optional(),
22
+ adapter: z.literal('cloudflare-web-analytics'),
23
+ adapterConfig: z.record(z.string(), z.unknown()).optional(),
24
+ environment: z.string().default('local'),
25
+ siteToken: z.unknown().optional(),
26
+ hostnames: z.array(z.string()).default([]),
27
+ injection: z.string().default('sveltekit-hook'),
28
+ privacy: z.unknown().optional(),
29
+ enabled: z.boolean().default(true)
30
+ });
31
+ function fromCfSite(cf) {
32
+ const hosts = (cf.rules ?? []).map((r) => r.host);
33
+ const enabled = !(cf.rules ?? []).every((r) => r.is_paused === true);
34
+ return {
35
+ siteTag: cf.site_tag,
36
+ hostnames: hosts,
37
+ enabled,
38
+ injection: cf.auto_install ? 'provider-auto' : 'sveltekit-hook',
39
+ createdAt: cf.created
40
+ };
41
+ }
42
+ class CloudflareRumImplementation {
43
+ id = 'cloudflare-web-analytics';
44
+ descriptor;
45
+ creds = null;
46
+ constructor(descriptor) {
47
+ this.descriptor = CloudflareRumDescriptorSchema.parse(descriptor);
48
+ }
49
+ async getCreds() {
50
+ if (this.creds)
51
+ return this.creds;
52
+ const env = this.descriptor.environment || 'local';
53
+ const ac = (this.descriptor.adapterConfig ?? {});
54
+ const accountKey = typeof ac.accountIdEnvVar === 'string' ? ac.accountIdEnvVar : 'CLOUDFLARE_ACCOUNT_ID';
55
+ const primaryToken = typeof ac.apiTokenEnvVar === 'string' ? ac.apiTokenEnvVar : 'CLOUDFLARE_API_TOKEN';
56
+ const accountRes = await resolveAdapterCredential({
57
+ keyCandidates: [accountKey],
58
+ environment: env,
59
+ humanName: 'Cloudflare account id'
60
+ });
61
+ const tokenRes = await resolveAdapterCredential({
62
+ keyCandidates: [primaryToken],
63
+ environment: env,
64
+ humanName: 'Cloudflare API token (Account RUM: Edit scope for write ops)'
65
+ });
66
+ this.creds = { accountId: accountRes.value, apiToken: tokenRes.value };
67
+ return this.creds;
68
+ }
69
+ async call(path, init) {
70
+ const { apiToken } = await this.getCreds();
71
+ const res = await fetch(`https://api.cloudflare.com/client/v4${path}`, {
72
+ ...init,
73
+ headers: {
74
+ Authorization: `Bearer ${apiToken}`,
75
+ 'Content-Type': 'application/json',
76
+ ...(init?.headers ?? {})
77
+ }
78
+ });
79
+ const text = await res.text();
80
+ let body;
81
+ try {
82
+ body = JSON.parse(text);
83
+ }
84
+ catch {
85
+ throw new Error(`cloudflare-web-analytics: non-JSON response from ${path}: ${text.slice(0, 200)}`);
86
+ }
87
+ if (!res.ok || body.success === false) {
88
+ const errSummary = body.errors?.map((e) => `${e.code}: ${e.message}`).join('; ') ?? text.slice(0, 200);
89
+ throw new Error(`cloudflare-web-analytics: ${path} → ${res.status} ${errSummary}`);
90
+ }
91
+ return body;
92
+ }
93
+ async listSites() {
94
+ const { accountId } = await this.getCreds();
95
+ const body = await this.call(`/accounts/${accountId}/rum/site_info/list?per_page=50`);
96
+ return (body.result ?? []).map(fromCfSite);
97
+ }
98
+ async getSite(siteTag) {
99
+ const { accountId } = await this.getCreds();
100
+ try {
101
+ const body = await this.call(`/accounts/${accountId}/rum/site_info/${siteTag}`);
102
+ return fromCfSite(body.result);
103
+ }
104
+ catch (err) {
105
+ const msg = err instanceof Error ? err.message : String(err);
106
+ if (msg.includes('404') || msg.toLowerCase().includes('not found'))
107
+ return null;
108
+ throw err;
109
+ }
110
+ }
111
+ async ensureSite(descriptor) {
112
+ const { accountId } = await this.getCreds();
113
+ // If the descriptor already names an explicit siteToken (string),
114
+ // treat that as the existing siteTag and just return it. CF Web
115
+ // Analytics rotates tags only on explicit re-creation.
116
+ const declaredToken = typeof descriptor.siteToken === 'string' ? descriptor.siteToken : undefined;
117
+ if (declaredToken) {
118
+ const live = await this.getSite(declaredToken);
119
+ if (live)
120
+ return { siteTag: live.siteTag, created: false };
121
+ }
122
+ // Otherwise look for an existing site matching one of the declared hostnames.
123
+ const all = await this.listSites();
124
+ const match = all.find((s) => descriptor.hostnames.some((h) => s.hostnames.includes(h)));
125
+ if (match)
126
+ return { siteTag: match.siteTag, created: false };
127
+ // Create a new site.
128
+ const payload = {
129
+ host: descriptor.hostnames[0] ?? '*',
130
+ auto_install: descriptor.injection === 'provider-auto'
131
+ };
132
+ const body = await this.call(`/accounts/${accountId}/rum/site_info`, {
133
+ method: 'POST',
134
+ body: JSON.stringify(payload)
135
+ });
136
+ return { siteTag: body.result.site_tag, created: true };
137
+ }
138
+ async setEnabled(siteTag, enabled) {
139
+ const { accountId } = await this.getCreds();
140
+ // CF doesn't expose a single "enabled" toggle — it pauses rules
141
+ // instead. We touch the first rule per the dashboard pattern.
142
+ const current = await this.call(`/accounts/${accountId}/rum/site_info/${siteTag}`);
143
+ const rules = (current.result.rules ?? []).map((r) => ({ ...r, is_paused: !enabled }));
144
+ await this.call(`/accounts/${accountId}/rum/site_info/${siteTag}`, {
145
+ method: 'PATCH',
146
+ body: JSON.stringify({ rules })
147
+ });
148
+ }
149
+ }
150
+ export function createCloudflareRumImplementation(input) {
151
+ return new CloudflareRumImplementation(CloudflareRumDescriptorSchema.parse(input));
152
+ }
153
+ //# sourceMappingURL=rum.impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rum.impl.js","sourceRoot":"","sources":["../../src/implementations/rum.impl.ts"],"names":[],"mappings":"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"}