@webflow/cloud-app 0.1.0-beta.7

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 (174) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/bindings.d.ts +185 -0
  4. package/dist/bindings.d.ts.map +1 -0
  5. package/dist/bindings.js +120 -0
  6. package/dist/bindings.js.map +1 -0
  7. package/dist/config/package-json.d.ts +57 -0
  8. package/dist/config/package-json.d.ts.map +1 -0
  9. package/dist/config/package-json.js +94 -0
  10. package/dist/config/package-json.js.map +1 -0
  11. package/dist/config/webflow-json.d.ts +53 -0
  12. package/dist/config/webflow-json.d.ts.map +1 -0
  13. package/dist/config/webflow-json.js +72 -0
  14. package/dist/config/webflow-json.js.map +1 -0
  15. package/dist/create-webflow-json.d.ts +24 -0
  16. package/dist/create-webflow-json.d.ts.map +1 -0
  17. package/dist/create-webflow-json.js +170 -0
  18. package/dist/create-webflow-json.js.map +1 -0
  19. package/dist/errors.d.ts +13 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +23 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/frameworks/astro/adapter-patches/ensure-fixed-cloudflare-adapter.d.ts +36 -0
  24. package/dist/frameworks/astro/adapter-patches/ensure-fixed-cloudflare-adapter.d.ts.map +1 -0
  25. package/dist/frameworks/astro/adapter-patches/ensure-fixed-cloudflare-adapter.js +94 -0
  26. package/dist/frameworks/astro/adapter-patches/ensure-fixed-cloudflare-adapter.js.map +1 -0
  27. package/dist/frameworks/astro/adapter-patches/strip-cloudflare-base-nesting.d.ts +2 -0
  28. package/dist/frameworks/astro/adapter-patches/strip-cloudflare-base-nesting.d.ts.map +1 -0
  29. package/dist/frameworks/astro/adapter-patches/strip-cloudflare-base-nesting.js +97 -0
  30. package/dist/frameworks/astro/adapter-patches/strip-cloudflare-base-nesting.js.map +1 -0
  31. package/dist/frameworks/astro/astro5.d.ts +28 -0
  32. package/dist/frameworks/astro/astro5.d.ts.map +1 -0
  33. package/dist/frameworks/astro/astro5.js +259 -0
  34. package/dist/frameworks/astro/astro5.js.map +1 -0
  35. package/dist/frameworks/astro/astro6.d.ts +28 -0
  36. package/dist/frameworks/astro/astro6.d.ts.map +1 -0
  37. package/dist/frameworks/astro/astro6.js +286 -0
  38. package/dist/frameworks/astro/astro6.js.map +1 -0
  39. package/dist/frameworks/astro/astro7.d.ts +28 -0
  40. package/dist/frameworks/astro/astro7.d.ts.map +1 -0
  41. package/dist/frameworks/astro/astro7.js +283 -0
  42. package/dist/frameworks/astro/astro7.js.map +1 -0
  43. package/dist/frameworks/astro/index.d.ts +10 -0
  44. package/dist/frameworks/astro/index.d.ts.map +1 -0
  45. package/dist/frameworks/astro/index.js +16 -0
  46. package/dist/frameworks/astro/index.js.map +1 -0
  47. package/dist/frameworks/astro/templates/astro.config.webflow.ts +61 -0
  48. package/dist/frameworks/astro/templates/v5/astro.config.mjs.template +25 -0
  49. package/dist/frameworks/astro/templates/v5/webflow-loader.ts +103 -0
  50. package/dist/frameworks/astro/templates/v5/wrangler.json +6 -0
  51. package/dist/frameworks/astro/templates/v6/astro.config.mjs.template +35 -0
  52. package/dist/frameworks/astro/templates/v6/webflow-loader.ts +112 -0
  53. package/dist/frameworks/astro/templates/v6/wrangler.json +9 -0
  54. package/dist/frameworks/astro/templates/v7/astro.config.mjs.template +34 -0
  55. package/dist/frameworks/astro/templates/v7/webflow-loader.ts +113 -0
  56. package/dist/frameworks/astro/templates/v7/wrangler.json +9 -0
  57. package/dist/frameworks/base.d.ts +134 -0
  58. package/dist/frameworks/base.d.ts.map +1 -0
  59. package/dist/frameworks/base.js +175 -0
  60. package/dist/frameworks/base.js.map +1 -0
  61. package/dist/frameworks/errors.d.ts +72 -0
  62. package/dist/frameworks/errors.d.ts.map +1 -0
  63. package/dist/frameworks/errors.js +120 -0
  64. package/dist/frameworks/errors.js.map +1 -0
  65. package/dist/frameworks/nextjs/adapter-resolver.d.ts +72 -0
  66. package/dist/frameworks/nextjs/adapter-resolver.d.ts.map +1 -0
  67. package/dist/frameworks/nextjs/adapter-resolver.js +246 -0
  68. package/dist/frameworks/nextjs/adapter-resolver.js.map +1 -0
  69. package/dist/frameworks/nextjs/index.d.ts +38 -0
  70. package/dist/frameworks/nextjs/index.d.ts.map +1 -0
  71. package/dist/frameworks/nextjs/index.js +268 -0
  72. package/dist/frameworks/nextjs/index.js.map +1 -0
  73. package/dist/frameworks/nextjs/templates/next.config.ts.template +13 -0
  74. package/dist/frameworks/nextjs/templates/next.config.webflow.ts +46 -0
  75. package/dist/frameworks/nextjs/templates/open-next.config.ts +3 -0
  76. package/dist/frameworks/nextjs/templates/webflow-loader.ts +44 -0
  77. package/dist/frameworks/nextjs/templates/wrangler.json +6 -0
  78. package/dist/frameworks/registry.d.ts +127 -0
  79. package/dist/frameworks/registry.d.ts.map +1 -0
  80. package/dist/frameworks/registry.js +257 -0
  81. package/dist/frameworks/registry.js.map +1 -0
  82. package/dist/frameworks/static/index.d.ts +93 -0
  83. package/dist/frameworks/static/index.d.ts.map +1 -0
  84. package/dist/frameworks/static/index.js +352 -0
  85. package/dist/frameworks/static/index.js.map +1 -0
  86. package/dist/frameworks/static/templates/wrangler.json +7 -0
  87. package/dist/frameworks/types.d.ts +138 -0
  88. package/dist/frameworks/types.d.ts.map +1 -0
  89. package/dist/frameworks/types.js +3 -0
  90. package/dist/frameworks/types.js.map +1 -0
  91. package/dist/frameworks/vite/index.d.ts +46 -0
  92. package/dist/frameworks/vite/index.d.ts.map +1 -0
  93. package/dist/frameworks/vite/index.js +303 -0
  94. package/dist/frameworks/vite/index.js.map +1 -0
  95. package/dist/frameworks/vite/templates/vite.config.ts.template +14 -0
  96. package/dist/frameworks/vite/templates/vite.config.webflow.ts +52 -0
  97. package/dist/frameworks/vite/templates/wrangler.json +10 -0
  98. package/dist/index.d.ts +44 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +118 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/pipeline.d.ts +8 -0
  103. package/dist/pipeline.d.ts.map +1 -0
  104. package/dist/pipeline.js +263 -0
  105. package/dist/pipeline.js.map +1 -0
  106. package/dist/ports/command-runner.d.ts +60 -0
  107. package/dist/ports/command-runner.d.ts.map +1 -0
  108. package/dist/ports/command-runner.js +116 -0
  109. package/dist/ports/command-runner.js.map +1 -0
  110. package/dist/ports/filesystem.d.ts +19 -0
  111. package/dist/ports/filesystem.d.ts.map +1 -0
  112. package/dist/ports/filesystem.js +68 -0
  113. package/dist/ports/filesystem.js.map +1 -0
  114. package/dist/ports/index.d.ts +17 -0
  115. package/dist/ports/index.d.ts.map +1 -0
  116. package/dist/ports/index.js +14 -0
  117. package/dist/ports/index.js.map +1 -0
  118. package/dist/ports/logger.d.ts +22 -0
  119. package/dist/ports/logger.d.ts.map +1 -0
  120. package/dist/ports/logger.js +18 -0
  121. package/dist/ports/logger.js.map +1 -0
  122. package/dist/ports/telemetry.d.ts +23 -0
  123. package/dist/ports/telemetry.d.ts.map +1 -0
  124. package/dist/ports/telemetry.js +12 -0
  125. package/dist/ports/telemetry.js.map +1 -0
  126. package/dist/toolchain/errors.d.ts +32 -0
  127. package/dist/toolchain/errors.d.ts.map +1 -0
  128. package/dist/toolchain/errors.js +31 -0
  129. package/dist/toolchain/errors.js.map +1 -0
  130. package/dist/toolchain/resolver.d.ts +25 -0
  131. package/dist/toolchain/resolver.d.ts.map +1 -0
  132. package/dist/toolchain/resolver.js +200 -0
  133. package/dist/toolchain/resolver.js.map +1 -0
  134. package/dist/toolchain/types.d.ts +52 -0
  135. package/dist/toolchain/types.d.ts.map +1 -0
  136. package/dist/toolchain/types.js +10 -0
  137. package/dist/toolchain/types.js.map +1 -0
  138. package/dist/types.d.ts +66 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +3 -0
  141. package/dist/types.js.map +1 -0
  142. package/dist/utils/fs.d.ts +29 -0
  143. package/dist/utils/fs.d.ts.map +1 -0
  144. package/dist/utils/fs.js +126 -0
  145. package/dist/utils/fs.js.map +1 -0
  146. package/dist/utils/index.d.ts +11 -0
  147. package/dist/utils/index.d.ts.map +1 -0
  148. package/dist/utils/index.js +27 -0
  149. package/dist/utils/index.js.map +1 -0
  150. package/dist/utils/node-version.d.ts +20 -0
  151. package/dist/utils/node-version.d.ts.map +1 -0
  152. package/dist/utils/node-version.js +113 -0
  153. package/dist/utils/node-version.js.map +1 -0
  154. package/dist/utils/process.d.ts +25 -0
  155. package/dist/utils/process.d.ts.map +1 -0
  156. package/dist/utils/process.js +40 -0
  157. package/dist/utils/process.js.map +1 -0
  158. package/dist/utils/reserved-env.d.ts +26 -0
  159. package/dist/utils/reserved-env.d.ts.map +1 -0
  160. package/dist/utils/reserved-env.js +51 -0
  161. package/dist/utils/reserved-env.js.map +1 -0
  162. package/dist/utils/template.d.ts +15 -0
  163. package/dist/utils/template.d.ts.map +1 -0
  164. package/dist/utils/template.js +75 -0
  165. package/dist/utils/template.js.map +1 -0
  166. package/dist/utils/version.d.ts +9 -0
  167. package/dist/utils/version.d.ts.map +1 -0
  168. package/dist/utils/version.js +52 -0
  169. package/dist/utils/version.js.map +1 -0
  170. package/dist/wrangler.d.ts +192 -0
  171. package/dist/wrangler.d.ts.map +1 -0
  172. package/dist/wrangler.js +246 -0
  173. package/dist/wrangler.js.map +1 -0
  174. package/package.json +47 -0
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Astro7Builder = void 0;
37
+ /**
38
+ * Astro 7 Framework Builder
39
+ *
40
+ * Builds Astro 7.x projects for Cloudflare Workers deployment.
41
+ *
42
+ * - Node.js 22.12.0+ required
43
+ * - @astrojs/cloudflare@^14.0.0 (uses @cloudflare/vite-plugin)
44
+ * - Vite 8 required
45
+ * - Build output: dist/server/entry.mjs (worker) + dist/client/ (static assets)
46
+ * - Uses workerd natively for dev (no platformProxy)
47
+ * - wrangler.json main: "@astrojs/cloudflare/entrypoints/server"
48
+ *
49
+ * The Cloudflare output shape is unchanged from Astro 6, so the deploy metadata
50
+ * matches astro6.ts. The differences are dependency majors (adapter, React
51
+ * integration) and the underlying Vite 8 / Astro 7 toolchain.
52
+ */
53
+ const path = __importStar(require("node:path"));
54
+ const fs = __importStar(require("node:fs"));
55
+ const base_1 = require("../base");
56
+ const errors_1 = require("../errors");
57
+ const ensure_fixed_cloudflare_adapter_1 = require("./adapter-patches/ensure-fixed-cloudflare-adapter");
58
+ const utils_1 = require("../../utils");
59
+ /** Base path for Astro 7 templates. */
60
+ const TEMPLATE_BASE = path.join(__dirname, 'templates', 'v7');
61
+ const SHARED_TEMPLATE_BASE = path.join(__dirname, 'templates');
62
+ class Astro7Builder extends base_1.FrameworkBuilder {
63
+ static frameworkName = 'astro';
64
+ // ───────────────────────────────────────────────────────────────────────────
65
+ // FRAMEWORK INFO
66
+ // ───────────────────────────────────────────────────────────────────────────
67
+ get info() {
68
+ return {
69
+ name: 'astro',
70
+ version: '7.x',
71
+ displayName: 'Astro 7',
72
+ packageName: 'astro',
73
+ };
74
+ }
75
+ getFrameworkVersion() {
76
+ return this.resolveFrameworkVersion('astro');
77
+ }
78
+ // ───────────────────────────────────────────────────────────────────────────
79
+ // DETECTION
80
+ // ───────────────────────────────────────────────────────────────────────────
81
+ /**
82
+ * Detect if this is an Astro 7 project.
83
+ *
84
+ * Version is always determined from package.json, not webflow.json. The
85
+ * registry checks Astro7Builder before Astro6Builder, so Astro 7+ projects
86
+ * are detected here first.
87
+ */
88
+ static detect(packageJson, webflowJson) {
89
+ const specifiedFramework = webflowJson?.cloud?.framework;
90
+ // If webflow.json specifies a DIFFERENT framework, don't match.
91
+ if (specifiedFramework && specifiedFramework !== 'astro') {
92
+ return { detected: false };
93
+ }
94
+ const astroVersion = packageJson.dependencies?.astro || packageJson.devDependencies?.astro;
95
+ if (!astroVersion) {
96
+ return { detected: false };
97
+ }
98
+ const majorVersion = (0, utils_1.getMajorVersion)(astroVersion);
99
+ if (majorVersion !== null && majorVersion >= 7) {
100
+ return { detected: true, reason: `Found astro@${astroVersion} (Astro ${majorVersion}.x)` };
101
+ }
102
+ return { detected: false };
103
+ }
104
+ // ───────────────────────────────────────────────────────────────────────────
105
+ // VALIDATION
106
+ // ───────────────────────────────────────────────────────────────────────────
107
+ async validate() {
108
+ const { log, packageJson } = this.ctx;
109
+ // Astro 7 requires Node 22+.
110
+ const nodeReq = this.getNodeVersionRequirement();
111
+ if (nodeReq) {
112
+ (0, utils_1.validateNodeVersion)(log, nodeReq, this.info.displayName);
113
+ }
114
+ const astroVersion = packageJson.dependencies?.astro || packageJson.devDependencies?.astro;
115
+ if (!astroVersion) {
116
+ throw new errors_1.FrameworkValidationError('Astro is not installed in this project.', {
117
+ remediation: 'Install Astro by running: npm install astro@^7.0.0',
118
+ documentationUrl: 'https://docs.astro.build/en/install/',
119
+ });
120
+ }
121
+ // Reject "latest" explicitly.
122
+ if (astroVersion === 'latest') {
123
+ throw new errors_1.FrameworkValidationError('Astro version "latest" is not supported by Webflow Cloud.', { remediation: 'Please specify a version, e.g.: npm install astro@^7.0.0' });
124
+ }
125
+ const majorVersion = (0, utils_1.getMajorVersion)(astroVersion);
126
+ if (majorVersion !== null && majorVersion < 7) {
127
+ throw new errors_1.FrameworkValidationError(`Astro ${majorVersion}.x detected but Astro7Builder was selected. This is likely a configuration error.`, {
128
+ remediation: 'Use Astro6Builder for Astro 6.x projects, or upgrade: npm install astro@^7.0.0',
129
+ });
130
+ }
131
+ log.info(`Validated Astro 7 project: astro@${astroVersion}`);
132
+ }
133
+ // ───────────────────────────────────────────────────────────────────────────
134
+ // DEPENDENCIES
135
+ // ───────────────────────────────────────────────────────────────────────────
136
+ getCloudflareAdapter() {
137
+ return {
138
+ name: '@astrojs/cloudflare',
139
+ version: '^14.0.0',
140
+ peerDependencies: ['@cloudflare/vite-plugin'],
141
+ };
142
+ }
143
+ getRequiredIntegrations() {
144
+ return [
145
+ {
146
+ name: '@astrojs/react',
147
+ version: '^6.0.0', // Astro 7 compatible version
148
+ reason: 'Required for Webflow React components',
149
+ },
150
+ ];
151
+ }
152
+ async installDependencies() {
153
+ const { log, cwd, runCommand } = this.ctx;
154
+ // Every 14.x is past the base-path fix (13.3.1), so in practice this only installs the
155
+ // adapter when absent; a sub-14 adapter would be caught here as warn-only (crossing a
156
+ // major), but `@astrojs/cloudflare@13.x` peers on `astro@^6` and can't install against
157
+ // astro@7 anyway. Shared with Astro 6 so the two paths can't silently diverge.
158
+ const adapter = this.getCloudflareAdapter();
159
+ await (0, ensure_fixed_cloudflare_adapter_1.ensureFixedCloudflareAdapter)({
160
+ log,
161
+ runCommand,
162
+ cwd,
163
+ adapterName: adapter.name,
164
+ installVersion: adapter.version,
165
+ fixedFloor: '14.0.0',
166
+ declaredVersion: this.getDependencyVersion(adapter.name),
167
+ });
168
+ // Install peer dependencies.
169
+ if (adapter.peerDependencies) {
170
+ for (const peer of adapter.peerDependencies) {
171
+ if (!this.hasDependency(peer)) {
172
+ log.warn(`Installing ${peer} (peer dependency of ${adapter.name})...`);
173
+ await (0, utils_1.npm)({ log, runCommand, cwd, args: ['install', '--save', peer] });
174
+ }
175
+ }
176
+ }
177
+ for (const integration of this.getRequiredIntegrations()) {
178
+ if (!this.hasDependency(integration.name)) {
179
+ log.warn(`Installing ${integration.name}@${integration.version} (${integration.reason})...`);
180
+ await (0, utils_1.npm)({
181
+ log,
182
+ runCommand,
183
+ cwd,
184
+ args: ['install', '--save', `${integration.name}@${integration.version}`],
185
+ });
186
+ }
187
+ }
188
+ }
189
+ // ───────────────────────────────────────────────────────────────────────────
190
+ // CONFIGURATION
191
+ // ───────────────────────────────────────────────────────────────────────────
192
+ getWebflowLoader() {
193
+ return {
194
+ templatePath: path.join(TEMPLATE_BASE, 'webflow-loader.ts'),
195
+ destinationName: 'webflow-loader.ts',
196
+ configPath: './webflow-loader.ts',
197
+ };
198
+ }
199
+ getUserConfigPatterns() {
200
+ return ['astro.config.mjs', 'astro.config.cjs', 'astro.config.js', 'astro.config.ts'];
201
+ }
202
+ getWranglerTemplatePath() {
203
+ return path.join(TEMPLATE_BASE, 'wrangler.json');
204
+ }
205
+ getAdditionalConfigFiles() {
206
+ const loader = this.getWebflowLoader();
207
+ return [loader.templatePath, path.join(SHARED_TEMPLATE_BASE, 'astro.config.webflow.ts')];
208
+ }
209
+ async prepareConfig() {
210
+ const { log, cwd, userEnv } = this.ctx;
211
+ // Rename user's astro.config.* to clouduser.astro.config.*; if there is no
212
+ // user config, write an empty stub so the generated template's static
213
+ // import always resolves.
214
+ const renamedUserConfig = (0, utils_1.renameUserConfig)(log, cwd, 'astro.config', [
215
+ 'mjs',
216
+ 'cjs',
217
+ 'js',
218
+ 'ts',
219
+ ]);
220
+ if (renamedUserConfig === null) {
221
+ log.info('no user astro.config.{mjs,cjs,js,ts} found — writing empty clouduser.astro.config.mjs stub');
222
+ fs.writeFileSync(path.join(cwd, 'clouduser.astro.config.mjs'), 'export default {};\n');
223
+ }
224
+ // Copy the merge-logic library (real source, not a template).
225
+ const webflowConfigSrc = path.join(SHARED_TEMPLATE_BASE, 'astro.config.webflow.ts');
226
+ if ((0, utils_1.fileExists)(webflowConfigSrc)) {
227
+ log.info('Copying astro.config.webflow.ts...');
228
+ fs.copyFileSync(webflowConfigSrc, path.join(cwd, 'astro.config.webflow.ts'));
229
+ }
230
+ // Render the single astro.config.mjs template.
231
+ const templatePath = path.join(TEMPLATE_BASE, 'astro.config.mjs.template');
232
+ const destPath = path.join(cwd, 'astro.config.mjs');
233
+ log.info('Generating astro.config.mjs from template (Astro 7)...');
234
+ await (0, utils_1.envsubst)(log, templatePath, destPath, {
235
+ ...process.env,
236
+ ...userEnv,
237
+ });
238
+ // Copy webflow-loader.ts.
239
+ const loader = this.getWebflowLoader();
240
+ if ((0, utils_1.fileExists)(loader.templatePath)) {
241
+ log.info(`Copying ${loader.destinationName}...`);
242
+ fs.copyFileSync(loader.templatePath, path.join(cwd, loader.destinationName));
243
+ }
244
+ // wrangler.json is owned exclusively by `handleWranglerJson`, which runs
245
+ // before this hook and is the only function permitted to write
246
+ // /wrangler.json.
247
+ }
248
+ // ───────────────────────────────────────────────────────────────────────────
249
+ // BUILD
250
+ // ───────────────────────────────────────────────────────────────────────────
251
+ getBuildCommand() {
252
+ return 'astro build';
253
+ }
254
+ getNodeVersionRequirement() {
255
+ return {
256
+ minimum: '22.12.0',
257
+ severity: 'error', // Astro 7 will definitely fail without Node 22+
258
+ };
259
+ }
260
+ // ───────────────────────────────────────────────────────────────────────────
261
+ // OUTPUT
262
+ // ───────────────────────────────────────────────────────────────────────────
263
+ static getOutputDeployMetadata() {
264
+ return {
265
+ staticAssetsPath: 'dist/client',
266
+ // No exclude needed — Astro 7 has clean separation.
267
+ workerEntryPath: 'dist/server/entry.mjs',
268
+ wranglerMainOverride: '@astrojs/cloudflare/entrypoints/server',
269
+ deploymentType: 'ssr',
270
+ usesAssetsBinding: true,
271
+ // Astro 7 outputs multiple files (entry.mjs + chunks/*) that need bundling.
272
+ skipNoBundle: true,
273
+ // A fixed @astrojs/cloudflare nests the client tree under dist/client/<mount>/
274
+ // (base = mountPath), so the copy descends into that mount dir via
275
+ // stripCloudflareBaseNesting instead of the blind Astro 5 / Next.js append.
276
+ assetsSourceSkipMountPath: true,
277
+ // After wrangler dry-run, the bundled output is ./entry.mjs
278
+ dryRunEntryPath: './entry.mjs',
279
+ };
280
+ }
281
+ }
282
+ exports.Astro7Builder = Astro7Builder;
283
+ //# sourceMappingURL=astro7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astro7.js","sourceRoot":"","sources":["../../../src/frameworks/astro/astro7.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Astro Framework Builders.
3
+ *
4
+ * Exports Astro5/6/7 builders for use by the registry. Version detection is
5
+ * handled by each builder's static detect() method.
6
+ */
7
+ export { Astro5Builder } from './astro5';
8
+ export { Astro6Builder } from './astro6';
9
+ export { Astro7Builder } from './astro7';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/astro/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Astro7Builder = exports.Astro6Builder = exports.Astro5Builder = void 0;
4
+ /**
5
+ * Astro Framework Builders.
6
+ *
7
+ * Exports Astro5/6/7 builders for use by the registry. Version detection is
8
+ * handled by each builder's static detect() method.
9
+ */
10
+ var astro5_1 = require("./astro5");
11
+ Object.defineProperty(exports, "Astro5Builder", { enumerable: true, get: function () { return astro5_1.Astro5Builder; } });
12
+ var astro6_1 = require("./astro6");
13
+ Object.defineProperty(exports, "Astro6Builder", { enumerable: true, get: function () { return astro6_1.Astro6Builder; } });
14
+ var astro7_1 = require("./astro7");
15
+ Object.defineProperty(exports, "Astro7Builder", { enumerable: true, get: function () { return astro7_1.Astro7Builder; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/astro/index.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,mCAAyC;AAAhC,uGAAA,aAAa,OAAA;AACtB,mCAAyC;AAAhC,uGAAA,aAAa,OAAA"}
@@ -0,0 +1,61 @@
1
+ // Merge logic for the generated astro.config.mjs (shared between Astro 5 + 6).
2
+ // Copied verbatim into the user's project; types are local to avoid Astro
3
+ // cross-version drift.
4
+
5
+ type AstroIntegration = { name?: string; [key: string]: any };
6
+ type AstroUserConfig = Record<string, any>;
7
+
8
+ export type WebflowOverridesOptions = {
9
+ mountPath: string;
10
+ deployUrl: string;
11
+ /** The result of `cloudflare({ ... })` from `@astrojs/cloudflare`. */
12
+ adapter: any;
13
+ /** The result of `react()` from `@astrojs/react`. Auto-added if the user hasn't already added `@astrojs/react`. */
14
+ reactIntegration: AstroIntegration;
15
+ /** Extra Vite resolve.alias to inject (e.g. react-dom/server -> react-dom/server.edge for React 19+ in prod). Pass `undefined` to skip. */
16
+ reactDomServerAlias: Record<string, string> | undefined;
17
+ };
18
+
19
+ /**
20
+ * Wrap the user's Astro config with Webflow Cloud's required overrides.
21
+ * `userExport` is always provided — `{}` when the user ships no astro.config.*.
22
+ *
23
+ * Top-level keys in the override block REPLACE the user's — our adapter / base /
24
+ * output need to win.
25
+ */
26
+ export function withWebflowOverrides(
27
+ userExport: AstroUserConfig,
28
+ opts: WebflowOverridesOptions,
29
+ ): AstroUserConfig {
30
+ const userIntegrations: AstroIntegration[] = userExport.integrations || [];
31
+ const hasReact = userIntegrations.some((i) => i?.name === '@astrojs/react');
32
+ const integrations = hasReact ? userIntegrations : [...userIntegrations, opts.reactIntegration];
33
+
34
+ return {
35
+ ...userExport,
36
+ base: opts.mountPath,
37
+ output: 'server',
38
+ adapter: opts.adapter,
39
+ integrations,
40
+ vite: {
41
+ ...userExport.vite,
42
+ resolve: {
43
+ ...userExport.vite?.resolve,
44
+ alias: opts.reactDomServerAlias,
45
+ },
46
+ },
47
+ build: {
48
+ assetsPrefix: opts.deployUrl + (opts.mountPath === '/' ? '' : opts.mountPath),
49
+ },
50
+ image: {
51
+ ...userExport.image,
52
+ service: {
53
+ entrypoint: './webflow-loader.ts',
54
+ config: {
55
+ deployUrl: opts.deployUrl,
56
+ mountPath: opts.mountPath,
57
+ },
58
+ },
59
+ },
60
+ };
61
+ }
@@ -0,0 +1,25 @@
1
+ // Generated by the Webflow Cloud builder. Merge logic lives in ./astro.config.webflow.ts.
2
+ import { defineConfig } from 'astro/config';
3
+ import cloudflare from '@astrojs/cloudflare';
4
+ import react from '@astrojs/react';
5
+ import userConfig from './clouduser.astro.config';
6
+ import { withWebflowOverrides } from './astro.config.webflow';
7
+
8
+ export default defineConfig(
9
+ withWebflowOverrides(userConfig, {
10
+ mountPath: '${COSMIC_MOUNT_PATH}',
11
+ deployUrl: '${COSMIC_DEPLOY_URL}',
12
+ adapter: cloudflare({
13
+ imageService: 'custom',
14
+ platformProxy: {
15
+ enabled: true,
16
+ },
17
+ }),
18
+ reactIntegration: react(),
19
+ // Use react-dom/server.edge instead of react-dom/server.browser for React 19.
20
+ // Without this, MessageChannel from node:worker_threads needs to be polyfilled.
21
+ reactDomServerAlias: import.meta.env.PROD
22
+ ? { 'react-dom/server': 'react-dom/server.edge' }
23
+ : undefined,
24
+ }),
25
+ );
@@ -0,0 +1,103 @@
1
+ import type { ExternalImageService, ImageTransform, AstroConfig } from 'astro';
2
+
3
+ function normalizeSrc(src: string, deployUrl?: string, mountPath?: string) {
4
+ // For local assets, include the mount path but not the deploy url, and remove the leading slash
5
+ if (deployUrl && src.startsWith(deployUrl)) {
6
+ return `${src.slice(deployUrl.length)}`.slice(1);
7
+ } else if (mountPath && src.startsWith(mountPath)) {
8
+ return src.slice(1);
9
+ } else if (src.startsWith('/')) {
10
+ return `${mountPath}${src}`.slice(1);
11
+ }
12
+ return src;
13
+ }
14
+
15
+ // Default implementation copied from Astro's baseService
16
+ function getTargetDimensions(options: ImageTransform) {
17
+ let targetWidth = options.width;
18
+ let targetHeight = options.height;
19
+
20
+ // For ESM imported images, calculate missing dimensions based on aspect ratio
21
+ if (typeof options.src === 'object' && 'width' in options.src && 'height' in options.src) {
22
+ const aspectRatio = options.src.width / options.src.height;
23
+ if (targetHeight && !targetWidth) {
24
+ targetWidth = Math.round(targetHeight * aspectRatio);
25
+ } else if (targetWidth && !targetHeight) {
26
+ targetHeight = Math.round(targetWidth / aspectRatio);
27
+ } else if (!targetWidth && !targetHeight) {
28
+ targetWidth = options.src.width;
29
+ targetHeight = options.src.height;
30
+ }
31
+ }
32
+
33
+ return {
34
+ targetWidth,
35
+ targetHeight,
36
+ };
37
+ }
38
+
39
+ const cloudflareLoader: ExternalImageService = {
40
+ getURL(options: ImageTransform, imageConfig: AstroConfig['image']) {
41
+ const normalizedSrc = normalizeSrc(
42
+ typeof options.src === 'object' ? options.src.src : options.src,
43
+ imageConfig.service.config.deployUrl,
44
+ imageConfig.service.config.mountPath,
45
+ );
46
+ // Our cloudflare zone doesn't allow optimizing external images for security reasons, so just load the original image
47
+ // For now, also skip optimization for images hosted on regular webflow sites (cdn.website-files.com)
48
+ // because optimizing them would result in two bandwidth charges: one from the website-files zone (for the full image)
49
+ // and one from the cosmic.webflow.services zone (for the resized image)
50
+ if (normalizedSrc.startsWith('http://') || normalizedSrc.startsWith('https://')) {
51
+ return normalizedSrc;
52
+ }
53
+
54
+ const supportedOptions = ['width', 'height', 'quality', 'format'];
55
+ const params = [];
56
+ for (const option of supportedOptions) {
57
+ if (options[option]) {
58
+ params.push(`${option}=${options[option]}`);
59
+ }
60
+ }
61
+
62
+ const workerUrl = imageConfig.service.config.deployUrl;
63
+ // Skip resizing svgs, since it doesn't do anything
64
+ const isSvg =
65
+ typeof options.src === 'object' ? options.src.format === 'svg' : options.src.endsWith('.svg');
66
+ if (isSvg || params.length === 0) {
67
+ return `${workerUrl}/${normalizedSrc}`;
68
+ }
69
+
70
+ const paramsString = params.join(',');
71
+ return `${workerUrl}/cdn-cgi/image/${paramsString}/${normalizedSrc}`;
72
+ },
73
+
74
+ // Default implementation copied from Astro's baseService
75
+ getHTMLAttributes(options: ImageTransform) {
76
+ const { targetWidth, targetHeight } = getTargetDimensions(options);
77
+ const {
78
+ src,
79
+ width,
80
+ height,
81
+ format,
82
+ quality,
83
+ densities,
84
+ widths,
85
+ formats,
86
+ layout,
87
+ priority,
88
+ fit,
89
+ position,
90
+ ...attributes
91
+ } = options;
92
+
93
+ return {
94
+ ...attributes,
95
+ width: targetWidth,
96
+ height: targetHeight,
97
+ loading: attributes.loading ?? 'lazy',
98
+ decoding: attributes.decoding ?? 'async',
99
+ };
100
+ },
101
+ };
102
+
103
+ export default cloudflareLoader;
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "cosmic-builder-dry-run",
3
+ "main": "dist/_worker.js/index.js",
4
+ "compatibility_date": "2025-03-03",
5
+ "compatibility_flags": ["nodejs_compat"]
6
+ }
@@ -0,0 +1,35 @@
1
+ // Generated by the Webflow Cloud builder. Merge logic lives in ./astro.config.webflow.ts.
2
+ import { defineConfig } from 'astro/config';
3
+ import { readFileSync } from 'node:fs';
4
+ import cloudflare from '@astrojs/cloudflare';
5
+ import react from '@astrojs/react';
6
+ import userConfig from './clouduser.astro.config';
7
+ import { withWebflowOverrides } from './astro.config.webflow';
8
+
9
+ // Detect React 19+ so we know whether to alias react-dom/server -> .edge.
10
+ let isReact19 = false;
11
+ try {
12
+ const pkg = JSON.parse(readFileSync('./package.json', 'utf8'));
13
+ const reactVersion = pkg.dependencies?.react || pkg.devDependencies?.react || '';
14
+ // Match versions like "19", "^19", "~19", "19.0.0", "^19.0.0", etc.
15
+ isReact19 = /(?:^|[^\d])19(?:\.|$)/.test(reactVersion);
16
+ } catch {
17
+ // Could not read package.json, assume not React 19.
18
+ }
19
+
20
+ export default defineConfig(
21
+ withWebflowOverrides(userConfig, {
22
+ mountPath: '${COSMIC_MOUNT_PATH}',
23
+ deployUrl: '${COSMIC_DEPLOY_URL}',
24
+ adapter: cloudflare({
25
+ imageService: 'custom',
26
+ // Note: platformProxy removed in Astro 6+ — workerd runs natively via @cloudflare/vite-plugin.
27
+ }),
28
+ reactIntegration: react(),
29
+ // Only React 19+ has react-dom/server.edge. React 18 has only .browser, which doesn't run in edge runtimes.
30
+ reactDomServerAlias:
31
+ import.meta.env.PROD && isReact19
32
+ ? { 'react-dom/server': 'react-dom/server.edge' }
33
+ : undefined,
34
+ }),
35
+ );