@next/codemod 15.0.0-canary.195 → 15.0.0-canary.197

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 (2) hide show
  1. package/bin/upgrade.js +81 -8
  2. package/package.json +3 -2
package/bin/upgrade.js CHANGED
@@ -1,9 +1,33 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.runUpgrade = runUpgrade;
30
+ const os = __importStar(require("os"));
7
31
  const prompts_1 = __importDefault(require("prompts"));
8
32
  const fs_1 = __importDefault(require("fs"));
9
33
  const semver_1 = __importDefault(require("semver"));
@@ -15,6 +39,22 @@ const handle_package_1 = require("../lib/handle-package");
15
39
  const transform_1 = require("./transform");
16
40
  const utils_1 = require("../lib/utils");
17
41
  const shared_1 = require("./shared");
42
+ const optionalNextjsPackages = [
43
+ 'create-next-app',
44
+ 'eslint-config-next',
45
+ '@next/bundle-analyzer',
46
+ '@next/codemod',
47
+ '@next/env',
48
+ '@next/eslint-plugin-next',
49
+ '@next/font',
50
+ '@next/mdx',
51
+ '@next/plugin-storybook',
52
+ '@next/polyfill-module',
53
+ '@next/polyfill-nomodule',
54
+ '@next/swc',
55
+ '@next/react-refresh-utils',
56
+ '@next/third-parties',
57
+ ];
18
58
  /**
19
59
  * @param query
20
60
  * @example loadHighestNPMVersionMatching("react@^18.3.0 || ^19.0.0") === Promise<"19.0.0">
@@ -79,7 +119,7 @@ async function runUpgrade(revision, options) {
79
119
  // we should only let the user stay on React 18 if they are using pure Pages Router.
80
120
  // x-ref(PR): https://github.com/vercel/next.js/pull/65058
81
121
  // x-ref(release): https://github.com/vercel/next.js/releases/tag/v14.3.0-canary.45
82
- (0, compare_1.default)(installedNextVersion, '14.3.0-canary.45') >= 0 &&
122
+ (0, compare_1.default)(targetNextVersion, '14.3.0-canary.45') >= 0 &&
83
123
  installedReactVersion.startsWith('18')) {
84
124
  const shouldStayOnReact18Res = await (0, prompts_1.default)({
85
125
  type: 'confirm',
@@ -109,7 +149,8 @@ async function runUpgrade(revision, options) {
109
149
  let execCommand = 'npx';
110
150
  // The following React codemods are for React 19
111
151
  if (!shouldStayOnReact18 &&
112
- (0, compare_1.default)(targetReactVersion, '19.0.0-beta.0') >= 0) {
152
+ (0, compare_1.default)(targetReactVersion, '18.9999.9999') > 0 &&
153
+ (0, compare_1.default)(installedReactVersion, '18.9999.9999') <= 0) {
113
154
  shouldRunReactCodemods = await suggestReactCodemods();
114
155
  shouldRunReactTypesCodemods = await suggestReactTypesCodemods();
115
156
  const execCommandMap = {
@@ -133,6 +174,12 @@ async function runUpgrade(revision, options) {
133
174
  'react-dom': { version: targetReactVersion, required: true },
134
175
  'react-is': { version: targetReactVersion, required: false },
135
176
  };
177
+ for (const optionalNextjsPackage of optionalNextjsPackages) {
178
+ versionMapping[optionalNextjsPackage] = {
179
+ version: targetNextVersion,
180
+ required: false,
181
+ };
182
+ }
136
183
  if (targetReactVersion.startsWith('19.0.0-canary') ||
137
184
  targetReactVersion.startsWith('19.0.0-beta') ||
138
185
  targetReactVersion.startsWith('19.0.0-rc')) {
@@ -196,7 +243,9 @@ async function runUpgrade(revision, options) {
196
243
  for (const [dep, version] of devDependenciesToInstall) {
197
244
  (0, handle_package_1.addPackageDependency)(appPackageJson, dep, version, true);
198
245
  }
199
- fs_1.default.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2));
246
+ fs_1.default.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2) +
247
+ // Common IDE formatters would add a newline as well.
248
+ os.EOL);
200
249
  (0, handle_package_1.runInstallation)(packageManager);
201
250
  for (const codemod of codemods) {
202
251
  await (0, transform_1.runTransform)(codemod, process.cwd(), { force: true, verbose });
@@ -351,18 +400,24 @@ async function suggestReactTypesCodemods() {
351
400
  return runReactTypesCodemod;
352
401
  }
353
402
  function writeOverridesField(packageJson, packageManager, overrides) {
354
- if (packageManager === 'bun' || packageManager === 'npm') {
403
+ const entries = Object.entries(overrides);
404
+ // Avoids writing an empty overrides field into package.json
405
+ // which would be an unnecessary diff.
406
+ if (entries.length === 0) {
407
+ return;
408
+ }
409
+ if (packageManager === 'npm') {
355
410
  if (!packageJson.overrides) {
356
411
  packageJson.overrides = {};
357
412
  }
358
- for (const [key, value] of Object.entries(overrides)) {
413
+ for (const [key, value] of entries) {
359
414
  packageJson.overrides[key] = value;
360
415
  }
361
416
  }
362
417
  else if (packageManager === 'pnpm') {
363
418
  // pnpm supports pnpm.overrides and pnpm.resolutions
364
419
  if (packageJson.resolutions) {
365
- for (const [key, value] of Object.entries(overrides)) {
420
+ for (const [key, value] of entries) {
366
421
  packageJson.resolutions[key] = value;
367
422
  }
368
423
  }
@@ -373,7 +428,7 @@ function writeOverridesField(packageJson, packageManager, overrides) {
373
428
  if (!packageJson.pnpm.overrides) {
374
429
  packageJson.pnpm.overrides = {};
375
430
  }
376
- for (const [key, value] of Object.entries(overrides)) {
431
+ for (const [key, value] of entries) {
377
432
  packageJson.pnpm.overrides[key] = value;
378
433
  }
379
434
  }
@@ -382,9 +437,27 @@ function writeOverridesField(packageJson, packageManager, overrides) {
382
437
  if (!packageJson.resolutions) {
383
438
  packageJson.resolutions = {};
384
439
  }
385
- for (const [key, value] of Object.entries(overrides)) {
440
+ for (const [key, value] of entries) {
386
441
  packageJson.resolutions[key] = value;
387
442
  }
388
443
  }
444
+ else if (packageManager === 'bun') {
445
+ // bun supports both overrides and resolutions
446
+ // x-ref: https://bun.sh/docs/install/overrides
447
+ if (packageJson.resolutions) {
448
+ for (const [key, value] of entries) {
449
+ packageJson.resolutions[key] = value;
450
+ }
451
+ }
452
+ else {
453
+ // add overrides field if it's missing and add overrides
454
+ if (!packageJson.overrides) {
455
+ packageJson.overrides = {};
456
+ }
457
+ for (const [key, value] of entries) {
458
+ packageJson.overrides[key] = value;
459
+ }
460
+ }
461
+ }
389
462
  }
390
463
  //# sourceMappingURL=upgrade.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next/codemod",
3
- "version": "15.0.0-canary.195",
3
+ "version": "15.0.0-canary.197",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,7 +30,8 @@
30
30
  "build": "pnpm tsc -d -p tsconfig.json",
31
31
  "prepublishOnly": "cd ../../ && turbo run build",
32
32
  "dev": "pnpm tsc -d -w -p tsconfig.json",
33
- "test": "jest"
33
+ "test": "jest",
34
+ "test:upgrade-fixture": "./scripts/test-upgrade-fixture.sh"
34
35
  },
35
36
  "bin": "./bin/next-codemod.js",
36
37
  "devDependencies": {