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

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.
package/bin/upgrade.js CHANGED
@@ -123,6 +123,10 @@ async function runUpgrade(revision, options) {
123
123
  fs_1.default.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2));
124
124
  const dependenciesToInstall = [];
125
125
  const devDependenciesToInstall = [];
126
+ const allDependencies = {
127
+ ...appPackageJson.dependencies,
128
+ ...appPackageJson.devDependencies,
129
+ };
126
130
  const versionMapping = {
127
131
  next: { version: targetNextVersion, required: true },
128
132
  react: { version: targetReactVersion, required: true },
@@ -132,47 +136,68 @@ async function runUpgrade(revision, options) {
132
136
  if (targetReactVersion.startsWith('19.0.0-canary') ||
133
137
  targetReactVersion.startsWith('19.0.0-beta') ||
134
138
  targetReactVersion.startsWith('19.0.0-rc')) {
135
- versionMapping['@types/react'] = {
136
- version: `npm:types-react@rc`,
137
- required: false,
138
- };
139
- versionMapping['@types/react-dom'] = {
140
- version: `npm:types-react-dom@rc`,
141
- required: false,
142
- };
139
+ const [targetReactTypesVersion, targetReactDOMTypesVersion] = await Promise.all([
140
+ loadHighestNPMVersionMatching(`types-react@rc`),
141
+ loadHighestNPMVersionMatching(`types-react-dom@rc`),
142
+ ]);
143
+ if (allDependencies['@types/react']) {
144
+ versionMapping['@types/react'] = {
145
+ version: `npm:types-react@${targetReactTypesVersion}`,
146
+ required: false,
147
+ };
148
+ }
149
+ if (allDependencies['@types/react-dom']) {
150
+ versionMapping['@types/react-dom'] = {
151
+ version: `npm:types-react-dom@${targetReactDOMTypesVersion}`,
152
+ required: false,
153
+ };
154
+ }
143
155
  }
144
156
  else {
145
157
  const [targetReactTypesVersion, targetReactDOMTypesVersion] = await Promise.all([
146
158
  loadHighestNPMVersionMatching(`@types/react@${targetNextPackageJson.peerDependencies['react']}`),
147
159
  loadHighestNPMVersionMatching(`@types/react-dom@${targetNextPackageJson.peerDependencies['react']}`),
148
160
  ]);
149
- versionMapping['@types/react'] = {
150
- version: targetReactTypesVersion,
151
- required: false,
152
- };
153
- versionMapping['@types/react-dom'] = {
154
- version: targetReactDOMTypesVersion,
155
- required: false,
156
- };
161
+ if (allDependencies['@types/react']) {
162
+ versionMapping['@types/react'] = {
163
+ version: targetReactTypesVersion,
164
+ required: false,
165
+ };
166
+ }
167
+ if (allDependencies['@types/react-dom']) {
168
+ versionMapping['@types/react-dom'] = {
169
+ version: targetReactDOMTypesVersion,
170
+ required: false,
171
+ };
172
+ }
173
+ }
174
+ // Even though we only need those if we alias `@types/react` to types-react,
175
+ // we still do it out of safety due to https://github.com/microsoft/DefinitelyTyped-tools/issues/433.
176
+ const overrides = {};
177
+ if (allDependencies['@types/react']) {
178
+ overrides['@types/react'] = versionMapping['@types/react'].version;
157
179
  }
180
+ if (allDependencies['@types/react-dom']) {
181
+ overrides['@types/react-dom'] = versionMapping['@types/react-dom'].version;
182
+ }
183
+ writeOverridesField(appPackageJson, packageManager, overrides);
158
184
  for (const [packageName, { version, required }] of Object.entries(versionMapping)) {
159
185
  if (appPackageJson.devDependencies?.[packageName]) {
160
- devDependenciesToInstall.push(`${packageName}@${version}`);
186
+ devDependenciesToInstall.push([packageName, version]);
161
187
  }
162
188
  else if (required || appPackageJson.dependencies?.[packageName]) {
163
- dependenciesToInstall.push(`${packageName}@${version}`);
189
+ dependenciesToInstall.push([packageName, version]);
164
190
  }
165
191
  }
166
192
  console.log(`Upgrading your project to ${picocolors_1.default.blue('Next.js ' + targetNextVersion)}...\n`);
167
- (0, handle_package_1.installPackages)(dependenciesToInstall, {
168
- packageManager,
169
- silent: !verbose,
170
- });
171
- (0, handle_package_1.installPackages)(devDependenciesToInstall, {
172
- packageManager,
173
- silent: !verbose,
174
- dev: true,
175
- });
193
+ for (const [dep, version] of dependenciesToInstall) {
194
+ (0, handle_package_1.addPackageDependency)(appPackageJson, dep, version, false);
195
+ }
196
+ for (const [dep, version] of devDependenciesToInstall) {
197
+ (0, handle_package_1.addPackageDependency)(appPackageJson, dep, version, true);
198
+ }
199
+ fs_1.default.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2));
200
+ (0, handle_package_1.runInstallation)(packageManager);
176
201
  for (const codemod of codemods) {
177
202
  await (0, transform_1.runTransform)(codemod, process.cwd(), { force: true, verbose });
178
203
  }
@@ -325,4 +350,41 @@ async function suggestReactTypesCodemods() {
325
350
  }, { onCancel: utils_1.onCancel });
326
351
  return runReactTypesCodemod;
327
352
  }
353
+ function writeOverridesField(packageJson, packageManager, overrides) {
354
+ if (packageManager === 'bun' || packageManager === 'npm') {
355
+ if (!packageJson.overrides) {
356
+ packageJson.overrides = {};
357
+ }
358
+ for (const [key, value] of Object.entries(overrides)) {
359
+ packageJson.overrides[key] = value;
360
+ }
361
+ }
362
+ else if (packageManager === 'pnpm') {
363
+ // pnpm supports pnpm.overrides and pnpm.resolutions
364
+ if (packageJson.resolutions) {
365
+ for (const [key, value] of Object.entries(overrides)) {
366
+ packageJson.resolutions[key] = value;
367
+ }
368
+ }
369
+ else {
370
+ if (!packageJson.pnpm) {
371
+ packageJson.pnpm = {};
372
+ }
373
+ if (!packageJson.pnpm.overrides) {
374
+ packageJson.pnpm.overrides = {};
375
+ }
376
+ for (const [key, value] of Object.entries(overrides)) {
377
+ packageJson.pnpm.overrides[key] = value;
378
+ }
379
+ }
380
+ }
381
+ else if (packageManager === 'yarn') {
382
+ if (!packageJson.resolutions) {
383
+ packageJson.resolutions = {};
384
+ }
385
+ for (const [key, value] of Object.entries(overrides)) {
386
+ packageJson.resolutions[key] = value;
387
+ }
388
+ }
389
+ }
328
390
  //# sourceMappingURL=upgrade.js.map
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.getPkgManager = getPkgManager;
7
7
  exports.uninstallPackage = uninstallPackage;
8
8
  exports.installPackages = installPackages;
9
+ exports.runInstallation = runInstallation;
10
+ exports.addPackageDependency = addPackageDependency;
9
11
  const find_up_1 = __importDefault(require("find-up"));
10
12
  const execa_1 = __importDefault(require("execa"));
11
13
  const node_path_1 = require("node:path");
@@ -84,4 +86,25 @@ function installPackages(packageToInstall, options = {}) {
84
86
  throw new Error(`Failed to install "${packageToInstall}". Please install it manually.`, { cause: error });
85
87
  }
86
88
  }
89
+ function runInstallation(packageManager) {
90
+ try {
91
+ execa_1.default.sync(packageManager, ['install'], {
92
+ stdio: 'inherit',
93
+ shell: true,
94
+ });
95
+ }
96
+ catch (error) {
97
+ throw new Error('Failed to install dependencies', { cause: error });
98
+ }
99
+ }
100
+ function addPackageDependency(packageJson, name, version, dev) {
101
+ if (dev) {
102
+ packageJson.devDependencies = packageJson.devDependencies || {};
103
+ }
104
+ else {
105
+ packageJson.dependencies = packageJson.dependencies || {};
106
+ }
107
+ const deps = dev ? packageJson.devDependencies : packageJson.dependencies;
108
+ deps[name] = version;
109
+ }
87
110
  //# sourceMappingURL=handle-package.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next/codemod",
3
- "version": "15.0.0-canary.193",
3
+ "version": "15.0.0-canary.195",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",