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

481 lines
12 KiB
TypeScript
Raw Normal View History

#!/usr/bin/env node
/* eslint-disable import/no-extraneous-dependencies */
import chalk from 'chalk'
import Commander from 'commander'
import Conf from 'conf'
import path from 'path'
import prompts from 'prompts'
import checkForUpdate from 'update-check'
import { createApp, DownloadError } from './create-app'
import { getPkgManager } from './helpers/get-pkg-manager'
import { validateNpmName } from './helpers/validate-pkg'
import packageJson from './package.json'
feat(create-next-app): JS/TS prompt (with appDir support); enhanced testing (#42012) Resubmitting this PR following this comment from Tim. This work has been done already and we can build off of it to get this in faster. > Just to be clear we're planning to rework create-next-app to give you the option to choose between JavaScript or TypeScript so it'll solve this request. For `app` right now it'll stay TypeScript till that is implemented. > > _Originally posted by @timneutkens in https://github.com/vercel/next.js/discussions/41745#discussioncomment-3985833_ --- I added the `--ts, --typescript` flag to `create-next-app` in https://github.com/vercel/next.js/pull/24655, and since then I have seen it used very frequently, including in recent issues (such as https://github.com/vercel/next.js/issues/33314) and most Next.js tutorials on YouTube. I noticed the template logic added in this PR was also used to add the `appDir` configuration as well. We discussed a while ago adding the following user flow: - `create-next-app --js, --javascript` creates a JS project - `create-next-app --ts, --typescript` creates a TS project - `create-next-app [name]` (no `--js, --ts`) prompts the user to choose either JS or TS, with TS selected by default. ### Review Adding support for appDir and refactoring the templates brought the pain-of-review up a bit, but it's not so bad when broken into increments. The original 8-file diff is here: https://github.com/ctjlewis/next.js/commit/1f47d9b0bf5b2c59dce893ca6634c1a9bfd3dd19 And the PR that brought the diff up to 59 files (mostly owed to `app` template dirs and file structure refactors): https://github.com/ctjlewis/next.js/commit/bd3ae4afd31f787dd41df2c6ab2e8145deef2138 ([PR link](https://github.com/ctjlewis/next.js/pull/3/files)) ### Demo https://user-images.githubusercontent.com/1657236/198586216-4691ff4c-48d4-4c6c-b7c1-705c38dd0194.mov Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
2022-10-31 06:43:39 +01:00
import ciInfo from 'ci-info'
import { isFolderEmpty } from './helpers/is-folder-empty'
import fs from 'fs'
let projectPath: string = ''
const handleSigTerm = () => process.exit(0)
process.on('SIGINT', handleSigTerm)
process.on('SIGTERM', handleSigTerm)
const onPromptState = (state: any) => {
if (state.aborted) {
// If we don't re-enable the terminal cursor before exiting
// the program, the cursor will remain hidden
process.stdout.write('\x1B[?25h')
process.stdout.write('\n')
process.exit(1)
}
}
const program = new Commander.Command(packageJson.name)
.version(packageJson.version)
.arguments('<project-directory>')
.usage(`${chalk.green('<project-directory>')} [options]`)
2020-05-18 21:24:37 +02:00
.action((name) => {
projectPath = name
})
.option(
'--ts, --typescript',
`
feat(create-next-app): JS/TS prompt (with appDir support); enhanced testing (#42012) Resubmitting this PR following this comment from Tim. This work has been done already and we can build off of it to get this in faster. > Just to be clear we're planning to rework create-next-app to give you the option to choose between JavaScript or TypeScript so it'll solve this request. For `app` right now it'll stay TypeScript till that is implemented. > > _Originally posted by @timneutkens in https://github.com/vercel/next.js/discussions/41745#discussioncomment-3985833_ --- I added the `--ts, --typescript` flag to `create-next-app` in https://github.com/vercel/next.js/pull/24655, and since then I have seen it used very frequently, including in recent issues (such as https://github.com/vercel/next.js/issues/33314) and most Next.js tutorials on YouTube. I noticed the template logic added in this PR was also used to add the `appDir` configuration as well. We discussed a while ago adding the following user flow: - `create-next-app --js, --javascript` creates a JS project - `create-next-app --ts, --typescript` creates a TS project - `create-next-app [name]` (no `--js, --ts`) prompts the user to choose either JS or TS, with TS selected by default. ### Review Adding support for appDir and refactoring the templates brought the pain-of-review up a bit, but it's not so bad when broken into increments. The original 8-file diff is here: https://github.com/ctjlewis/next.js/commit/1f47d9b0bf5b2c59dce893ca6634c1a9bfd3dd19 And the PR that brought the diff up to 59 files (mostly owed to `app` template dirs and file structure refactors): https://github.com/ctjlewis/next.js/commit/bd3ae4afd31f787dd41df2c6ab2e8145deef2138 ([PR link](https://github.com/ctjlewis/next.js/pull/3/files)) ### Demo https://user-images.githubusercontent.com/1657236/198586216-4691ff4c-48d4-4c6c-b7c1-705c38dd0194.mov Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
2022-10-31 06:43:39 +01:00
Initialize as a TypeScript project. (default)
`
)
.option(
'--js, --javascript',
`
Initialize as a JavaScript project.
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
`
)
.option(
'--tailwind',
`
Initialize with Tailwind CSS config. (default)
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
`
)
.option(
'--eslint',
`
Initialize with eslint config.
`
)
.option(
'--experimental-app',
`
Initialize as a \`app/\` directory project.
`
)
.option(
'--src-dir',
`
Initialize inside a \`src/\` directory.
`
)
.option(
'--import-alias <alias-to-configure>',
`
Specify import alias to use (default "@/*").
`
)
.option(
'--use-npm',
`
Explicitly tell the CLI to bootstrap the app using npm
`
)
.option(
'--use-pnpm',
`
Explicitly tell the CLI to bootstrap the app using pnpm
`
)
.option(
'-e, --example [name]|[github-url]',
`
An example to bootstrap the app with. You can use an example name
from the official Next.js repo or a GitHub URL. The URL can use
any branch and/or subdirectory
`
)
.option(
'--example-path <path-to-example>',
`
In a rare case, your GitHub URL might contain a branch name with
a slash (e.g. bug/fix-1) and the path to the example (e.g. foo/bar).
In this case, you must specify the path to the example separately:
--example-path foo/bar
`
)
.option(
'--reset-preferences',
`
Explicitly tell the CLI to reset any stored preferences
`
)
.allowUnknownOption()
.parse(process.argv)
const packageManager = !!program.useNpm
? 'npm'
: !!program.usePnpm
? 'pnpm'
: getPkgManager()
async function run(): Promise<void> {
const conf = new Conf({ projectName: 'create-next-app' })
if (program.resetPreferences) {
conf.clear()
console.log(`Preferences reset successfully`)
return
}
if (typeof projectPath === 'string') {
projectPath = projectPath.trim()
}
if (!projectPath) {
const res = await prompts({
onState: onPromptState,
type: 'text',
name: 'path',
message: 'What is your project named?',
initial: 'my-app',
2020-05-18 21:24:37 +02:00
validate: (name) => {
const validation = validateNpmName(path.basename(path.resolve(name)))
if (validation.valid) {
return true
}
return 'Invalid project name: ' + validation.problems![0]
},
})
if (typeof res.path === 'string') {
projectPath = res.path.trim()
}
}
if (!projectPath) {
console.log(
'\nPlease specify the project directory:\n' +
` ${chalk.cyan(program.name())} ${chalk.green(
'<project-directory>'
)}\n` +
'For example:\n' +
` ${chalk.cyan(program.name())} ${chalk.green('my-next-app')}\n\n` +
`Run ${chalk.cyan(`${program.name()} --help`)} to see all options.`
)
process.exit(1)
}
const resolvedProjectPath = path.resolve(projectPath)
const projectName = path.basename(resolvedProjectPath)
const { valid, problems } = validateNpmName(projectName)
if (!valid) {
console.error(
`Could not create a project called ${chalk.red(
`"${projectName}"`
)} because of npm naming restrictions:`
)
2020-05-18 21:24:37 +02:00
problems!.forEach((p) => console.error(` ${chalk.red.bold('*')} ${p}`))
process.exit(1)
}
if (program.example === true) {
console.error(
'Please provide an example name or url, otherwise remove the example option.'
)
process.exit(1)
}
/**
* Verify the project dir is empty or doesn't exist
*/
const root = path.resolve(resolvedProjectPath)
const appName = path.basename(root)
const folderExists = fs.existsSync(root)
if (folderExists && !isFolderEmpty(root, appName)) {
process.exit(1)
}
const example = typeof program.example === 'string' && program.example.trim()
const preferences = (conf.get('preferences') || {}) as Record<
string,
boolean | string
>
feat(create-next-app): JS/TS prompt (with appDir support); enhanced testing (#42012) Resubmitting this PR following this comment from Tim. This work has been done already and we can build off of it to get this in faster. > Just to be clear we're planning to rework create-next-app to give you the option to choose between JavaScript or TypeScript so it'll solve this request. For `app` right now it'll stay TypeScript till that is implemented. > > _Originally posted by @timneutkens in https://github.com/vercel/next.js/discussions/41745#discussioncomment-3985833_ --- I added the `--ts, --typescript` flag to `create-next-app` in https://github.com/vercel/next.js/pull/24655, and since then I have seen it used very frequently, including in recent issues (such as https://github.com/vercel/next.js/issues/33314) and most Next.js tutorials on YouTube. I noticed the template logic added in this PR was also used to add the `appDir` configuration as well. We discussed a while ago adding the following user flow: - `create-next-app --js, --javascript` creates a JS project - `create-next-app --ts, --typescript` creates a TS project - `create-next-app [name]` (no `--js, --ts`) prompts the user to choose either JS or TS, with TS selected by default. ### Review Adding support for appDir and refactoring the templates brought the pain-of-review up a bit, but it's not so bad when broken into increments. The original 8-file diff is here: https://github.com/ctjlewis/next.js/commit/1f47d9b0bf5b2c59dce893ca6634c1a9bfd3dd19 And the PR that brought the diff up to 59 files (mostly owed to `app` template dirs and file structure refactors): https://github.com/ctjlewis/next.js/commit/bd3ae4afd31f787dd41df2c6ab2e8145deef2138 ([PR link](https://github.com/ctjlewis/next.js/pull/3/files)) ### Demo https://user-images.githubusercontent.com/1657236/198586216-4691ff4c-48d4-4c6c-b7c1-705c38dd0194.mov Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
2022-10-31 06:43:39 +01:00
/**
* If the user does not provide the necessary flags, prompt them for whether
* to use TS or JS.
*/
if (!example) {
const defaults: typeof preferences = {
typescript: true,
eslint: true,
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
tailwind: true,
srcDir: false,
importAlias: '@/*',
}
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
const getPrefOrDefault = (field: string) =>
preferences[field] ?? defaults[field]
if (!program.typescript && !program.javascript) {
if (ciInfo.isCI) {
// default to JavaScript in CI as we can't prompt to
// prevent breaking setup flows
program.typescript = false
program.javascript = true
} else {
const styledTypeScript = chalk.hex('#007acc')('TypeScript')
const { typescript } = await prompts(
{
type: 'toggle',
name: 'typescript',
message: `Would you like to use ${styledTypeScript} with this project?`,
initial: getPrefOrDefault('typescript'),
active: 'Yes',
inactive: 'No',
feat(create-next-app): JS/TS prompt (with appDir support); enhanced testing (#42012) Resubmitting this PR following this comment from Tim. This work has been done already and we can build off of it to get this in faster. > Just to be clear we're planning to rework create-next-app to give you the option to choose between JavaScript or TypeScript so it'll solve this request. For `app` right now it'll stay TypeScript till that is implemented. > > _Originally posted by @timneutkens in https://github.com/vercel/next.js/discussions/41745#discussioncomment-3985833_ --- I added the `--ts, --typescript` flag to `create-next-app` in https://github.com/vercel/next.js/pull/24655, and since then I have seen it used very frequently, including in recent issues (such as https://github.com/vercel/next.js/issues/33314) and most Next.js tutorials on YouTube. I noticed the template logic added in this PR was also used to add the `appDir` configuration as well. We discussed a while ago adding the following user flow: - `create-next-app --js, --javascript` creates a JS project - `create-next-app --ts, --typescript` creates a TS project - `create-next-app [name]` (no `--js, --ts`) prompts the user to choose either JS or TS, with TS selected by default. ### Review Adding support for appDir and refactoring the templates brought the pain-of-review up a bit, but it's not so bad when broken into increments. The original 8-file diff is here: https://github.com/ctjlewis/next.js/commit/1f47d9b0bf5b2c59dce893ca6634c1a9bfd3dd19 And the PR that brought the diff up to 59 files (mostly owed to `app` template dirs and file structure refactors): https://github.com/ctjlewis/next.js/commit/bd3ae4afd31f787dd41df2c6ab2e8145deef2138 ([PR link](https://github.com/ctjlewis/next.js/pull/3/files)) ### Demo https://user-images.githubusercontent.com/1657236/198586216-4691ff4c-48d4-4c6c-b7c1-705c38dd0194.mov Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
2022-10-31 06:43:39 +01:00
},
{
/**
* User inputs Ctrl+C or Ctrl+D to exit the prompt. We should close the
* process and not write to the file system.
*/
onCancel: () => {
console.error('Exiting.')
process.exit(1)
},
}
)
/**
* Depending on the prompt response, set the appropriate program flags.
*/
program.typescript = Boolean(typescript)
program.javascript = !Boolean(typescript)
preferences.typescript = Boolean(typescript)
}
}
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
if (
!process.argv.includes('--eslint') &&
!process.argv.includes('--no-eslint')
) {
if (ciInfo.isCI) {
program.eslint = true
} else {
const styledEslint = chalk.hex('#007acc')('ESLint')
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
const { eslint } = await prompts({
onState: onPromptState,
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
type: 'toggle',
name: 'eslint',
message: `Would you like to use ${styledEslint} with this project?`,
initial: getPrefOrDefault('eslint'),
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
active: 'Yes',
inactive: 'No',
})
program.eslint = Boolean(eslint)
preferences.eslint = Boolean(eslint)
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
}
feat(create-next-app): JS/TS prompt (with appDir support); enhanced testing (#42012) Resubmitting this PR following this comment from Tim. This work has been done already and we can build off of it to get this in faster. > Just to be clear we're planning to rework create-next-app to give you the option to choose between JavaScript or TypeScript so it'll solve this request. For `app` right now it'll stay TypeScript till that is implemented. > > _Originally posted by @timneutkens in https://github.com/vercel/next.js/discussions/41745#discussioncomment-3985833_ --- I added the `--ts, --typescript` flag to `create-next-app` in https://github.com/vercel/next.js/pull/24655, and since then I have seen it used very frequently, including in recent issues (such as https://github.com/vercel/next.js/issues/33314) and most Next.js tutorials on YouTube. I noticed the template logic added in this PR was also used to add the `appDir` configuration as well. We discussed a while ago adding the following user flow: - `create-next-app --js, --javascript` creates a JS project - `create-next-app --ts, --typescript` creates a TS project - `create-next-app [name]` (no `--js, --ts`) prompts the user to choose either JS or TS, with TS selected by default. ### Review Adding support for appDir and refactoring the templates brought the pain-of-review up a bit, but it's not so bad when broken into increments. The original 8-file diff is here: https://github.com/ctjlewis/next.js/commit/1f47d9b0bf5b2c59dce893ca6634c1a9bfd3dd19 And the PR that brought the diff up to 59 files (mostly owed to `app` template dirs and file structure refactors): https://github.com/ctjlewis/next.js/commit/bd3ae4afd31f787dd41df2c6ab2e8145deef2138 ([PR link](https://github.com/ctjlewis/next.js/pull/3/files)) ### Demo https://user-images.githubusercontent.com/1657236/198586216-4691ff4c-48d4-4c6c-b7c1-705c38dd0194.mov Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
2022-10-31 06:43:39 +01:00
}
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
if (
!process.argv.includes('--tailwind') &&
!process.argv.includes('--no-tailwind')
) {
if (ciInfo.isCI) {
program.tailwind = false
} else {
const tw = chalk.hex('#007acc')('Tailwind CSS')
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
const { tailwind } = await prompts({
onState: onPromptState,
type: 'toggle',
name: 'tailwind',
message: `Would you like to use ${tw} with this project?`,
initial: getPrefOrDefault('tailwind'),
active: 'Yes',
inactive: 'No',
})
program.tailwind = Boolean(tailwind)
preferences.tailwind = Boolean(tailwind)
}
}
if (
!process.argv.includes('--src-dir') &&
!process.argv.includes('--no-src-dir')
) {
if (ciInfo.isCI) {
program.srcDir = false
} else {
const styledSrcDir = chalk.hex('#007acc')('`src/` directory')
const { srcDir } = await prompts({
onState: onPromptState,
type: 'toggle',
name: 'srcDir',
message: `Would you like to use ${styledSrcDir} with this project?`,
initial: getPrefOrDefault('srcDir'),
active: 'Yes',
inactive: 'No',
})
program.srcDir = Boolean(srcDir)
preferences.srcDir = Boolean(srcDir)
}
}
if (
!process.argv.includes('--experimental-app') &&
!process.argv.includes('--no-experimental-app')
) {
if (ciInfo.isCI) {
program.experimentalApp = false
} else {
const styledAppDir = chalk.hex('#007acc')(
'experimental `app/` directory'
)
const { appDir } = await prompts({
onState: onPromptState,
type: 'toggle',
name: 'appDir',
message: `Would you like to use ${styledAppDir} with this project?`,
initial: false,
active: 'Yes',
inactive: 'No',
})
program.experimentalApp = Boolean(appDir)
}
}
if (
typeof program.importAlias !== 'string' ||
!program.importAlias.length
) {
if (ciInfo.isCI) {
program.importAlias = '@/*'
} else {
const styledImportAlias = chalk.hex('#007acc')('import alias')
const { importAlias } = await prompts({
onState: onPromptState,
type: 'text',
name: 'importAlias',
message: `What ${styledImportAlias} would you like configured?`,
initial: getPrefOrDefault('importAlias'),
validate: (value) =>
/.+\/\*/.test(value)
? true
: 'Import alias must follow the pattern <prefix>/*',
})
program.importAlias = importAlias
preferences.importAlias = importAlias
}
}
feat(create-next-app): JS/TS prompt (with appDir support); enhanced testing (#42012) Resubmitting this PR following this comment from Tim. This work has been done already and we can build off of it to get this in faster. > Just to be clear we're planning to rework create-next-app to give you the option to choose between JavaScript or TypeScript so it'll solve this request. For `app` right now it'll stay TypeScript till that is implemented. > > _Originally posted by @timneutkens in https://github.com/vercel/next.js/discussions/41745#discussioncomment-3985833_ --- I added the `--ts, --typescript` flag to `create-next-app` in https://github.com/vercel/next.js/pull/24655, and since then I have seen it used very frequently, including in recent issues (such as https://github.com/vercel/next.js/issues/33314) and most Next.js tutorials on YouTube. I noticed the template logic added in this PR was also used to add the `appDir` configuration as well. We discussed a while ago adding the following user flow: - `create-next-app --js, --javascript` creates a JS project - `create-next-app --ts, --typescript` creates a TS project - `create-next-app [name]` (no `--js, --ts`) prompts the user to choose either JS or TS, with TS selected by default. ### Review Adding support for appDir and refactoring the templates brought the pain-of-review up a bit, but it's not so bad when broken into increments. The original 8-file diff is here: https://github.com/ctjlewis/next.js/commit/1f47d9b0bf5b2c59dce893ca6634c1a9bfd3dd19 And the PR that brought the diff up to 59 files (mostly owed to `app` template dirs and file structure refactors): https://github.com/ctjlewis/next.js/commit/bd3ae4afd31f787dd41df2c6ab2e8145deef2138 ([PR link](https://github.com/ctjlewis/next.js/pull/3/files)) ### Demo https://user-images.githubusercontent.com/1657236/198586216-4691ff4c-48d4-4c6c-b7c1-705c38dd0194.mov Co-authored-by: JJ Kasper <22380829+ijjk@users.noreply.github.com>
2022-10-31 06:43:39 +01:00
}
try {
await createApp({
appPath: resolvedProjectPath,
packageManager,
example: example && example !== 'default' ? example : undefined,
examplePath: program.examplePath,
typescript: program.typescript,
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
tailwind: program.tailwind,
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
eslint: program.eslint,
experimentalApp: program.experimentalApp,
srcDir: program.srcDir,
importAlias: program.importAlias,
})
} catch (reason) {
if (!(reason instanceof DownloadError)) {
throw reason
}
const res = await prompts({
onState: onPromptState,
type: 'confirm',
name: 'builtin',
message:
`Could not download "${example}" because of a connectivity issue between your machine and GitHub.\n` +
`Do you want to use the default template instead?`,
initial: true,
})
if (!res.builtin) {
throw reason
}
await createApp({
appPath: resolvedProjectPath,
packageManager,
typescript: program.typescript,
Add prompt for ESLint to CNA (#42218) Following up https://github.com/vercel/next.js/pull/42012 this adds an additional prompt for include ESLint config/dependencies or not. As discussed, this also removes the slow down from doing separate `dependencies` and `devDependencies` installs since this separation is no longer required now that we have `output: 'standalone'` which ensures only actual necessary dependency files are used for production builds. <details> <summary>Before</summary> https://user-images.githubusercontent.com/22380829/198953290-116b422d-4359-4aa9-9d82-b3265fde7b3f.mp4 </details> <details> <summary>After</summary> https://user-images.githubusercontent.com/22380829/198953347-20dbf897-92b3-45ea-a9d2-cfb61622251d.mp4 </details> ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md)
2022-10-31 16:51:50 +01:00
eslint: program.eslint,
feat(cli): introduce `--tailwind` flag (#46927) ### What? This PR introduces a new `--tailwind` flag to the `create-next-app` CLI, to make it easier to bootstrap a Next.js app with Tailwind CSS pre-configured. This is going to be the **default**. To opt-out of Tailwind CSS, you can use the `--no-tailwind` flag. ### Why? Tailwind CSS is one of the most popular styling solutions right now, and we would like to make it easier to get started. Currently, the closest you can come to this is by running `pnpm create next-app -e with-tailwindcss` which will clone the https://github.com/vercel/next.js/tree/canary/examples/with-tailwindcss example. But that example is not configured for the App Router. This PR will let you add Tailwind CSS to both `app/`, `pages/`, and start out with TypeScript or JavaScript via the CLI prompts. (Some community feedback https://twitter.com/dev_jonaskaas/status/1632367991827443713, https://twitter.com/samselikoff/status/1634662473331617794) ### How? We are adding 4 new templates to the CLI bundle. > Note: The styling is not pixel-perfect compared to the current templates (using CSS modules) to require fewer overrides, but I tried to match it as close as possible. Here are a few screenshots: <details> <summary><b>Current, light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733372-9dba86fe-9191-471d-ad9f-ab904c47f544.png"/> </details> <details> <summary><b>Tailwind (new), light</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733610-038d9d0f-634d-4b69-b5c2-a5056b56760c.png"/> </details> <details> <summary><b>Current, dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224733790-9b4d730c-0336-4dbe-bc10-1cae1d7fd145.png"/> </details> <details> <summary><b>Tailwind (new), dark, responsive</b></summary> <img src="https://user-images.githubusercontent.com/18369201/224734375-28384bbc-2c3a-4125-8f29-c102f3b7aa1d.png"/> </details> #### For reviewers This introduces 4 new templates, with a very similar code base to the original ones. To keep the PR focused, I decided to copy over duplicate code, but we could potentially create a shared folder for files that are the same across templates to somewhat reduce the CLI size. Not sure if it's worth it, let me know. Probably fine for now, but something to consider if we are adding more permutations in the future. --- ~Work remaining:~ - [x] app+ts - [x] layout - [x] dark mode - [x] media queries - [x] animations - [x] app+js - [x] pages+ts - [x] pages+js - [x] prompt/config - [x] deprecate Tailwind CSS example in favor of CLI - [x] update docs - [x] add test - [x] add [Prettier plugin](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) Closes NEXT-772 Related #45814, #44286
2023-03-16 16:06:27 +01:00
tailwind: program.tailwind,
experimentalApp: program.experimentalApp,
srcDir: program.srcDir,
importAlias: program.importAlias,
})
}
conf.set('preferences', preferences)
}
const update = checkForUpdate(packageJson).catch(() => null)
async function notifyUpdate(): Promise<void> {
try {
const res = await update
if (res?.latest) {
const updateMessage =
packageManager === 'yarn'
? 'yarn global add create-next-app'
: packageManager === 'pnpm'
? 'pnpm add -g create-next-app'
: 'npm i -g create-next-app'
console.log(
chalk.yellow.bold('A new version of `create-next-app` is available!') +
'\n' +
'You can update by running: ' +
chalk.cyan(updateMessage) +
'\n'
)
}
process.exit()
} catch {
// ignore error
}
}
run()
.then(notifyUpdate)
2020-05-18 21:24:37 +02:00
.catch(async (reason) => {
console.log()
console.log('Aborting installation.')
if (reason.command) {
console.log(` ${chalk.cyan(reason.command)} has failed.`)
} else {
console.log(
chalk.red('Unexpected error. Please report it as a bug:') + '\n',
reason
)
}
console.log()
await notifyUpdate()
process.exit(1)
})