mirror of
https://github.com/vercel/next.js.git
synced 2026-09-20 02:25:18 +08:00
b0ba92cbc6
### Why? Async Request API codemods can leave temporary casts that still require application-specific repairs. Those locations need explicit markers, while optional feature adoption needs to be distinguishable from required version migrations. ### How? Add `@next-codemod-error` comments to temporary `UnsafeUnwrapped*` casts, with instructions for completing the repair. Preserve documented ignores and avoid duplicating casts or markers when the transform runs again. Mark generated Cache Components opt-outs with `@next-codemod-ignore`, a removal condition and a link to the adoption guide. Add `upgrade --skip-adoption` to skip the Cache Components `instant = false` transform and partial-prefetch adoption cleanup. Required migrations and normal dependency and bundler selection keep their existing behavior. Both adoption transforms can still be run explicitly.
164 lines
4.8 KiB
TypeScript
164 lines
4.8 KiB
TypeScript
import { yellow } from 'picocolors'
|
|
import isGitClean from 'is-git-clean'
|
|
|
|
export const NEXT_CODEMOD_ERROR_PREFIX = '@next-codemod-error'
|
|
export const NEXT_CODEMOD_IGNORE_ERROR_PREFIX = '@next-codemod-ignore'
|
|
|
|
export function checkGitStatus(force) {
|
|
let clean = false
|
|
let errorMessage = 'Unable to determine if git directory is clean'
|
|
try {
|
|
clean = isGitClean.sync(process.cwd())
|
|
errorMessage = 'Git directory is not clean'
|
|
} catch (err) {
|
|
if (err && err.stderr && err.stderr.includes('Not a git repository')) {
|
|
clean = true
|
|
}
|
|
}
|
|
|
|
if (!clean) {
|
|
if (force) {
|
|
console.log(`WARNING: ${errorMessage}. Forcibly continuing.`)
|
|
} else {
|
|
console.log('Thank you for using @next/codemod!')
|
|
console.log(
|
|
yellow(
|
|
'\nBut before we continue, please stash or commit your git changes.'
|
|
)
|
|
)
|
|
console.log(
|
|
'\nYou may use the --force flag to override this safety check.'
|
|
)
|
|
process.exit(1)
|
|
}
|
|
}
|
|
}
|
|
|
|
export function onCancel() {
|
|
process.exit(1)
|
|
}
|
|
|
|
/**
|
|
* When adding a new codemod, ensure to set the target canary version
|
|
* instead of the stable version. This is for `@next/codemod upgrade`
|
|
* to correctly pick up the codemod for the next pre-release version.
|
|
* This is also essential for correctly upgrading from canary to canary.
|
|
*/
|
|
export const TRANSFORMER_INQUIRER_CHOICES = [
|
|
{
|
|
title:
|
|
'Transform the deprecated automatically injected url property on top level pages to using withRouter',
|
|
value: 'url-to-withrouter',
|
|
version: '6.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Transforms anonymous components into named components to make sure they work with Fast Refresh',
|
|
value: 'name-default-component',
|
|
version: '9.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Transforms files that do not import `React` to include the import in order for the new React JSX transform',
|
|
value: 'add-missing-react-import',
|
|
version: '10.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Automatically migrates a Create React App project to Next.js (experimental)',
|
|
value: 'cra-to-next',
|
|
version: '11.0.0',
|
|
},
|
|
{
|
|
title: 'Ensures your <Link> usage is backwards compatible',
|
|
value: 'new-link',
|
|
version: '13.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Dangerously migrates from `next/legacy/image` to the new `next/image` by adding inline styles and removing unused props (experimental)',
|
|
value: 'next-image-experimental',
|
|
version: '13.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Safely migrate Next.js 10, 11, 12 applications importing `next/image` to the renamed `next/legacy/image` import in Next.js 13',
|
|
value: 'next-image-to-legacy-image',
|
|
version: '13.0.0',
|
|
},
|
|
{
|
|
title: 'Uninstall `@next/font` and transform imports to `next/font`',
|
|
value: 'built-in-next-font',
|
|
version: '13.2.0',
|
|
},
|
|
{
|
|
title:
|
|
'Migrates certain viewport related metadata from the `metadata` export to a new `viewport` export',
|
|
value: 'metadata-to-viewport-export',
|
|
version: '14.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Transforms imports from `next/server` to `next/og` for usage of Dynamic OG Image Generation',
|
|
value: 'next-og-import',
|
|
version: '14.0.0',
|
|
},
|
|
{
|
|
title:
|
|
'Install `@vercel/functions` to replace `geo` and `ip` properties on `NextRequest`',
|
|
value: 'next-request-geo-ip',
|
|
version: '15.0.0-canary.153',
|
|
},
|
|
{
|
|
title: 'Transforms usage of Next.js async Request APIs',
|
|
value: 'next-async-request-api',
|
|
version: '15.0.0-canary.171',
|
|
},
|
|
{
|
|
title:
|
|
'Transform App Router Route Segment Config `runtime` value from `experimental-edge` to `edge`',
|
|
value: 'app-dir-runtime-config-experimental-edge',
|
|
version: '15.0.0-canary.179',
|
|
},
|
|
{
|
|
title: 'Updates `next.config.js` to use the new `turbopack` configuration',
|
|
value: 'next-experimental-turbo-to-turbopack',
|
|
version: '15.4.2-canary.21',
|
|
},
|
|
{
|
|
title: 'Migrate from `next lint` to the ESLint CLI',
|
|
value: 'next-lint-to-eslint-cli',
|
|
version: '15.4.2-canary.55',
|
|
},
|
|
{
|
|
title: 'Migrate from deprecated `middleware` convention to `proxy`',
|
|
value: 'middleware-to-proxy',
|
|
version: '15.6.0-canary.54',
|
|
},
|
|
{
|
|
title: 'Remove `unstable_` prefix from stabilized API',
|
|
value: 'remove-unstable-prefix',
|
|
version: '16.0.0-canary.10',
|
|
},
|
|
{
|
|
title:
|
|
'Remove `experimental_ppr` Route Segment Config from App Router pages and layouts',
|
|
value: 'remove-experimental-ppr',
|
|
version: '16.0.0-canary.11',
|
|
},
|
|
{
|
|
title:
|
|
'Add `export const instant = false` to App Router pages and layouts to ease Cache Components adoption',
|
|
value: 'cache-components-instant-false',
|
|
version: '16.3.0',
|
|
adoption: true,
|
|
},
|
|
{
|
|
title:
|
|
"Remove `export const prefetch = 'partial'` Route Segment Config from App Router pages and layouts after enabling `partialPrefetching` globally",
|
|
value: 'remove-partial-prefetch',
|
|
version: '16.3.0',
|
|
adoption: true,
|
|
},
|
|
]
|