@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
package/package.json ADDED
@@ -0,0 +1,153 @@
1
+ {
2
+ "name": "@vibesdotdev/infra-cloudflare",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "bun": "./src/index.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./pages": {
15
+ "types": "./dist/pages.d.ts",
16
+ "bun": "./src/pages.ts",
17
+ "import": "./dist/pages.js",
18
+ "default": "./dist/pages.js"
19
+ },
20
+ "./web-app": {
21
+ "types": "./dist/web-app.d.ts",
22
+ "bun": "./src/web-app.ts",
23
+ "import": "./dist/web-app.js",
24
+ "default": "./dist/web-app.js"
25
+ },
26
+ "./implementations/workers": {
27
+ "types": "./dist/implementations/workers.impl.d.ts",
28
+ "bun": "./src/implementations/workers.impl.ts",
29
+ "import": "./dist/implementations/workers.impl.js",
30
+ "default": "./dist/implementations/workers.impl.js"
31
+ },
32
+ "./implementations/queues": {
33
+ "types": "./dist/implementations/queues.impl.d.ts",
34
+ "bun": "./src/implementations/queues.impl.ts",
35
+ "import": "./dist/implementations/queues.impl.js",
36
+ "default": "./dist/implementations/queues.impl.js"
37
+ },
38
+ "./implementations/r2": {
39
+ "types": "./dist/implementations/r2.impl.d.ts",
40
+ "bun": "./src/implementations/r2.impl.ts",
41
+ "import": "./dist/implementations/r2.impl.js",
42
+ "default": "./dist/implementations/r2.impl.js"
43
+ },
44
+ "./implementations/kv": {
45
+ "types": "./dist/implementations/kv.impl.d.ts",
46
+ "bun": "./src/implementations/kv.impl.ts",
47
+ "import": "./dist/implementations/kv.impl.js",
48
+ "default": "./dist/implementations/kv.impl.js"
49
+ },
50
+ "./implementations/pages": {
51
+ "types": "./dist/implementations/pages.impl.d.ts",
52
+ "bun": "./src/implementations/pages.impl.ts",
53
+ "import": "./dist/implementations/pages.impl.js",
54
+ "default": "./dist/implementations/pages.impl.js"
55
+ },
56
+ "./implementations/web-app": {
57
+ "types": "./dist/implementations/web-app.impl.d.ts",
58
+ "bun": "./src/implementations/web-app.impl.ts",
59
+ "import": "./dist/implementations/web-app.impl.js",
60
+ "default": "./dist/implementations/web-app.impl.js"
61
+ },
62
+ "./plugin": {
63
+ "types": "./dist/cloudflare.plugin.d.ts",
64
+ "bun": "./src/cloudflare.plugin.ts",
65
+ "import": "./dist/cloudflare.plugin.js",
66
+ "default": "./dist/cloudflare.plugin.js"
67
+ },
68
+ "./secrets": {
69
+ "types": "./dist/secrets/index.d.ts",
70
+ "bun": "./src/secrets/index.ts",
71
+ "import": "./dist/secrets/index.js",
72
+ "default": "./dist/secrets/index.js"
73
+ },
74
+ "./*.js": "./dist/*.js",
75
+ "./*/*.js": "./dist/*/*.js",
76
+ "./*/*/*.js": "./dist/*/*/*.js",
77
+ "./*/*/*/*.js": "./dist/*/*/*/*.js",
78
+ "./*": {
79
+ "types": "./dist/*.d.ts",
80
+ "bun": "./src/*.ts",
81
+ "import": "./dist/*.js",
82
+ "default": "./dist/*.js"
83
+ },
84
+ "./*/*": {
85
+ "types": "./dist/*/*.d.ts",
86
+ "bun": "./src/*/*.ts",
87
+ "import": "./dist/*/*.js",
88
+ "default": "./dist/*/*.js"
89
+ },
90
+ "./*/*/*": {
91
+ "types": "./dist/*/*/*.d.ts",
92
+ "bun": "./src/*/*/*.ts",
93
+ "import": "./dist/*/*/*.js",
94
+ "default": "./dist/*/*/*.js"
95
+ },
96
+ "./*/*/*/*": {
97
+ "types": "./dist/*/*/*/*.d.ts",
98
+ "bun": "./src/*/*/*/*.ts",
99
+ "import": "./dist/*/*/*/*.js",
100
+ "default": "./dist/*/*/*/*.js"
101
+ }
102
+ },
103
+ "publishConfig": {
104
+ "registry": "https://registry.npmjs.org",
105
+ "access": "public"
106
+ },
107
+ "repository": {
108
+ "type": "git",
109
+ "url": "git+https://github.com/vibesdotdev/monorepo.git",
110
+ "directory": "packages/infra-cloudflare"
111
+ },
112
+ "dependencies": {
113
+ "@vibesdotdev/config": "0.0.1",
114
+ "@vibesdotdev/infra-core": "0.0.1",
115
+ "@vibesdotdev/runtime": "0.0.1",
116
+ "@vibesdotdev/secrets": "0.0.1",
117
+ "@vibesdotdev/connector-cloudflare": "0.0.1",
118
+ "zod": "^4.3.6"
119
+ },
120
+ "scripts": {
121
+ "build": "tsc -p tsconfig.json",
122
+ "check": "bun --bun tsc -p tsconfig.json --noEmit",
123
+ "test": "bun test src"
124
+ },
125
+ "license": "MIT",
126
+ "files": [
127
+ "dist",
128
+ "src",
129
+ "bin",
130
+ "README.md",
131
+ "SPEC.md",
132
+ "LICENSE",
133
+ "!src/**/__tests__/**",
134
+ "!src/**/__stubs__/**",
135
+ "!src/**/*.test.ts",
136
+ "!src/**/*.test.tsx",
137
+ "!src/**/*.spec.ts",
138
+ "!src/**/*.spec.tsx",
139
+ "!dist/**/__tests__/**",
140
+ "!dist/**/__stubs__/**",
141
+ "!dist/**/*.test.js",
142
+ "!dist/**/*.test.js.map",
143
+ "!dist/**/*.test.d.ts",
144
+ "!dist/**/*.test.d.ts.map",
145
+ "!dist/**/*.spec.js",
146
+ "!dist/**/*.spec.js.map",
147
+ "!dist/**/*.spec.d.ts",
148
+ "!dist/**/*.spec.d.ts.map"
149
+ ],
150
+ "vibes": {
151
+ "visibility": "public-framework"
152
+ }
153
+ }
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Cloudflare Infrastructure Plugin
3
+ *
4
+ * Registers Cloudflare provider implementations for each infra kind.
5
+ * When a descriptor's adapter/engine matches a Cloudflare provider,
6
+ * the corresponding config generator is loaded.
7
+ *
8
+ * Web apps deploy via @sveltejs/adapter-cloudflare Workers Static Assets,
9
+ * configured per-app in apps/{app}-web/wrangler.jsonc. The Pages module
10
+ * provides `createCloudflarePagesDeployment` and `renderWranglerJson`
11
+ * for consumers that need programmatic wrangler config generation.
12
+ */
13
+
14
+ import { createRuntimePlugin, createRuntimeImplementation, createRuntimeAsset } from '@vibesdotdev/runtime';
15
+ import {
16
+ generateCloudflareWorkerConfig,
17
+ CloudflareWorkerDescriptorSchema,
18
+ type CloudflareWorkerDescriptorInput,
19
+ type WranglerWorkerConfig
20
+ } from './implementations/workers.impl';
21
+ import {
22
+ generateCloudflareQueueConfig,
23
+ CloudflareQueueDescriptorSchema,
24
+ type CloudflareQueueDescriptor
25
+ } from './implementations/queues.impl';
26
+ import {
27
+ generateCloudflareR2Config,
28
+ CloudflareR2DescriptorSchema,
29
+ type CloudflareR2Descriptor
30
+ } from './implementations/r2.impl';
31
+ import {
32
+ generateCloudflareKVConfig,
33
+ CloudflareKVDescriptorSchema,
34
+ type CloudflareKVDescriptor
35
+ } from './implementations/kv.impl';
36
+ import {
37
+ generateCloudflarePagesDescriptor,
38
+ CloudflarePagesDescriptorSchema,
39
+ type CloudflarePagesDescriptor
40
+ } from './implementations/pages.impl';
41
+ import {
42
+ CloudflareWebAppDescriptorSchema,
43
+ type CloudflareWebAppDescriptorInput
44
+ } from './implementations/web-app.impl';
45
+ import {
46
+ CloudflareLogsDescriptorSchema,
47
+ createCloudflareLogsImplementation,
48
+ type CloudflareLogsDescriptorInput
49
+ } from './implementations/logs.impl';
50
+ import {
51
+ CloudflareAlertsDescriptorSchema,
52
+ createCloudflareAlertsImplementation,
53
+ type CloudflareAlertsDescriptorInput
54
+ } from './implementations/alerts.impl';
55
+ import {
56
+ CloudflareObservabilityDescriptorSchema,
57
+ createCloudflareObservabilityImplementation,
58
+ type CloudflareObservabilityDescriptorInput
59
+ } from './implementations/observability.impl';
60
+ import {
61
+ CloudflareRumDescriptorSchema,
62
+ createCloudflareRumImplementation,
63
+ type CloudflareRumDescriptorInput
64
+ } from './implementations/rum.impl';
65
+ import cloudflareApiDescriptor from './secrets/cloudflare-api.descriptor';
66
+ import cloudflareSecretsStoreDescriptor from './secrets/cloudflare-secrets-store.descriptor';
67
+ import cloudflareAlertsDescriptor from './implementations/alerts.descriptor.ts';
68
+ import cloudflareLogsDescriptor from './implementations/logs.descriptor';
69
+ import cloudflareObservabilityDescriptor from './implementations/observability.descriptor.ts';
70
+ import cloudflareRumDescriptor from './implementations/rum.descriptor.ts';
71
+
72
+ function createWorkerImpl(input: CloudflareWorkerDescriptorInput) {
73
+ const descriptor = CloudflareWorkerDescriptorSchema.parse(input);
74
+ return createRuntimeImplementation({
75
+ id: 'cloudflare-workers',
76
+ kind: 'infra/worker',
77
+ priority: 10,
78
+ implementation: {
79
+ generateConfig: () => generateCloudflareWorkerConfig(descriptor)
80
+ }
81
+ });
82
+ }
83
+
84
+ function createQueueImpl(input: CloudflareQueueDescriptor) {
85
+ const descriptor = CloudflareQueueDescriptorSchema.parse(input);
86
+ return createRuntimeImplementation({
87
+ id: 'cloudflare-queues',
88
+ kind: 'infra/queue',
89
+ priority: 10,
90
+ implementation: {
91
+ generateConfig: () => generateCloudflareQueueConfig(descriptor)
92
+ }
93
+ });
94
+ }
95
+
96
+ function createR2Impl(input: CloudflareR2Descriptor) {
97
+ const descriptor = CloudflareR2DescriptorSchema.parse(input);
98
+ return createRuntimeImplementation({
99
+ id: 'cloudflare-r2',
100
+ kind: 'infra/object-storage',
101
+ priority: 10,
102
+ implementation: {
103
+ generateConfig: () => generateCloudflareR2Config(descriptor)
104
+ }
105
+ });
106
+ }
107
+
108
+ function createKVImpl(input: CloudflareKVDescriptor) {
109
+ const descriptor = CloudflareKVDescriptorSchema.parse(input);
110
+ return createRuntimeImplementation({
111
+ id: 'cloudflare-kv',
112
+ kind: 'infra/cache',
113
+ priority: 10,
114
+ implementation: {
115
+ generateConfig: () => generateCloudflareKVConfig(descriptor)
116
+ }
117
+ });
118
+ }
119
+
120
+ function createPagesImpl(input: CloudflarePagesDescriptor) {
121
+ const descriptor = CloudflarePagesDescriptorSchema.parse(input);
122
+ return createRuntimeImplementation({
123
+ id: 'cloudflare-pages',
124
+ kind: 'infra/web-app',
125
+ priority: 10,
126
+ implementation: {
127
+ generateConfig: () => descriptor,
128
+ getProjectName: () => descriptor.cfProjectName
129
+ }
130
+ });
131
+ }
132
+
133
+ function createWebAppImpl(input: CloudflareWebAppDescriptorInput) {
134
+ const descriptor = CloudflareWebAppDescriptorSchema.parse(input);
135
+ return createRuntimeImplementation({
136
+ id: 'cloudflare-web-app',
137
+ kind: 'infra/web-app',
138
+ priority: 20,
139
+ implementation: {
140
+ generateConfig: () => descriptor,
141
+ getWorkerName: () => descriptor.cfWorkerName
142
+ }
143
+ });
144
+ }
145
+
146
+ function createLogsImpl(input: CloudflareLogsDescriptorInput) {
147
+ const descriptor = CloudflareLogsDescriptorSchema.parse(input);
148
+ const impl = createCloudflareLogsImplementation(descriptor);
149
+ return createRuntimeImplementation({
150
+ id: 'cloudflare-logs',
151
+ kind: 'infra/logs',
152
+ priority: 10,
153
+ implementation: impl
154
+ });
155
+ }
156
+
157
+ function createAlertsImpl(input: CloudflareAlertsDescriptorInput) {
158
+ const descriptor = CloudflareAlertsDescriptorSchema.parse(input);
159
+ const impl = createCloudflareAlertsImplementation(descriptor);
160
+ return createRuntimeImplementation({
161
+ id: 'cloudflare-alerts',
162
+ kind: 'infra/alerts',
163
+ priority: 10,
164
+ implementation: impl
165
+ });
166
+ }
167
+
168
+ function createObservabilityImpl(input: CloudflareObservabilityDescriptorInput) {
169
+ const descriptor = CloudflareObservabilityDescriptorSchema.parse(input);
170
+ const impl = createCloudflareObservabilityImplementation(descriptor);
171
+ return createRuntimeImplementation({
172
+ id: 'cloudflare-workers-observability',
173
+ kind: 'infra/observability',
174
+ priority: 10,
175
+ implementation: impl
176
+ });
177
+ }
178
+
179
+ function createRumImpl(input: CloudflareRumDescriptorInput) {
180
+ const descriptor = CloudflareRumDescriptorSchema.parse(input);
181
+ const impl = createCloudflareRumImplementation(descriptor);
182
+ return createRuntimeImplementation({
183
+ id: 'cloudflare-web-analytics',
184
+ kind: 'infra/rum',
185
+ priority: 10,
186
+ implementation: impl
187
+ });
188
+ }
189
+
190
+ export {
191
+ createWorkerImpl,
192
+ createQueueImpl,
193
+ createR2Impl,
194
+ createKVImpl,
195
+ createPagesImpl,
196
+ createWebAppImpl,
197
+ createLogsImpl,
198
+ createAlertsImpl,
199
+ createObservabilityImpl,
200
+ createRumImpl
201
+ };
202
+
203
+ export default createRuntimePlugin({
204
+ id: 'infra-cloudflare',
205
+ name: 'Cloudflare Infrastructure',
206
+ description: 'Cloudflare provider implementations for infra kinds (Workers, Queues, R2, KV, Pages)',
207
+ dependencies: ['infra'],
208
+
209
+ // Surface the secrets/store descriptors at the asset level so the secrets
210
+ // CLI (`vibes secrets push/pull/list`) can enumerate available remotes
211
+ // alongside the loaders below. Loader-only registration leaves the
212
+ // descriptors invisible to `runtime.assets('secrets/store').descriptors()`.
213
+ descriptors: [
214
+ cloudflareApiDescriptor,
215
+ cloudflareSecretsStoreDescriptor,
216
+ cloudflareAlertsDescriptor,
217
+ cloudflareLogsDescriptor,
218
+ cloudflareObservabilityDescriptor,
219
+ cloudflareRumDescriptor
220
+ ],
221
+
222
+ onActivate: async (runtime) => {
223
+ runtime.registerLoader(
224
+ 'infra/worker',
225
+ 'cloudflare-workers',
226
+ async () => {
227
+ return createWorkerImpl({
228
+ kind: 'infra/worker',
229
+ id: 'cloudflare-workers',
230
+ name: 'Cloudflare Workers',
231
+ adapter: 'cloudflare-workers',
232
+ workerName: 'default-worker',
233
+ main: 'src/worker.ts'
234
+ });
235
+ },
236
+ { priority: 10, origin: 'infra-cloudflare' }
237
+ );
238
+
239
+ runtime.registerLoader(
240
+ 'infra/queue',
241
+ 'cloudflare-queues',
242
+ async () => {
243
+ return createQueueImpl({
244
+ kind: 'infra/queue',
245
+ id: 'cloudflare-queues',
246
+ name: 'Cloudflare Queues',
247
+ engine: 'cloudflare-queues',
248
+ queueName: 'default',
249
+ binding: 'DEFAULT_QUEUE'
250
+ });
251
+ },
252
+ { priority: 10, origin: 'infra-cloudflare' }
253
+ );
254
+
255
+ runtime.registerLoader(
256
+ 'infra/object-storage',
257
+ 'cloudflare-r2',
258
+ async () => {
259
+ return createR2Impl({
260
+ kind: 'infra/object-storage',
261
+ id: 'cloudflare-r2',
262
+ name: 'Cloudflare R2',
263
+ adapter: 'cloudflare-r2',
264
+ binding: 'STORAGE',
265
+ bucketName: 'default'
266
+ });
267
+ },
268
+ { priority: 10, origin: 'infra-cloudflare' }
269
+ );
270
+
271
+ runtime.registerLoader(
272
+ 'infra/cache',
273
+ 'cloudflare-kv',
274
+ async () => {
275
+ return createKVImpl({
276
+ kind: 'infra/cache',
277
+ id: 'cloudflare-kv',
278
+ name: 'Cloudflare KV',
279
+ engine: 'cloudflare-kv',
280
+ binding: 'CACHE',
281
+ namespaceId: 'default'
282
+ });
283
+ },
284
+ { priority: 10, origin: 'infra-cloudflare' }
285
+ );
286
+
287
+ runtime.registerLoader(
288
+ 'infra/alerts',
289
+ 'cloudflare-alerts',
290
+ async () => {
291
+ return createAlertsImpl({
292
+ kind: 'infra/alerts',
293
+ id: 'cloudflare-alerts',
294
+ name: 'Cloudflare Alerts',
295
+ adapter: 'cloudflare-alerts',
296
+ policies: []
297
+ });
298
+ },
299
+ { priority: 10, origin: 'infra-cloudflare' }
300
+ );
301
+
302
+ runtime.registerLoader(
303
+ 'infra/observability',
304
+ 'cloudflare-workers-observability',
305
+ async () => {
306
+ return createObservabilityImpl({
307
+ kind: 'infra/observability',
308
+ id: 'cloudflare-workers-observability',
309
+ name: 'Cloudflare Workers Observability',
310
+ adapter: 'cloudflare-workers-observability'
311
+ });
312
+ },
313
+ { priority: 10, origin: 'infra-cloudflare' }
314
+ );
315
+
316
+ runtime.registerLoader(
317
+ 'infra/rum',
318
+ 'cloudflare-web-analytics',
319
+ async () => {
320
+ return createRumImpl({
321
+ kind: 'infra/rum',
322
+ id: 'cloudflare-web-analytics',
323
+ name: 'Cloudflare Web Analytics',
324
+ adapter: 'cloudflare-web-analytics',
325
+ siteToken: '96bb815cb0bc4afc87a793e6f34652b2'
326
+ });
327
+ },
328
+ { priority: 10, origin: 'infra-cloudflare' }
329
+ );
330
+
331
+ runtime.registerLoader(
332
+ 'secrets/store',
333
+ 'cloudflare-api',
334
+ async () => {
335
+ const { createCloudflareApiStore } = await import('./secrets/cloudflare-api.impl');
336
+ // Pass a resolver that derives project names from runtime-resolved infra/web-app
337
+ // descriptors. CF-specific fields live under the kind's `adapterConfig` escape
338
+ // hatch (see infra-core/kinds/web-app.kind.ts). When `adapterConfig.cfProjectName`
339
+ // is set, it wins; otherwise the project name is derived from the descriptor id.
340
+ const resolver = () => {
341
+ if (runtime.hasKind('infra/web-app')) {
342
+ const apps = runtime.query('infra/web-app').descriptors() as Array<{
343
+ id: string;
344
+ config?: { cfProjectName?: string };
345
+ }>;
346
+ return apps.map((a) => {
347
+ const explicit = a.config?.cfProjectName;
348
+ return explicit ?? `vibes-${a.id.replace(/-app$/, '')}`;
349
+ });
350
+ }
351
+ return [];
352
+ };
353
+ return createCloudflareApiStore(resolver);
354
+ },
355
+ { priority: 20, origin: 'infra-cloudflare' }
356
+ );
357
+
358
+ runtime.registerLoader(
359
+ 'secrets/store',
360
+ 'cloudflare-secrets-store',
361
+ async () => {
362
+ const { createCloudflareSecretsStore } = await import('./secrets/cloudflare-secrets-store.impl');
363
+ return createCloudflareSecretsStore();
364
+ },
365
+ { priority: 30, origin: 'infra-cloudflare' }
366
+ );
367
+
368
+ runtime.registerLoader(
369
+ 'infra/web-app',
370
+ 'cloudflare-pages',
371
+ async () => {
372
+ return createPagesImpl({
373
+ kind: 'infra/web-app',
374
+ id: 'cloudflare-pages',
375
+ name: 'Cloudflare Pages',
376
+ adapter: 'cloudflare-workers',
377
+ cfProjectName: 'default-project',
378
+ outputDir: '.svelte-kit/cloudflare',
379
+ compatibilityFlags: ['nodejs_compat'],
380
+ env: {}
381
+ });
382
+ },
383
+ { priority: 10, origin: 'infra-cloudflare' }
384
+ );
385
+
386
+ runtime.registerLoader(
387
+ 'infra/web-app',
388
+ 'cloudflare-web-app',
389
+ async () => {
390
+ return createWebAppImpl({
391
+ kind: 'infra/web-app',
392
+ id: 'cloudflare-web-app',
393
+ name: 'Cloudflare Workers + Static Assets',
394
+ adapter: 'cloudflare-workers',
395
+ cfWorkerName: 'default-worker',
396
+ outputDir: '.svelte-kit/cloudflare',
397
+ compatibilityFlags: ['nodejs_compat'],
398
+ env: {}
399
+ });
400
+ },
401
+ { priority: 20, origin: 'infra-cloudflare' }
402
+ );
403
+
404
+ // Framework-level Cloudflare Logs descriptor. The list of workers to
405
+ // observe is *not* hardcoded here — that's app inventory, owned by
406
+ // each consumer's `deployment.config.ts`. CLI surfaces (e.g.
407
+ // `vibes infra logs`) discover sources from those configs and pass
408
+ // the requested worker name into the connector at call time.
409
+ runtime.registerLoader(
410
+ 'infra/logs',
411
+ 'cloudflare-logs',
412
+ async () => {
413
+ return createLogsImpl({
414
+ kind: 'infra/logs',
415
+ id: 'cloudflare-logs',
416
+ name: 'Cloudflare Logs',
417
+ adapter: 'cloudflare-logs',
418
+ adapterConfig: {
419
+ accountId: { source: 'secret', key: 'CLOUDFLARE_ACCOUNT_ID' },
420
+ apiToken: { source: 'secret', key: 'CLOUDFLARE_API_TOKEN' }
421
+ },
422
+ sources: [],
423
+ retention: {
424
+ hotDays: 7,
425
+ coldDays: 30
426
+ }
427
+ });
428
+ },
429
+ { priority: 10, origin: 'infra-cloudflare' }
430
+ );
431
+
432
+ // infra/artifact: Cloudflare Worker wrangler.jsonc generator
433
+ runtime.registerDescriptor('infra/artifact', {
434
+ id: 'wrangler-jsonc',
435
+ kind: 'infra/artifact',
436
+ description: 'Generates wrangler.jsonc configuration from infra/worker descriptors'
437
+ });
438
+ runtime.registerLoader('infra/artifact', 'wrangler-jsonc', async () => {
439
+ return createRuntimeImplementation({
440
+ id: 'wrangler-toml',
441
+ kind: 'infra/artifact',
442
+ priority: 10,
443
+ implementation: {
444
+ async generate(context?: any) {
445
+ const resources = context?.resources || [];
446
+ const outputDir = context?.outputDir || './infra/generated';
447
+ const workerDescriptors = resources.filter((r: any) => r.kind === 'infra/worker');
448
+
449
+ if (workerDescriptors.length === 0) {
450
+ return {
451
+ content: '# No infra/worker descriptors found\n',
452
+ filename: 'wrangler.toml',
453
+ path: `${outputDir}/cloudflare/wrangler.toml`,
454
+ metadata: { sourceKind: 'infra/worker', format: 'toml', generator: 'wrangler-toml' }
455
+ };
456
+ }
457
+
458
+ const configs: string[] = [];
459
+ for (const descriptor of workerDescriptors) {
460
+ const parsed = CloudflareWorkerDescriptorSchema.parse(descriptor);
461
+ const config: WranglerWorkerConfig = generateCloudflareWorkerConfig(parsed);
462
+ const jsonContent = JSON.stringify(config, null, 2);
463
+ configs.push(`// Worker: ${descriptor.id}\n${jsonContent}`);
464
+ }
465
+
466
+ return {
467
+ content: configs.join('\n\n'),
468
+ filename: 'wrangler.jsonc',
469
+ path: `${outputDir}/cloudflare/wrangler.jsonc`,
470
+ metadata: { sourceKind: 'infra/worker', format: 'jsonc', generator: 'wrangler-jsonc' }
471
+ };
472
+ }
473
+ }
474
+ });
475
+ });
476
+ }
477
+ });
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Default Cloudflare Alerts descriptor — registered at plugin load
3
+ * time so `runtime.assets('infra/alerts').descriptors()` returns at
4
+ * least one entry the moment the infra-cloudflare plugin is loaded.
5
+ *
6
+ * The descriptor only carries adapter identity + credential pointers;
7
+ * actual policy bodies live either on the provider (created via the
8
+ * CLI / dashboard) or in a sibling `account.config.ts` declarative file.
9
+ */
10
+
11
+ import type { InfraAlertsDescriptor } from '@vibesdotdev/infra-core/kinds';
12
+
13
+ const descriptor: InfraAlertsDescriptor = {
14
+ kind: 'infra/alerts',
15
+ id: 'cloudflare-alerts',
16
+ name: 'Cloudflare Alerts',
17
+ description: 'Cloudflare Notifications policies (billing, usage, error-rate)',
18
+ adapter: 'cloudflare-alerts',
19
+ adapterConfig: {
20
+ apiTokenEnvVar: 'CLOUDFLARE_NOTIFICATIONS_API_TOKEN',
21
+ apiTokenFallbackEnvVar: 'CLOUDFLARE_API_TOKEN',
22
+ accountIdEnvVar: 'CLOUDFLARE_ACCOUNT_ID'
23
+ },
24
+ // CLI ops resolve credentials from the LOCAL secrets vault by
25
+ // default. Production Workers that consume this adapter set the
26
+ // values via Cloudflare Secrets Store bindings — they never go
27
+ // through vibes secrets at runtime. CLI commands can pass
28
+ // `--environment` to read from a different vault.
29
+ environment: 'local',
30
+ policies: []
31
+ };
32
+
33
+ export default descriptor;