@next/codemod 15.0.0-canary.2 → 15.0.0-canary.200

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/bin/next-codemod.js +55 -3
  2. package/bin/shared.js +7 -0
  3. package/bin/transform.js +124 -0
  4. package/bin/upgrade.js +458 -0
  5. package/lib/cra-to-next/global-css-transform.js +5 -5
  6. package/lib/cra-to-next/index-to-component.js +5 -5
  7. package/lib/handle-package.js +110 -0
  8. package/lib/install.js +2 -3
  9. package/lib/parser.js +28 -0
  10. package/lib/run-jscodeshift.js +18 -2
  11. package/lib/utils.js +115 -0
  12. package/package.json +15 -7
  13. package/transforms/add-missing-react-import.js +4 -3
  14. package/transforms/app-dir-runtime-config-experimental-edge.js +34 -0
  15. package/transforms/built-in-next-font.js +4 -3
  16. package/transforms/cra-to-next.js +238 -236
  17. package/transforms/lib/async-request-api/index.js +16 -0
  18. package/transforms/lib/async-request-api/next-async-dynamic-api.js +284 -0
  19. package/transforms/lib/async-request-api/next-async-dynamic-prop.js +680 -0
  20. package/transforms/lib/async-request-api/utils.js +473 -0
  21. package/transforms/metadata-to-viewport-export.js +4 -3
  22. package/transforms/name-default-component.js +6 -6
  23. package/transforms/new-link.js +9 -7
  24. package/transforms/next-async-request-api.js +9 -0
  25. package/transforms/next-dynamic-access-named-export.js +66 -0
  26. package/transforms/next-image-experimental.js +12 -15
  27. package/transforms/next-image-to-legacy-image.js +8 -9
  28. package/transforms/next-og-import.js +4 -3
  29. package/transforms/next-request-geo-ip.js +339 -0
  30. package/transforms/url-to-withrouter.js +1 -1
  31. package/transforms/withamp-to-config.js +1 -1
  32. package/bin/cli.js +0 -216
  33. package/lib/uninstall-package.js +0 -32
package/bin/cli.js DELETED
@@ -1,216 +0,0 @@
1
- "use strict";
2
- /**
3
- * Copyright 2015-present, Facebook, Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- *
8
- */
9
- // Based on https://github.com/reactjs/react-codemod/blob/dd8671c9a470a2c342b221ec903c574cf31e9f57/bin/cli.js
10
- // @next/codemod optional-name-of-transform optional/path/to/src [...options]
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.run = exports.runTransform = exports.checkGitStatus = exports.transformerDirectory = exports.jscodeshiftExecutable = void 0;
16
- const globby_1 = __importDefault(require("globby"));
17
- const inquirer_1 = __importDefault(require("inquirer"));
18
- const meow_1 = __importDefault(require("meow"));
19
- const path_1 = __importDefault(require("path"));
20
- const execa_1 = __importDefault(require("execa"));
21
- const picocolors_1 = require("picocolors");
22
- const is_git_clean_1 = __importDefault(require("is-git-clean"));
23
- const uninstall_package_1 = require("../lib/uninstall-package");
24
- exports.jscodeshiftExecutable = require.resolve('.bin/jscodeshift');
25
- exports.transformerDirectory = path_1.default.join(__dirname, '../', 'transforms');
26
- function checkGitStatus(force) {
27
- let clean = false;
28
- let errorMessage = 'Unable to determine if git directory is clean';
29
- try {
30
- clean = is_git_clean_1.default.sync(process.cwd());
31
- errorMessage = 'Git directory is not clean';
32
- }
33
- catch (err) {
34
- if (err && err.stderr && err.stderr.includes('Not a git repository')) {
35
- clean = true;
36
- }
37
- }
38
- if (!clean) {
39
- if (force) {
40
- console.log(`WARNING: ${errorMessage}. Forcibly continuing.`);
41
- }
42
- else {
43
- console.log('Thank you for using @next/codemod!');
44
- console.log((0, picocolors_1.yellow)('\nBut before we continue, please stash or commit your git changes.'));
45
- console.log('\nYou may use the --force flag to override this safety check.');
46
- process.exit(1);
47
- }
48
- }
49
- }
50
- exports.checkGitStatus = checkGitStatus;
51
- function runTransform({ files, flags, transformer }) {
52
- const transformerPath = path_1.default.join(exports.transformerDirectory, `${transformer}.js`);
53
- if (transformer === 'cra-to-next') {
54
- // cra-to-next transform doesn't use jscodeshift directly
55
- return require(transformerPath).default(files, flags);
56
- }
57
- let args = [];
58
- const { dry, print, runInBand } = flags;
59
- if (dry) {
60
- args.push('--dry');
61
- }
62
- if (print) {
63
- args.push('--print');
64
- }
65
- if (runInBand) {
66
- args.push('--run-in-band');
67
- }
68
- args.push('--verbose=2');
69
- args.push('--ignore-pattern=**/node_modules/**');
70
- args.push('--ignore-pattern=**/.next/**');
71
- args.push('--extensions=tsx,ts,jsx,js');
72
- args = args.concat(['--transform', transformerPath]);
73
- if (flags.jscodeshift) {
74
- args = args.concat(flags.jscodeshift);
75
- }
76
- args = args.concat(files);
77
- console.log(`Executing command: jscodeshift ${args.join(' ')}`);
78
- const result = execa_1.default.sync(exports.jscodeshiftExecutable, args, {
79
- stdio: 'inherit',
80
- stripFinalNewline: false,
81
- });
82
- if (result.failed) {
83
- throw new Error(`jscodeshift exited with code ${result.exitCode}`);
84
- }
85
- if (!dry && transformer === 'built-in-next-font') {
86
- console.log('Uninstalling `@next/font`');
87
- try {
88
- (0, uninstall_package_1.uninstallPackage)('@next/font');
89
- }
90
- catch (_a) {
91
- console.error("Couldn't uninstall `@next/font`, please uninstall it manually");
92
- }
93
- }
94
- }
95
- exports.runTransform = runTransform;
96
- const TRANSFORMER_INQUIRER_CHOICES = [
97
- {
98
- name: 'name-default-component: Transforms anonymous components into named components to make sure they work with Fast Refresh',
99
- value: 'name-default-component',
100
- },
101
- {
102
- name: 'add-missing-react-import: Transforms files that do not import `React` to include the import in order for the new React JSX transform',
103
- value: 'add-missing-react-import',
104
- },
105
- {
106
- name: 'withamp-to-config: Transforms the withAmp HOC into Next.js 9 page configuration',
107
- value: 'withamp-to-config',
108
- },
109
- {
110
- name: 'url-to-withrouter: Transforms the deprecated automatically injected url property on top level pages to using withRouter',
111
- value: 'url-to-withrouter',
112
- },
113
- {
114
- name: 'cra-to-next (experimental): automatically migrates a Create React App project to Next.js',
115
- value: 'cra-to-next',
116
- },
117
- {
118
- name: 'new-link: Ensures your <Link> usage is backwards compatible.',
119
- value: 'new-link',
120
- },
121
- {
122
- name: 'next-og-import: Transforms imports from `next/server` to `next/og` for usage of Dynamic OG Image Generation.',
123
- value: 'next-og-import',
124
- },
125
- {
126
- name: 'metadata-to-viewport-export: Migrates certain viewport related metadata from the `metadata` export to a new `viewport` export.',
127
- value: 'metadata-to-viewport-export',
128
- },
129
- {
130
- name: 'next-image-to-legacy-image: safely migrate Next.js 10, 11, 12 applications importing `next/image` to the renamed `next/legacy/image` import in Next.js 13',
131
- value: 'next-image-to-legacy-image',
132
- },
133
- {
134
- name: 'next-image-experimental (experimental): dangerously migrates from `next/legacy/image` to the new `next/image` by adding inline styles and removing unused props',
135
- value: 'next-image-experimental',
136
- },
137
- {
138
- name: 'built-in-next-font: Uninstall `@next/font` and transform imports to `next/font`',
139
- value: 'built-in-next-font',
140
- },
141
- ];
142
- function expandFilePathsIfNeeded(filesBeforeExpansion) {
143
- const shouldExpandFiles = filesBeforeExpansion.some((file) => file.includes('*'));
144
- return shouldExpandFiles
145
- ? globby_1.default.sync(filesBeforeExpansion)
146
- : filesBeforeExpansion;
147
- }
148
- function run() {
149
- const cli = (0, meow_1.default)({
150
- description: 'Codemods for updating Next.js apps.',
151
- help: `
152
- Usage
153
- $ npx @next/codemod <transform> <path> <...options>
154
- transform One of the choices from https://github.com/vercel/next.js/tree/canary/packages/next-codemod
155
- path Files or directory to transform. Can be a glob like pages/**.js
156
- Options
157
- --force Bypass Git safety checks and forcibly run codemods
158
- --dry Dry run (no changes are made to files)
159
- --print Print transformed files to your terminal
160
- --jscodeshift (Advanced) Pass options directly to jscodeshift
161
- `,
162
- flags: {
163
- boolean: ['force', 'dry', 'print', 'help'],
164
- string: ['_'],
165
- alias: {
166
- h: 'help',
167
- },
168
- },
169
- });
170
- if (!cli.flags.dry) {
171
- checkGitStatus(cli.flags.force);
172
- }
173
- if (cli.input[0] &&
174
- !TRANSFORMER_INQUIRER_CHOICES.find((x) => x.value === cli.input[0])) {
175
- console.error('Invalid transform choice, pick one of:');
176
- console.error(TRANSFORMER_INQUIRER_CHOICES.map((x) => '- ' + x.value).join('\n'));
177
- process.exit(1);
178
- }
179
- inquirer_1.default
180
- .prompt([
181
- {
182
- type: 'input',
183
- name: 'files',
184
- message: 'On which files or directory should the codemods be applied?',
185
- when: !cli.input[1],
186
- default: '.',
187
- // validate: () =>
188
- filter: (files) => files.trim(),
189
- },
190
- {
191
- type: 'list',
192
- name: 'transformer',
193
- message: 'Which transform would you like to apply?',
194
- when: !cli.input[0],
195
- pageSize: TRANSFORMER_INQUIRER_CHOICES.length,
196
- choices: TRANSFORMER_INQUIRER_CHOICES,
197
- },
198
- ])
199
- .then((answers) => {
200
- const { files, transformer } = answers;
201
- const filesBeforeExpansion = cli.input[1] || files;
202
- const filesExpanded = expandFilePathsIfNeeded([filesBeforeExpansion]);
203
- const selectedTransformer = cli.input[0] || transformer;
204
- if (!filesExpanded.length) {
205
- console.log(`No files found matching ${filesBeforeExpansion.join(' ')}`);
206
- return null;
207
- }
208
- return runTransform({
209
- files: filesExpanded,
210
- flags: cli.flags,
211
- transformer: selectedTransformer,
212
- });
213
- });
214
- }
215
- exports.run = run;
216
- //# sourceMappingURL=cli.js.map
@@ -1,32 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.uninstallPackage = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
9
- const execa_1 = __importDefault(require("execa"));
10
- function getPkgManager(baseDir) {
11
- for (const { lockFile, packageManager } of [
12
- { lockFile: 'yarn.lock', packageManager: 'yarn' },
13
- { lockFile: 'pnpm-lock.yaml', packageManager: 'pnpm' },
14
- { lockFile: 'package-lock.json', packageManager: 'npm' },
15
- ]) {
16
- if (fs_1.default.existsSync(path_1.default.join(baseDir, lockFile))) {
17
- return packageManager;
18
- }
19
- }
20
- }
21
- function uninstallPackage(packageToUninstall) {
22
- const pkgManager = getPkgManager(process.cwd());
23
- if (!pkgManager)
24
- throw new Error('Failed to find package manager');
25
- let command = 'uninstall';
26
- if (pkgManager === 'yarn') {
27
- command = 'remove';
28
- }
29
- execa_1.default.sync(pkgManager, [command, packageToUninstall], { stdio: 'inherit' });
30
- }
31
- exports.uninstallPackage = uninstallPackage;
32
- //# sourceMappingURL=uninstall-package.js.map