diff --git a/README.md b/README.md index 5beb9431a..43480ffcf 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,9 @@ cd mylib yarn start ``` +_Requires Node `>= 10`._ + + That's it. You don't need to worry about setting up Typescript or Rollup or Jest or other plumbing. Just start editing `src/index.ts` and go! Below is a list of commands you will probably find useful: diff --git a/package.json b/package.json index b85a3e8c2..a8526142c 100644 --- a/package.json +++ b/package.json @@ -116,11 +116,13 @@ "@types/react": "^16.9.11", "@types/rollup-plugin-json": "^3.0.2", "@types/rollup-plugin-sourcemaps": "^0.4.2", + "@types/semver": "^6.2.0", "doctoc": "^1.4.0", "husky": "^3.0.9", "pretty-quick": "^2.0.0", "ps-tree": "^1.2.0", - "react": "^16.8.6" + "react": "^16.8.6", + "semver": "^7.1.1" }, "husky": { "hooks": { diff --git a/src/index.ts b/src/index.ts index e059c8358..0c2532044 100755 --- a/src/index.ts +++ b/src/index.ts @@ -22,12 +22,18 @@ import rimraf from 'rimraf'; import execa from 'execa'; import shell from 'shelljs'; import ora from 'ora'; +import semver from 'semver'; import { paths } from './constants'; import * as Messages from './messages'; import { createBuildConfigs } from './createBuildConfigs'; import { createJestConfig } from './createJestConfig'; import { createEslintConfig } from './createEslintConfig'; -import { resolveApp, safePackageName, clearConsole } from './utils'; +import { + resolveApp, + safePackageName, + clearConsole, + getNodeEngineRequirement, +} from './utils'; import { concatAllArray } from 'jpjs'; import getInstallCmd from './getInstallCmd'; import getInstallArgs from './getInstallArgs'; @@ -226,6 +232,16 @@ prog process.chdir(projectPath); const safeName = safePackageName(pkg); const pkgJson = generatePackageJson({ name: safeName, author }); + + const nodeVersionReq = getNodeEngineRequirement(pkgJson); + if ( + nodeVersionReq && + !semver.satisfies(process.version, nodeVersionReq) + ) { + bootSpinner.fail(Messages.incorrectNodeVersion(nodeVersionReq)); + process.exit(1); + } + await fs.outputJSON(path.resolve(projectPath, 'package.json'), pkgJson); bootSpinner.succeed(`Created ${chalk.bold.green(pkg)}`); await Messages.start(pkg); diff --git a/src/messages.ts b/src/messages.ts index 2f82cefe9..e40287959 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -89,3 +89,9 @@ export const start = async function(projectName: string) { ${chalk.green('https://github.com/jaredpalmer/tsdx/issues')} `; }; + +export const incorrectNodeVersion = function(requiredVersion: string) { + return `Unsupported Node version! Your current Node version (${chalk.red( + process.version + )}) does not satisfy the requirement of Node ${chalk.cyan(requiredVersion)}.`; +}; diff --git a/src/templates/basic.ts b/src/templates/basic.ts index a53e4665e..c5599a9dc 100644 --- a/src/templates/basic.ts +++ b/src/templates/basic.ts @@ -12,6 +12,9 @@ const basicTemplate: Template = { // module: `dist/${safeName}.esm.js`, typings: `dist/index.d.ts`, files: ['dist'], + engines: { + node: '>=10', + }, scripts: { start: 'tsdx watch', build: 'tsdx build', diff --git a/src/types.ts b/src/types.ts index e5e92cc5f..e6878897e 100644 --- a/src/types.ts +++ b/src/types.ts @@ -56,4 +56,7 @@ export interface PackageJson { eslint?: any; dependencies?: { [packageName: string]: string }; devDependencies?: { [packageName: string]: string }; + engines?: { + node?: string; + }; } diff --git a/src/utils.ts b/src/utils.ts index a7948ed23..dcedff21f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -46,3 +46,7 @@ export function getReactVersion({ (devDependencies && devDependencies.react) ); } + +export function getNodeEngineRequirement({ engines }: PackageJson) { + return engines && engines.node; +} diff --git a/yarn.lock b/yarn.lock index 63f660895..a3109e5d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1179,6 +1179,11 @@ "@types/node" "*" rollup "^0.63.4" +"@types/semver@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.0.tgz#d688d574400d96c5b0114968705366f431831e1a" + integrity sha512-1OzrNb4RuAzIT7wHSsgZRlMBlNsJl+do6UblR7JMW4oB7bbR+uBEYtUh7gEc/jM84GGilh68lSOokyM/zNUlBA== + "@types/shelljs@^0.8.5": version "0.8.6" resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.6.tgz#45193a51df99e0f00513c39a2152832399783221" @@ -5802,6 +5807,11 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.1.tgz#29104598a197d6cbe4733eeecbe968f7b43a9667" + integrity sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A== + serialize-javascript@^1.7.0: version "1.9.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"