Skip to content

Commit 2ceab89

Browse files
committed
Validate deployment choice before scaffolding a project.
1 parent 4a7595d commit 2ceab89

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

‎packages/void/src/cli/init.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,6 +2780,11 @@ export async function runInitCommand(root: string, initArgs?: InitArgs): Promise
27802780
scaffoldedPagesFramework = await promptScaffoldFramework(initArgs?.framework);
27812781
}
27822782
const starterMode = await promptStarterMode(initArgs?.starter);
2783+
// A partial starter takes the existing-project path on retry, so check
2784+
// the last required flag before creating its files.
2785+
if (initArgs?.deploy === undefined) {
2786+
assertInteractive('deploy', DEPLOYMENT_PLATFORMS);
2787+
}
27832788
const existingPackageJson = readPackageJson(root);
27842789
const hasPackageManager =
27852790
hasLocalLockfile(root) ||

‎packages/void/test/unit/init.test.ts‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,27 @@ describe('init scaffold arguments', () => {
196196
rmSync(root, { recursive: true, force: true });
197197
}
198198
});
199+
200+
it('keeps a missing deployment choice retryable without a terminal', async () => {
201+
const root = mkdtempSync(join(tmpdir(), 'void-init-flags-retry-'));
202+
const flags = ['--toolchain', 'vite', '--framework', 'react', '--starter', 'static'];
203+
try {
204+
Object.defineProperty(process.stdin, 'isTTY', { configurable: true, get: () => false });
205+
await expect(runInitCommand(root, parseInitArgs(flags))).rejects.toThrow(
206+
'init: Pass --deploy (cloudflare, void, none) when running without an interactive terminal.',
207+
);
208+
expect(readdirSync(root)).toEqual([]);
209+
expect(mockSpawnSync).not.toHaveBeenCalled();
210+
expect(mockSelect).not.toHaveBeenCalled();
211+
212+
await runInitCommand(root, parseInitArgs([...flags, '--deploy', 'none']));
213+
expect(mockSelect).not.toHaveBeenCalled();
214+
expect(existsSync(join(root, 'pages', 'index.tsx'))).toBe(true);
215+
expect(readDeploymentPlatform(root)).toBe('none');
216+
} finally {
217+
rmSync(root, { recursive: true, force: true });
218+
}
219+
});
199220
});
200221

201222
describe('GitHub Actions deployment workflows', () => {

0 commit comments

Comments
 (0)