|
9 | 9 | 'use strict'; |
10 | 10 |
|
11 | 11 | const fs = require('fs'); |
| 12 | +const chalk = require('chalk'); |
12 | 13 | const path = require('path'); |
13 | 14 | const Promise = require('promise'); |
14 | 15 | const yeoman = require('yeoman-environment'); |
| 16 | +const semver = require('semver'); |
15 | 17 |
|
16 | 18 | module.exports = function upgrade(args, config) { |
17 | 19 | args = args || process.argv; |
18 | | - let env = yeoman.createEnv(); |
19 | | - let name = JSON.parse(fs.readFileSync('package.json', 'utf8')).name; |
20 | | - let generatorPath = path.join(__dirname, '..', 'generator'); |
| 20 | + const env = yeoman.createEnv(); |
| 21 | + const pak = JSON.parse(fs.readFileSync('package.json', 'utf8')); |
| 22 | + const version = pak.dependencies['react-native']; |
| 23 | + |
| 24 | + if (version) { |
| 25 | + if (version === 'latest' || version === '*') { |
| 26 | + console.warn( |
| 27 | + chalk.yellow( |
| 28 | + 'Major releases are most likely to introduce breaking changes.\n' + |
| 29 | + 'Use a proper version number in your \'package.json\' file to avoid breakage.\n' + |
| 30 | + 'e.g. - ^0.18.0' |
| 31 | + ) |
| 32 | + ); |
| 33 | + } else { |
| 34 | + const installed = JSON.parse(fs.readFileSync('node_modules/react-native/package.json', 'utf8')); |
| 35 | + |
| 36 | + if (semver.satisfies(installed.version, version)) { |
| 37 | + const v = version.replace(/^(~|\^|=)/, '').replace(/x/i, '0'); |
| 38 | + |
| 39 | + if (semver.valid(v)) { |
| 40 | + console.log( |
| 41 | + 'Upgrading project to react-native v' + installed.version + '\n' + |
| 42 | + 'Be sure to read the release notes and breaking changes:\n' + |
| 43 | + chalk.blue( |
| 44 | + 'https://github.com/facebook/react-native/releases/tag/v' + semver.major(v) + '.' + semver.minor(v) + '.0' |
| 45 | + ) |
| 46 | + ); |
| 47 | + } else { |
| 48 | + console.log( |
| 49 | + chalk.yellow( |
| 50 | + 'A valid version number for \'react-native\' is not specified your \'package.json\' file.' |
| 51 | + ) |
| 52 | + ); |
| 53 | + } |
| 54 | + } else { |
| 55 | + console.warn( |
| 56 | + chalk.yellow( |
| 57 | + 'react-native version in \'package.json\' doesn\'t match the installed version in \'node_modules\'.\n' + |
| 58 | + 'Try running \'npm install\' to fix the issue.' |
| 59 | + ) |
| 60 | + ); |
| 61 | + } |
| 62 | + } |
| 63 | + } else { |
| 64 | + console.warn( |
| 65 | + chalk.yellow( |
| 66 | + 'Your \'package.json\' file doesn\'t seem to have \'react-native\' as a dependency.' |
| 67 | + ) |
| 68 | + ); |
| 69 | + } |
| 70 | + |
| 71 | + const generatorPath = path.join(__dirname, '..', 'generator'); |
21 | 72 | env.register(generatorPath, 'react:app'); |
22 | | - let generatorArgs = ['react:app', name].concat(args); |
| 73 | + const generatorArgs = ['react:app', pak.name].concat(args); |
23 | 74 | return new Promise((resolve) => env.run(generatorArgs, {upgrade: true}, resolve)); |
24 | 75 | }; |
0 commit comments