Skip to content

Commit d3d3401

Browse files
committed
Add a webpack flag to create next app. Ensure that if you set it or decline turbopack we set the --webpack flag on the generated project
1 parent 129e983 commit d3d3401

File tree

4 files changed

+42
-24
lines changed

4 files changed

+42
-24
lines changed

packages/create-next-app/create-app.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { getOnline } from './helpers/is-online'
1919
import { isWriteable } from './helpers/is-writeable'
2020
import { runTypegen } from './helpers/typegen'
2121

22-
import type { TemplateMode, TemplateType } from './templates'
22+
import type { Bundler, TemplateMode, TemplateType } from './templates'
2323
import { getTemplateFile, installTemplate } from './templates'
2424

2525
export class DownloadError extends Error {}
@@ -39,8 +39,7 @@ export async function createApp({
3939
skipInstall,
4040
empty,
4141
api,
42-
turbopack,
43-
rspack,
42+
bundler,
4443
disableGit,
4544
reactCompiler,
4645
}: {
@@ -58,8 +57,7 @@ export async function createApp({
5857
skipInstall: boolean
5958
empty: boolean
6059
api?: boolean
61-
turbopack: boolean
62-
rspack: boolean
60+
bundler: Bundler
6361
disableGit?: boolean
6462
reactCompiler: boolean
6563
}): Promise<void> {
@@ -252,8 +250,7 @@ export async function createApp({
252250
srcDir,
253251
importAlias,
254252
skipInstall,
255-
turbopack,
256-
rspack,
253+
bundler,
257254
reactCompiler,
258255
})
259256
}

packages/create-next-app/index.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { getPkgManager } from './helpers/get-pkg-manager'
1515
import { isFolderEmpty } from './helpers/is-folder-empty'
1616
import { validateNpmName } from './helpers/validate-pkg'
1717
import packageJson from './package.json'
18+
import { Bundler } from './templates'
1819

1920
let projectPath: string = ''
2021

@@ -54,8 +55,9 @@ const program = new Command(packageJson.name)
5455
.option('--biome', 'Initialize with Biome config.')
5556
.option('--app', 'Initialize as an App Router project.')
5657
.option('--src-dir', "Initialize inside a 'src/' directory.")
57-
.option('--turbopack', 'Enable Turbopack by default for development.')
58-
.option('--rspack', 'Using Rspack as the bundler')
58+
.option('--turbopack', 'Enable Turbopack as the bundler.')
59+
.option('--webpack', 'Enable Webpack as the bundler.')
60+
.option('--rspack', 'Enable Rspack as the bundler')
5961
.option(
6062
'--import-alias <prefix/*>',
6163
'Specify import alias to use (default "@/*").'
@@ -276,7 +278,7 @@ async function run(): Promise<void> {
276278
* Depending on the prompt response, set the appropriate program flags.
277279
*/
278280
opts.typescript = Boolean(typescript)
279-
opts.javascript = !Boolean(typescript)
281+
opts.javascript = !typescript
280282
preferences.typescript = Boolean(typescript)
281283
}
282284
}
@@ -429,7 +431,12 @@ async function run(): Promise<void> {
429431
}
430432
}
431433

432-
if (!opts.turbopack && !args.includes('--no-turbopack')) {
434+
if (
435+
!opts.turbopack &&
436+
!args.includes('--no-turbopack') &&
437+
!opts.webpack &&
438+
!opts.rspack
439+
) {
433440
if (skipPrompt) {
434441
opts.turbopack = getPrefOrDefault('turbopack')
435442
} else {
@@ -445,6 +452,9 @@ async function run(): Promise<void> {
445452
})
446453
opts.turbopack = Boolean(turbopack)
447454
preferences.turbopack = Boolean(turbopack)
455+
if (!turbopack) {
456+
opts.webpack = true
457+
}
448458
}
449459
}
450460

@@ -493,6 +503,14 @@ async function run(): Promise<void> {
493503
}
494504
}
495505

506+
const bundler: Bundler = opts.turbopack
507+
? Bundler.Turbopack
508+
: opts.webpack
509+
? Bundler.Webpack
510+
: opts.rspack
511+
? Bundler.Rspack
512+
: Bundler.Turbopack
513+
496514
try {
497515
await createApp({
498516
appPath,
@@ -509,8 +527,7 @@ async function run(): Promise<void> {
509527
skipInstall: opts.skipInstall,
510528
empty: opts.empty,
511529
api: opts.api,
512-
turbopack: opts.turbopack,
513-
rspack: opts.rspack,
530+
bundler,
514531
disableGit: opts.disableGit,
515532
reactCompiler: opts.reactCompiler,
516533
})
@@ -544,8 +561,7 @@ async function run(): Promise<void> {
544561
importAlias: opts.importAlias,
545562
skipInstall: opts.skipInstall,
546563
empty: opts.empty,
547-
turbopack: opts.turbopack,
548-
rspack: opts.rspack,
564+
bundler,
549565
disableGit: opts.disableGit,
550566
reactCompiler: opts.reactCompiler,
551567
})

packages/create-next-app/templates/index.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { cyan, bold } from "picocolors";
1010
import { Sema } from "async-sema";
1111
import pkg from "../package.json";
1212

13-
import { GetTemplateFileArgs, InstallTemplateArgs } from "./types";
13+
import { Bundler, GetTemplateFileArgs, InstallTemplateArgs } from "./types";
1414

1515
// Do not rename or format. sync-react script relies on this line.
1616
// prettier-ignore
@@ -45,8 +45,7 @@ export const installTemplate = async ({
4545
srcDir,
4646
importAlias,
4747
skipInstall,
48-
turbopack,
49-
rspack,
48+
bundler,
5049
reactCompiler,
5150
}: InstallTemplateArgs) => {
5251
console.log(bold(`Using ${packageManager}.`));
@@ -82,7 +81,7 @@ export const installTemplate = async ({
8281
},
8382
});
8483

85-
if (rspack) {
84+
if (bundler === Bundler.Rspack) {
8685
const nextConfigFile = path.join(
8786
root,
8887
mode === "js" ? "next.config.mjs" : "next.config.ts",
@@ -207,15 +206,16 @@ export const installTemplate = async ({
207206

208207
/** Copy the version from package.json or override for tests. */
209208
const version = process.env.NEXT_PRIVATE_TEST_VERSION ?? pkg.version;
209+
const bundlerFlags = `${bundler === Bundler.Turbopack ? " --turbopack" : ""}${bundler === Bundler.Webpack ? " --webpack" : ""}`;
210210

211211
/** Create a package.json for the new project and write it to disk. */
212212
const packageJson: any = {
213213
name: appName,
214214
version: "0.1.0",
215215
private: true,
216216
scripts: {
217-
dev: `next dev${turbopack ? " --turbopack" : ""}`,
218-
build: `next build${turbopack ? " --turbopack" : ""}`,
217+
dev: `next dev${bundlerFlags}`,
218+
build: `next build${bundlerFlags}`,
219219
start: "next start",
220220
...(eslint && { lint: "eslint" }),
221221
...(biome && { lint: "biome check", format: "biome format --write" }),
@@ -231,7 +231,7 @@ export const installTemplate = async ({
231231
devDependencies: {},
232232
};
233233

234-
if (rspack) {
234+
if (bundler === Bundler.Rspack) {
235235
const NEXT_PRIVATE_TEST_VERSION = process.env.NEXT_PRIVATE_TEST_VERSION;
236236
if (
237237
NEXT_PRIVATE_TEST_VERSION &&

packages/create-next-app/templates/types.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ export interface InstallTemplateArgs {
3131
srcDir: boolean;
3232
importAlias: string;
3333
skipInstall: boolean;
34-
turbopack: boolean;
35-
rspack: boolean;
34+
bundler: Bundler;
3635
reactCompiler: boolean;
3736
}
37+
38+
export enum Bundler {
39+
Turbopack = "turbopack",
40+
Webpack = "webpack",
41+
Rspack = "rspack",
42+
}

0 commit comments

Comments
 (0)