diff --git a/.changeset/277351.md b/.changeset/277351.md new file mode 100644 index 0000000000..ca6777a146 --- /dev/null +++ b/.changeset/277351.md @@ -0,0 +1,5 @@ +--- +'create-t3-app': minor +--- + +feat: add option to ignore build errors diff --git a/cli/src/cli/index.ts b/cli/src/cli/index.ts index 013c4c36ea..754ae3ac63 100644 --- a/cli/src/cli/index.ts +++ b/cli/src/cli/index.ts @@ -41,6 +41,8 @@ interface CliFlags { eslint: boolean; /** @internal Used in CI */ biome: boolean; + /** @internal Used in CI */ + ignoreBuildErrors: boolean; } interface CliResults { @@ -68,6 +70,7 @@ const defaultOptions: CliResults = { dbProvider: "sqlite", eslint: false, biome: false, + ignoreBuildErrors: false, }, databaseProvider: "sqlite", }; @@ -161,6 +164,11 @@ export const runCli = async (): Promise => { "Experimental: Boolean value if we should install biome. Must be used in conjunction with `--CI`.", (value) => !!value && value !== "false" ) + .option( + "--ignoreBuildErrors [boolean]", + "Experimental: Boolean value if we should ignore TypeScript and ESLint build errors. Must be used in conjunction with `--CI`.", + (value) => !!value && value !== "false" + ) /** END CI-FLAGS */ .version(getVersion(), "-v, --version", "Display the version number") .addHelpText( @@ -201,6 +209,8 @@ export const runCli = async (): Promise => { if (cliResults.flags.nextAuth) cliResults.packages.push("nextAuth"); if (cliResults.flags.eslint) cliResults.packages.push("eslint"); if (cliResults.flags.biome) cliResults.packages.push("biome"); + cliResults.flags.ignoreBuildErrors = + cliResults.flags.ignoreBuildErrors ?? false; if (cliResults.flags.prisma && cliResults.flags.drizzle) { // We test a matrix of all possible combination of packages in CI. Checking for impossible // combinations here and exiting gracefully is easier than changing the CI matrix to exclude @@ -333,6 +343,13 @@ export const runCli = async (): Promise => { initialValue: "eslint", }); }, + ignoreBuildErrors: () => { + return p.confirm({ + message: + "Would you like to ignore TypeScript and ESLint build errors?", + initialValue: false, + }); + }, ...(!cliResults.flags.noGit && { git: () => { return p.confirm({ @@ -388,6 +405,8 @@ export const runCli = async (): Promise => { noGit: !project.git || cliResults.flags.noGit, noInstall: !project.install || cliResults.flags.noInstall, importAlias: project.importAlias ?? cliResults.flags.importAlias, + ignoreBuildErrors: + project.ignoreBuildErrors ?? cliResults.flags.ignoreBuildErrors, }, }; } catch (err) { diff --git a/cli/src/helpers/createProject.ts b/cli/src/helpers/createProject.ts index 81b385485f..a92f1e91e2 100644 --- a/cli/src/helpers/createProject.ts +++ b/cli/src/helpers/createProject.ts @@ -24,8 +24,32 @@ interface CreateProjectOptions { importAlias: string; appRouter: boolean; databaseProvider: DatabaseProvider; + ignoreBuildErrors: boolean; } +const updateNextConfigWithIgnoreOptions = (projectDir: string) => { + const nextConfigPath = path.join(projectDir, "next.config.js"); + + if (!fs.existsSync(nextConfigPath)) { + return; + } + + const configContent = fs.readFileSync(nextConfigPath, "utf-8"); + + // Find the config object and add the ignore options + const configWithIgnores = configContent.replace( + /const config = {([^}]*)};/, + `const config = {$1 typescript: { + ignoreBuildErrors: true, + }, + eslint: { + ignoreDuringBuilds: true, + },};` + ); + + fs.writeFileSync(nextConfigPath, configWithIgnores); +}; + export const createProject = async ({ projectName, scopedAppName, @@ -33,6 +57,7 @@ export const createProject = async ({ noInstall, appRouter, databaseProvider, + ignoreBuildErrors, }: CreateProjectOptions) => { const pkgManager = getUserPkgManager(); const projectDir = path.resolve(process.cwd(), projectName); @@ -75,6 +100,11 @@ export const createProject = async ({ selectIndexFile({ projectDir, packages }); } + // Add ignore build errors configuration if selected + if (ignoreBuildErrors) { + updateNextConfigWithIgnoreOptions(projectDir); + } + // If no tailwind, select use css modules if (!packages.tailwind.inUse) { const indexModuleCss = path.join( diff --git a/cli/src/index.ts b/cli/src/index.ts index 1cd6a85413..868ac82072 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -39,7 +39,7 @@ const main = async () => { const { appName, packages, - flags: { noGit, noInstall, importAlias, appRouter }, + flags: { noGit, noInstall, importAlias, appRouter, ignoreBuildErrors }, databaseProvider, } = await runCli(); @@ -56,6 +56,7 @@ const main = async () => { importAlias, noInstall, appRouter, + ignoreBuildErrors, }); // Write name to package.json