Skip to content

Commit dd4e888

Browse files
dependabot[bot]Wrangler automated PR updaterpetebacondarwin
authored
[C3] Bump create-vike from 0.0.599 to 0.0.616 in /packages/create-cloudflare/src/frameworks (#13438)
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Wrangler automated PR updater <wrangler@cloudflare.com> Co-authored-by: Pete Bacon Darwin <pbacondarwin@cloudflare.com>
1 parent 4e4d146 commit dd4e888

6 files changed

Lines changed: 433 additions & 12 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
"create-cloudflare": patch
3+
---
4+
5+
Update dependencies of "create-cloudflare"
6+
7+
The following dependency versions have been updated:
8+
9+
| Dependency | From | To |
10+
| ----------- | ------- | ------- |
11+
| create-vike | 0.0.599 | 0.0.616 |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
"wrangler": patch
3+
---
4+
5+
fix: handle Vike config files that use a variable-referenced default export
6+
7+
Newer versions of `create-vike` (0.0.616+) generate `pages/+config.ts` files using `const config: Config = { ... }; export default config;` instead of the previous `export default { ... } satisfies Config;`. The Wrangler autoconfig AST transformation now resolves `Identifier` exports to their variable declarations, supporting both old and new Vike config file formats.

fixtures/workers-with-assets-spa/tests/index.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ describe("Workers + Assets + SPA", () => {
4343
await page.goto("/");
4444
if (process.platform === "darwin") {
4545
// different platforms render the page differently (fonts?)
46-
expect(await page.screenshot()).toMatchImageSnapshot();
46+
expect(await page.screenshot()).toMatchImageSnapshot({
47+
failureThreshold: 0.02,
48+
failureThresholdType: "percent",
49+
});
4750
}
4851

4952
const mathResultLocator = page.getByText("1 + 1 = 2");

packages/create-cloudflare/src/frameworks/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"create-react-router": "7.14.0",
1313
"create-rwsdk": "3.1.3",
1414
"create-solid": "0.7.0",
15-
"create-vike": "0.0.599",
15+
"create-vike": "0.0.616",
1616
"create-vite": "8.3.0",
1717
"create-vue": "3.22.2",
1818
"create-waku": "0.12.5-1.0.0-alpha.6-0",
Lines changed: 322 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
import { mkdir, readFile, writeFile } from "node:fs/promises";
2+
import { resolve } from "node:path";
3+
import * as cliPackages from "@cloudflare/cli/packages";
4+
import { beforeEach, describe, it, vi } from "vitest";
5+
import { Vike } from "../../../autoconfig/frameworks/vike";
6+
import { NpmPackageManager } from "../../../package-manager";
7+
import { runInTempDir } from "../../helpers/run-in-tmp";
8+
9+
vi.mock("../../../autoconfig/frameworks/utils/packages", () => ({
10+
isPackageInstalled: () => false,
11+
}));
12+
13+
vi.mock("../../../autoconfig/frameworks/utils/vite-plugin", () => ({
14+
installCloudflareVitePlugin: async () => {},
15+
}));
16+
17+
function getBaseOptions() {
18+
return {
19+
projectPath: process.cwd(),
20+
workerName: "my-vike-app",
21+
outputDir: "",
22+
dryRun: false,
23+
packageManager: NpmPackageManager,
24+
isWorkspaceRoot: false,
25+
};
26+
}
27+
28+
describe("Vike framework configure()", () => {
29+
runInTempDir();
30+
31+
beforeEach(() => {
32+
vi.spyOn(cliPackages, "installPackages").mockImplementation(async () => {});
33+
});
34+
35+
describe("config file transformation", () => {
36+
it("handles the old format: `export default { ... } satisfies Config`", async ({
37+
expect,
38+
}) => {
39+
await mkdir(resolve("pages"), { recursive: true });
40+
await writeFile(
41+
resolve("pages/+config.ts"),
42+
`import type { Config } from "vike/types";
43+
import vikeReact from "vike-react/config";
44+
45+
// Default config (can be overridden by pages)
46+
// https://vike.dev/config
47+
48+
export default {
49+
// https://vike.dev/head-tags
50+
title: "My Vike App",
51+
description: "Demo showcasing Vike",
52+
53+
extends: [vikeReact],
54+
} satisfies Config;
55+
`
56+
);
57+
58+
const framework = new Vike({ id: "vike", name: "Vike" });
59+
await framework.configure(getBaseOptions());
60+
61+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
62+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
63+
expect(result).toContain("extends: [vikeReact, vikePhoton]");
64+
});
65+
66+
it("handles the new format: `const config: Config = { ... }; export default config;`", async ({
67+
expect,
68+
}) => {
69+
await mkdir(resolve("pages"), { recursive: true });
70+
await writeFile(
71+
resolve("pages/+config.ts"),
72+
`import type { Config } from "vike/types";
73+
import vikeReact from "vike-react/config";
74+
75+
// Default config (can be overridden by pages)
76+
// https://vike.dev/config
77+
78+
const config: Config = {
79+
// https://vike.dev/head-tags
80+
title: "My Vike App",
81+
description: "Demo showcasing Vike",
82+
83+
extends: [vikeReact],
84+
};
85+
86+
export default config;
87+
`
88+
);
89+
90+
const framework = new Vike({ id: "vike", name: "Vike" });
91+
await framework.configure(getBaseOptions());
92+
93+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
94+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
95+
expect(result).toContain("extends: [vikeReact, vikePhoton]");
96+
});
97+
98+
it("handles plain format: `export default { ... }`", async ({ expect }) => {
99+
await mkdir(resolve("pages"), { recursive: true });
100+
await writeFile(
101+
resolve("pages/+config.ts"),
102+
`import vikeReact from "vike-react/config";
103+
104+
export default {
105+
title: "My Vike App",
106+
extends: [vikeReact],
107+
};
108+
`
109+
);
110+
111+
const framework = new Vike({ id: "vike", name: "Vike" });
112+
await framework.configure(getBaseOptions());
113+
114+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
115+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
116+
expect(result).toContain("extends: [vikeReact, vikePhoton]");
117+
});
118+
119+
it("handles `export default { ... } as Config` format", async ({
120+
expect,
121+
}) => {
122+
await mkdir(resolve("pages"), { recursive: true });
123+
await writeFile(
124+
resolve("pages/+config.ts"),
125+
`import type { Config } from "vike/types";
126+
import vikeReact from "vike-react/config";
127+
128+
export default {
129+
title: "My Vike App",
130+
extends: [vikeReact],
131+
} as Config;
132+
`
133+
);
134+
135+
const framework = new Vike({ id: "vike", name: "Vike" });
136+
await framework.configure(getBaseOptions());
137+
138+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
139+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
140+
expect(result).toContain("extends: [vikeReact, vikePhoton]");
141+
});
142+
143+
it("creates extends array if not present", async ({ expect }) => {
144+
await mkdir(resolve("pages"), { recursive: true });
145+
await writeFile(
146+
resolve("pages/+config.ts"),
147+
`import vikeReact from "vike-react/config";
148+
149+
export default {
150+
title: "My Vike App",
151+
};
152+
`
153+
);
154+
155+
const framework = new Vike({ id: "vike", name: "Vike" });
156+
await framework.configure(getBaseOptions());
157+
158+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
159+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
160+
expect(result).toContain("extends: [vikePhoton]");
161+
});
162+
163+
it("creates extends array on variable-referenced config if not present", async ({
164+
expect,
165+
}) => {
166+
await mkdir(resolve("pages"), { recursive: true });
167+
await writeFile(
168+
resolve("pages/+config.ts"),
169+
`import type { Config } from "vike/types";
170+
171+
const config: Config = {
172+
title: "My Vike App",
173+
};
174+
175+
export default config;
176+
`
177+
);
178+
179+
const framework = new Vike({ id: "vike", name: "Vike" });
180+
await framework.configure(getBaseOptions());
181+
182+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
183+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
184+
expect(result).toContain("extends: [vikePhoton]");
185+
});
186+
187+
it("does not duplicate import or extends entry on repeated calls", async ({
188+
expect,
189+
}) => {
190+
await mkdir(resolve("pages"), { recursive: true });
191+
await writeFile(
192+
resolve("pages/+config.ts"),
193+
`import vikeReact from "vike-react/config";
194+
import vikePhoton from "vike-photon/config";
195+
196+
export default {
197+
title: "My Vike App",
198+
extends: [vikeReact, vikePhoton],
199+
};
200+
`
201+
);
202+
203+
const framework = new Vike({ id: "vike", name: "Vike" });
204+
await framework.configure(getBaseOptions());
205+
206+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
207+
208+
const importCount = (
209+
result.match(/import vikePhoton from "vike-photon\/config"/g) || []
210+
).length;
211+
expect(importCount).toBe(1);
212+
213+
// Verify the extends array wasn't duplicated either
214+
expect(result).toContain("extends: [vikeReact, vikePhoton]");
215+
});
216+
217+
it("does not duplicate extends entry when vike-photon is imported under a different name", async ({
218+
expect,
219+
}) => {
220+
await mkdir(resolve("pages"), { recursive: true });
221+
await writeFile(
222+
resolve("pages/+config.ts"),
223+
`import vikeReact from "vike-react/config";
224+
import photon from "vike-photon/config";
225+
226+
export default {
227+
title: "My Vike App",
228+
extends: [vikeReact, photon],
229+
};
230+
`
231+
);
232+
233+
const framework = new Vike({ id: "vike", name: "Vike" });
234+
await framework.configure(getBaseOptions());
235+
236+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
237+
238+
// Should not add a second import
239+
const importCount = (result.match(/from "vike-photon\/config"/g) || [])
240+
.length;
241+
expect(importCount).toBe(1);
242+
243+
// Should not duplicate the extends entry under any name
244+
expect(result).toContain("extends: [vikeReact, photon]");
245+
expect(result).not.toContain("vikePhoton");
246+
});
247+
248+
it("uses .js config file as fallback", async ({ expect }) => {
249+
await mkdir(resolve("pages"), { recursive: true });
250+
await writeFile(
251+
resolve("pages/+config.js"),
252+
`import vikeReact from "vike-react/config";
253+
254+
export default {
255+
title: "My Vike App",
256+
extends: [vikeReact],
257+
};
258+
`
259+
);
260+
261+
const framework = new Vike({ id: "vike", name: "Vike" });
262+
await framework.configure(getBaseOptions());
263+
264+
const result = await readFile(resolve("pages/+config.js"), "utf8");
265+
expect(result).toContain('import vikePhoton from "vike-photon/config";');
266+
expect(result).toContain("extends: [vikeReact, vikePhoton]");
267+
});
268+
});
269+
270+
describe("configure() return value", () => {
271+
beforeEach(async () => {
272+
await mkdir(resolve("pages"), { recursive: true });
273+
await writeFile(
274+
resolve("pages/+config.ts"),
275+
`import vikeReact from "vike-react/config";
276+
277+
export default {
278+
extends: [vikeReact],
279+
};
280+
`
281+
);
282+
});
283+
284+
it("returns correct wranglerConfig", async ({ expect }) => {
285+
const framework = new Vike({ id: "vike", name: "Vike" });
286+
const result = await framework.configure(getBaseOptions());
287+
288+
expect(result.wranglerConfig).toEqual({
289+
main: "virtual:photon:cloudflare:server-entry",
290+
});
291+
});
292+
293+
it("returns correct packageJsonScriptsOverrides", async ({ expect }) => {
294+
const framework = new Vike({ id: "vike", name: "Vike" });
295+
const result = await framework.configure(getBaseOptions());
296+
297+
expect(result.packageJsonScriptsOverrides).toEqual({
298+
preview: "vike build && vike preview",
299+
deploy: "vike build && wrangler deploy",
300+
});
301+
});
302+
});
303+
304+
describe("dryRun mode", () => {
305+
it("does not modify config file in dryRun mode", async ({ expect }) => {
306+
await mkdir(resolve("pages"), { recursive: true });
307+
const originalContent = `import vikeReact from "vike-react/config";
308+
309+
export default {
310+
extends: [vikeReact],
311+
};
312+
`;
313+
await writeFile(resolve("pages/+config.ts"), originalContent);
314+
315+
const framework = new Vike({ id: "vike", name: "Vike" });
316+
await framework.configure({ ...getBaseOptions(), dryRun: true });
317+
318+
const result = await readFile(resolve("pages/+config.ts"), "utf8");
319+
expect(result).toBe(originalContent);
320+
});
321+
});
322+
});

0 commit comments

Comments
 (0)