diff --git a/jest.config.js b/jest.config.js index f0d8dab1..f6fbc3c1 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,5 +2,8 @@ const { jest: jestConfig } = require('./src/config'); module.exports = Object.assign(jestConfig, { coverageThreshold: null, - testPathIgnorePatterns: [...jestConfig.testPathIgnorePatterns, './src/scripts/test.js'], + testPathIgnorePatterns: [ + ...jestConfig.testPathIgnorePatterns, + './src/scripts/test.js', + ], }); diff --git a/package.json b/package.json index aa4ad755..8854f4bc 100644 --- a/package.json +++ b/package.json @@ -102,13 +102,26 @@ "no-console": "off", "no-process-exit": "off", "global-require": "off", + "no-prototype-builtins": "off", "no-useless-catch": "off", "import/no-dynamic-require": "off", "import/no-unassigned-import": "off", "no-nested-ternary": "off", "no-use-before-define": "off", "no-restricted-syntax": "off", - "no-param-reassign": "off" + "no-param-reassign": "off", + "max-len": [ + "error", + 80, + 2, + { + "ignoreUrls": true, + "ignoreComments": true, + "ignoreRegExpLiterals": true, + "ignoreStrings": true, + "ignoreTemplateLiterals": true + } + ] } }, "commitlint": { diff --git a/src/__tests__/utils.js b/src/__tests__/utils.js index f507e05a..1bed4d4f 100644 --- a/src/__tests__/utils.js +++ b/src/__tests__/utils.js @@ -117,7 +117,9 @@ test('parseEnv parses the existing environment variable', () => { test(`parseEnv returns the default if the environment variable doesn't exist`, () => { const defaultVal = { hello: 'world' }; - expect(require('../utils').parseEnv('DOES_NOT_EXIST', defaultVal)).toBe(defaultVal); + expect(require('../utils').parseEnv('DOES_NOT_EXIST', defaultVal)).toBe( + defaultVal, + ); }); test('ifAnyDep returns the true argument if true and false argument if false', () => { diff --git a/src/config/babelrc.js b/src/config/babelrc.js index 1be78a6b..dc4c871d 100644 --- a/src/config/babelrc.js +++ b/src/config/babelrc.js @@ -1,7 +1,14 @@ const browserslist = require('browserslist'); const semver = require('semver'); -const { ifDep, ifAnyDep, ifTypescript, parseEnv, appDirectory, pkg } = require('../utils'); +const { + ifDep, + ifAnyDep, + ifTypescript, + parseEnv, + appDirectory, + pkg, +} = require('../utils'); const { BABEL_ENV, NODE_ENV, BUILD_FORMAT } = process.env; const isTest = (BABEL_ENV || NODE_ENV) === 'test'; @@ -13,7 +20,9 @@ const isWebpack = parseEnv('BUILD_WEBPACK', false); const treeshake = parseEnv('BUILD_TREESHAKE', isRollup || isWebpack); const alias = parseEnv('BUILD_ALIAS', isPreact ? { react: 'preact' } : null); -const hasBabelRuntimeDep = Boolean(pkg.dependencies && pkg.dependencies['@babel/runtime']); +const hasBabelRuntimeDep = Boolean( + pkg.dependencies && pkg.dependencies['@babel/runtime'], +); const RUNTIME_HELPERS_WARN = 'You should add @babel/runtime as dependency to your package. It will allow reusing "babel helpers" from node_modules rather than bundling their copies into your files.'; @@ -44,7 +53,10 @@ function getNodeVersion({ engines: { node: nodeVersion = '10.13' } = {} }) { * * @see https://github.com/browserslist/browserslist/blob/master/node.js#L139 */ -const browsersConfig = browserslist.loadConfig({ path: appDirectory }) || ['ie 10', 'ios 7']; +const browsersConfig = browserslist.loadConfig({ path: appDirectory }) || [ + 'ie 10', + 'ios 7', +]; const envTargets = isTest ? { node: 'current' } @@ -66,16 +78,31 @@ module.exports = () => ({ ifTypescript([require.resolve('@babel/preset-typescript')]), ].filter(Boolean), plugins: [ - [require.resolve('@babel/plugin-transform-runtime'), { useESModules: treeshake && !isCJS }], + [ + require.resolve('@babel/plugin-transform-runtime'), + { useESModules: treeshake && !isCJS }, + ], require.resolve('babel-plugin-macros'), - alias ? [require.resolve('babel-plugin-module-resolver'), { root: ['./src'], alias }] : null, + alias + ? [ + require.resolve('babel-plugin-module-resolver'), + { root: ['./src'], alias }, + ] + : null, [ require.resolve('babel-plugin-transform-react-remove-prop-types'), isPreact ? { removeImport: true } : { mode: 'unsafe-wrap' }, ], - isUMD ? require.resolve('babel-plugin-transform-inline-environment-variables') : null, - [require.resolve('@babel/plugin-proposal-class-properties'), { loose: true }], + isUMD + ? require.resolve('babel-plugin-transform-inline-environment-variables') + : null, + [ + require.resolve('@babel/plugin-proposal-class-properties'), + { loose: true }, + ], require.resolve('babel-plugin-minify-dead-code-elimination'), - treeshake ? null : require.resolve('@babel/plugin-transform-modules-commonjs'), + treeshake + ? null + : require.resolve('@babel/plugin-transform-modules-commonjs'), ].filter(Boolean), }); diff --git a/src/config/eslintrc.js b/src/config/eslintrc.js index 2aed3144..6ac90da4 100644 --- a/src/config/eslintrc.js +++ b/src/config/eslintrc.js @@ -1,8 +1,17 @@ const prettierConfig = require('./prettierrc'); +const { hasLocalConfig } = require('../utils'); + +const args = process.argv.slice(2); + +const useBuiltinConfig = + !args.includes('--config') && !hasLocalConfig('prettier'); +const ruleValue = useBuiltinConfig ? ['error', prettierConfig] : 'error'; module.exports = { extends: [require.resolve('eslint-config-codfish')].filter(Boolean), rules: { - 'prettier/prettier': ['error', prettierConfig], + // Explicitly set prettier rules to use our built in config if no + // local prettier config is found. + 'prettier/prettier': ruleValue, }, }; diff --git a/src/config/jest.config.js b/src/config/jest.config.js index 8a140091..ae13d5b2 100644 --- a/src/config/jest.config.js +++ b/src/config/jest.config.js @@ -20,9 +20,17 @@ const jestConfig = { testEnvironment: ifAnyDep(['webpack', 'rollup', 'react'], 'jsdom', 'node'), testURL: 'http://localhost', moduleFileExtensions: ['js', 'jsx', 'json', 'ts', 'tsx'], - moduleDirectories: ['node_modules', fromRoot('src'), 'shared', fromRoot('tests')], + moduleDirectories: [ + 'node_modules', + fromRoot('src'), + 'shared', + fromRoot('tests'), + ], collectCoverageFrom: ['src/**/*.+(js|jsx|ts|tsx)'], - testMatch: ['**/__tests__/**/*.+(js|jsx|ts|tsx)', '**/?(*.)+(spec|test).[jt]s?(x)'], + testMatch: [ + '**/__tests__/**/*.+(js|jsx|ts|tsx)', + '**/?(*.)+(spec|test).[jt]s?(x)', + ], testPathIgnorePatterns: [...ignores], coveragePathIgnorePatterns: [...ignores, 'src/(umd|cjs|esm)-entry.js$'], transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$'], @@ -41,7 +49,10 @@ const jestConfig = { }; const setupFilesAfterEnv = [ - ifAnyDep('@testing-library/jest-dom', '@testing-library/jest-dom/extend-expect'), + ifAnyDep( + '@testing-library/jest-dom', + '@testing-library/jest-dom/extend-expect', + ), ifFile('jest.setup.js', fromRoot('jest.setup.js')), ifFile('setupTests.js', fromRoot('setupTests.js')), ifFile('setupTests.js', fromRoot('setupTests.js')), @@ -55,7 +66,9 @@ if (setupFilesAfterEnv.length) { } if (useBuiltInBabelConfig) { - jestConfig.transform = { '^.+\\.(js|jsx|ts|tsx)$': here('./babel-transform') }; + jestConfig.transform = { + '^.+\\.(js|jsx|ts|tsx)$': here('./babel-transform'), + }; } if (jestConfig.testEnvironment === 'jsdom') { diff --git a/src/config/lintstagedrc.js b/src/config/lintstagedrc.js index 18a35bb2..1245b6e8 100644 --- a/src/config/lintstagedrc.js +++ b/src/config/lintstagedrc.js @@ -10,5 +10,8 @@ module.exports = { '*.+(json|yml|yaml|css|less|scss|ts|tsx|md|graphql|mdx|vue)': [ `${codScripts} format --no-eslint`, ].filter(Boolean), - '*.js': [`${codScripts} lint --fix`, `${codScripts} test --findRelatedTests`].filter(Boolean), + '*.js': [ + `${codScripts} lint --fix`, + `${codScripts} test --findRelatedTests`, + ].filter(Boolean), }; diff --git a/src/config/rollup.config.js b/src/config/rollup.config.js index 9b49ff1c..6e8aec8f 100644 --- a/src/config/rollup.config.js +++ b/src/config/rollup.config.js @@ -2,7 +2,10 @@ const path = require('path'); const { babel: rollupBabel } = require('@rollup/plugin-babel'); const commonjs = require('@rollup/plugin-commonjs'); const json = require('@rollup/plugin-json'); -const { DEFAULTS: nodeResolveDefaults, nodeResolve } = require('@rollup/plugin-node-resolve'); +const { + DEFAULTS: nodeResolveDefaults, + nodeResolve, +} = require('@rollup/plugin-node-resolve'); const replace = require('@rollup/plugin-replace'); const glob = require('glob'); @@ -37,22 +40,31 @@ const useSizeSnapshot = parseEnv('BUILD_SIZE_SNAPSHOT', false); const esm = format === 'esm'; const umd = format === 'umd'; -const defaultGlobals = Object.keys(pkg.peerDependencies || {}).reduce((deps, dep) => { - // eslint-disable-next-line no-param-reassign - deps[dep] = capitalize(camelcase(dep)); - return deps; -}, {}); +const defaultGlobals = Object.keys(pkg.peerDependencies || {}).reduce( + (deps, dep) => { + // eslint-disable-next-line no-param-reassign + deps[dep] = capitalize(camelcase(dep)); + return deps; + }, + {}, +); const deps = Object.keys(pkg.dependencies || {}); const peerDeps = Object.keys(pkg.peerDependencies || {}); const defaultExternal = umd ? peerDeps : deps.concat(peerDeps); const input = glob.sync( - fromRoot(process.env.BUILD_INPUT || (hasTypescript ? 'src/index.{js,ts,tsx}' : 'src/index.js')), + fromRoot( + process.env.BUILD_INPUT || + (hasTypescript ? 'src/index.{js,ts,tsx}' : 'src/index.js'), + ), ); const codeSplitting = input.length > 1; -if (codeSplitting && uniq(input.map(single => path.basename(single))).length !== input.length) { +if ( + codeSplitting && + uniq(input.map(single => path.basename(single))).length !== input.length +) { throw new Error( 'Filenames of code-splitted entries should be unique to get deterministic output filenames.' + `\nReceived those: ${input}.`, @@ -60,10 +72,13 @@ if (codeSplitting && uniq(input.map(single => path.basename(single))).length !== } const filenameSuffix = process.env.BUILD_FILENAME_SUFFIX || ''; -const filenamePrefix = process.env.BUILD_FILENAME_PREFIX || (isPreact ? 'preact/' : ''); +const filenamePrefix = + process.env.BUILD_FILENAME_PREFIX || (isPreact ? 'preact/' : ''); const globals = parseEnv( 'BUILD_GLOBALS', - isPreact ? Object.assign(defaultGlobals, { preact: 'preact' }) : defaultGlobals, + isPreact + ? Object.assign(defaultGlobals, { preact: 'preact' }) + : defaultGlobals, ); const external = parseEnv( 'BUILD_EXTERNAL', @@ -91,7 +106,13 @@ function externalPredicate(id) { return isDep || (!isRelative && !path.isAbsolute(id)) || isNodeModule; } -const filename = [pkg.name, filenameSuffix, `.${format}`, minify ? '.min' : null, '.js'] +const filename = [ + pkg.name, + filenameSuffix, + `.${format}`, + minify ? '.min' : null, + '.js', +] .filter(Boolean) .join(''); @@ -116,19 +137,18 @@ const useBuiltinConfig = !hasPkgProp('babel'); const babelPresets = useBuiltinConfig ? [here('../config/babelrc.js')] : []; -const replacements = Object.entries(umd ? process.env : omit(process.env, ['NODE_ENV'])).reduce( - (acc, [key, value]) => { - let val; - if (value === 'true' || value === 'false' || Number.isInteger(+value)) { - val = value; - } else { - val = JSON.stringify(value); - } - acc[`process.env.${key}`] = val; - return acc; - }, - {}, -); +const replacements = Object.entries( + umd ? process.env : omit(process.env, ['NODE_ENV']), +).reduce((acc, [key, value]) => { + let val; + if (value === 'true' || value === 'false' || Number.isInteger(+value)) { + val = value; + } else { + val = JSON.stringify(value); + } + acc[`process.env.${key}`] = val; + return acc; +}, {}); const extensions = hasTypescript ? [...nodeResolveDefaults.extensions, '.ts', '.tsx'] diff --git a/src/run-script.js b/src/run-script.js index f9d657a4..e1d6bd1a 100755 --- a/src/run-script.js +++ b/src/run-script.js @@ -72,7 +72,8 @@ function attemptResolve(...resolveArgs) { } function spawnScript() { - // get all the arguments of the script and find the position of our script commands + // get all the arguments of the script and find the position of our script + // commands const args = process.argv.slice(2); const scriptIndex = args.findIndex(x => [ diff --git a/src/scripts/build/babel.js b/src/scripts/build/babel.js index 856802d8..3041b2e8 100644 --- a/src/scripts/build/babel.js +++ b/src/scripts/build/babel.js @@ -24,7 +24,9 @@ const useBuiltinConfig = !hasFile('.babelrc.js') && !hasFile('babel.config.js') && !hasPkgProp('babel'); -const config = useBuiltinConfig ? ['--presets', here('../../config/babelrc.js')] : []; +const config = useBuiltinConfig + ? ['--presets', here('../../config/babelrc.js')] + : []; const extensions = args.includes('--extensions') || args.includes('--x') @@ -50,7 +52,14 @@ if (!useSpecifiedOutDir && !args.includes('--no-clean')) { function go() { let result = spawn.sync( resolveBin('@babel/cli', { executable: 'babel' }), - [...outDir, ...copyFiles, ...ignore, ...extensions, ...config, 'src'].concat(args), + [ + ...outDir, + ...copyFiles, + ...ignore, + ...extensions, + ...config, + 'src', + ].concat(args), { stdio: 'inherit' }, ); if (result.status !== 0) return result.status; diff --git a/src/scripts/build/rollup.js b/src/scripts/build/rollup.js index c55dcf9d..daadaa0d 100644 --- a/src/scripts/build/rollup.js +++ b/src/scripts/build/rollup.js @@ -21,7 +21,8 @@ const here = p => path.join(__dirname, p); const hereRelative = p => here(p).replace(process.cwd(), '.'); const parsedArgs = yargsParser(args); -const useBuiltinConfig = !args.includes('--config') && !hasFile('rollup.config.js'); +const useBuiltinConfig = + !args.includes('--config') && !hasFile('rollup.config.js'); // eslint-disable-next-line const config = useBuiltinConfig ? `--config ${hereRelative('../../config/rollup.config.js')}` @@ -29,7 +30,9 @@ const config = useBuiltinConfig ? '' : '--config'; // --config will pick up the rollup.config.js file -const environment = parsedArgs.environment ? `--environment ${parsedArgs.environment}` : ''; +const environment = parsedArgs.environment + ? `--environment ${parsedArgs.environment}` + : ''; const watch = parsedArgs.watch ? '--watch' : ''; const sizeSnapshot = parsedArgs['size-snapshot']; @@ -47,7 +50,9 @@ const getCommand = (env, ...flags) => .join(' '); const buildPreact = args.includes('--p-react'); -const scripts = getConcurrentlyArgs(buildPreact ? getPReactCommands() : getCommands()); +const scripts = getConcurrentlyArgs( + buildPreact ? getPReactCommands() : getCommands(), +); const cleanBuildDirs = !args.includes('--no-clean'); @@ -86,7 +91,10 @@ function go() { const [formatFile] = glob.sync(fromRoot(`dist/*.${format}.js`)); const { name } = path.parse(formatFile); // make a .d.ts file for every generated file that re-exports index.d.ts - fs.writeFileSync(fromRoot('dist', `${name}.d.ts`), 'export * from ".";\n'); + fs.writeFileSync( + fromRoot('dist', `${name}.d.ts`), + 'export * from ".";\n', + ); } // because typescript generates type defs for ignored files, we need to diff --git a/src/scripts/commitlint.js b/src/scripts/commitlint.js index 36ec5bb7..38d8cf54 100644 --- a/src/scripts/commitlint.js +++ b/src/scripts/commitlint.js @@ -15,7 +15,9 @@ const useBuiltinConfig = !hasFile('.commitlintrc.yml') && !hasPkgProp('commitlint'); -const config = useBuiltinConfig ? ['--config', hereRelative('../config/commitlint.config.js')] : []; +const config = useBuiltinConfig + ? ['--config', hereRelative('../config/commitlint.config.js')] + : []; const result = spawn.sync(resolveBin('commitlint'), [...config, ...args], { stdio: 'inherit', diff --git a/src/scripts/format.js b/src/scripts/format.js index 3bd8e2e5..31ac7753 100644 --- a/src/scripts/format.js +++ b/src/scripts/format.js @@ -1,7 +1,12 @@ const path = require('path'); const spawn = require('cross-spawn'); const yargsParser = require('yargs-parser'); -const { resolveBin, hasFile, hasLocalConfig, resolveCodScripts } = require('../utils'); +const { + resolveBin, + hasFile, + hasLocalConfig, + resolveCodScripts, +} = require('../utils'); const args = process.argv.slice(2); const parsedArgs = yargsParser(args); @@ -9,10 +14,16 @@ const parsedArgs = yargsParser(args); const here = p => path.join(__dirname, p); const hereRelative = p => here(p).replace(process.cwd(), '.'); -const useBuiltinConfig = !args.includes('--config') && !hasLocalConfig('prettier'); -const config = useBuiltinConfig ? ['--config', hereRelative('../config/prettierrc.js')] : []; -const useBuiltinIgnore = !args.includes('--ignore-path') && !hasFile('.prettierignore'); -const ignore = useBuiltinIgnore ? ['--ignore-path', hereRelative('../config/prettierignore')] : []; +const useBuiltinConfig = + !args.includes('--config') && !hasLocalConfig('prettier'); +const config = useBuiltinConfig + ? ['--config', hereRelative('../config/prettierrc.js')] + : []; +const useBuiltinIgnore = + !args.includes('--ignore-path') && !hasFile('.prettierignore'); +const ignore = useBuiltinIgnore + ? ['--ignore-path', hereRelative('../config/prettierignore')] + : []; const write = args.includes('--no-write') ? [] : ['--write']; @@ -36,8 +47,12 @@ if (prettierResult.status !== 0 || args.includes('--no-eslint')) { } // run eslint for js files (`eslint-plugin-prettier` will run prettier for us) -const eslintResult = spawn.sync(resolveCodScripts(), ['lint', '--fix'].concat(args), { - stdio: 'inherit', -}); +const eslintResult = spawn.sync( + resolveCodScripts(), + ['lint', '--fix'].concat(args), + { + stdio: 'inherit', + }, +); process.exit(eslintResult.status); diff --git a/src/scripts/lint.js b/src/scripts/lint.js index bb148a91..1bed23f8 100644 --- a/src/scripts/lint.js +++ b/src/scripts/lint.js @@ -14,20 +14,30 @@ const useBuiltinConfig = !hasFile('.eslintrc.js') && !hasPkgProp('eslintConfig'); -const config = useBuiltinConfig ? ['--config', hereRelative('../config/eslintrc.js')] : []; +const config = useBuiltinConfig + ? ['--config', hereRelative('../config/eslintrc.js')] + : []; const defaultExtensions = 'js,ts,tsx'; const ext = args.includes('--ext') ? [] : ['--ext', defaultExtensions]; const extensions = (parsedArgs.ext || defaultExtensions).split(','); const useBuiltinIgnore = - !args.includes('--ignore-path') && !hasFile('.eslintignore') && !hasPkgProp('eslintIgnore'); + !args.includes('--ignore-path') && + !hasFile('.eslintignore') && + !hasPkgProp('eslintIgnore'); -const ignore = useBuiltinIgnore ? ['--ignore-path', hereRelative('../config/eslintignore')] : []; +const ignore = useBuiltinIgnore + ? ['--ignore-path', hereRelative('../config/eslintignore')] + : []; const cache = args.includes('--no-cache') ? [] - : ['--cache', '--cache-location', fromRoot('node_modules/.cache/.eslintcache')]; + : [ + '--cache', + '--cache-location', + fromRoot('node_modules/.cache/.eslintcache'), + ]; const filesGiven = parsedArgs._.length > 0; const filesToApply = filesGiven ? [] : ['.']; @@ -36,7 +46,9 @@ if (filesGiven) { // we need to take all the flag-less arguments (the files that should be linted) // and filter out the ones that aren't js files. Otherwise json or css files // may be passed through - args = args.filter(a => !parsedArgs._.includes(a) || extensions.some(e => a.endsWith(e))); + args = args.filter( + a => !parsedArgs._.includes(a) || extensions.some(e => a.endsWith(e)), + ); } const result = spawn.sync( diff --git a/src/scripts/pre-commit.js b/src/scripts/pre-commit.js index 9ba7545f..1ea2c0fe 100644 --- a/src/scripts/pre-commit.js +++ b/src/scripts/pre-commit.js @@ -13,7 +13,9 @@ const useBuiltInConfig = !hasFile('lint-staged.config.js') && !hasPkgProp('lint-staged'); -const config = useBuiltInConfig ? ['--config', hereRelative('../config/lintstagedrc.js')] : []; +const config = useBuiltInConfig + ? ['--config', hereRelative('../config/lintstagedrc.js')] + : []; function go() { let result; diff --git a/src/scripts/test.js b/src/scripts/test.js index f00d3adb..d02dad7b 100644 --- a/src/scripts/test.js +++ b/src/scripts/test.js @@ -16,7 +16,9 @@ const watch = : []; const config = - !args.includes('--config') && !hasFile('jest.config.js') && !hasPkgProp('jest') + !args.includes('--config') && + !hasFile('jest.config.js') && + !hasPkgProp('jest') ? ['--config', JSON.stringify(require('../config/jest.config'))] : []; diff --git a/src/scripts/typecheck.js b/src/scripts/typecheck.js index 4f096064..283d5365 100644 --- a/src/scripts/typecheck.js +++ b/src/scripts/typecheck.js @@ -24,8 +24,12 @@ if (!parsedArgs.project && !parsedArgs.build && !parsedArgs.noBuild) { args = ['--build', ...args]; } -const result = spawn.sync(resolveBin('typescript', { executable: 'tsc' }), args, { - stdio: 'inherit', -}); +const result = spawn.sync( + resolveBin('typescript', { executable: 'tsc' }), + args, + { + stdio: 'inherit', + }, +); process.exit(result.status); diff --git a/src/scripts/validate.js b/src/scripts/validate.js index 67941d50..543ad0d3 100644 --- a/src/scripts/validate.js +++ b/src/scripts/validate.js @@ -1,5 +1,10 @@ const spawn = require('cross-spawn'); -const { parseEnv, resolveBin, ifScript, getConcurrentlyArgs } = require('../utils'); +const { + parseEnv, + resolveBin, + ifScript, + getConcurrentlyArgs, +} = require('../utils'); // pre-commit runs linting and tests on the relevant files // so those scripts don't need to be run if we're running @@ -14,7 +19,9 @@ const scripts = useDefaultScripts ? { build: ifScript('build', 'npm run build --silent'), lint: preCommit ? null : ifScript('lint', 'npm run lint --silent'), - test: preCommit ? null : ifScript('test', 'npm run test --silent -- --coverage'), + test: preCommit + ? null + : ifScript('test', 'npm run test --silent -- --coverage'), typecheck: ifScript('typecheck', 'npm run typecheck --silent'), } : validateScripts.split(',').reduce( @@ -28,9 +35,13 @@ const scripts = useDefaultScripts const scriptCount = Object.values(scripts).filter(Boolean).length; if (scriptCount > 0) { - const result = spawn.sync(resolveBin('concurrently'), getConcurrentlyArgs(scripts), { - stdio: 'inherit', - }); + const result = spawn.sync( + resolveBin('concurrently'), + getConcurrentlyArgs(scripts), + { + stdio: 'inherit', + }, + ); process.exit(result.status); } else { diff --git a/src/utils.js b/src/utils.js index 78b6b75f..4b3c2c5c 100644 --- a/src/utils.js +++ b/src/utils.js @@ -14,7 +14,10 @@ const { packageJson: pkg, path: pkgPath } = readPkgUp.sync({ }); const appDirectory = path.dirname(pkgPath); -function resolveBin(modName, { executable = modName, cwd = process.cwd() } = {}) { +function resolveBin( + modName, + { executable = modName, cwd = process.cwd() } = {}, +) { let pathFromWhich; try { pathFromWhich = fs.realpathSync(which.sync(executable)); @@ -53,13 +56,16 @@ function resolveCodScripts() { const fromRoot = (...p) => path.join(appDirectory, ...p); const hasFile = (...p) => fs.existsSync(fromRoot(...p)); -const ifFile = (files, t, f) => (arrify(files).some(file => hasFile(file)) ? t : f); +const ifFile = (files, t, f) => + arrify(files).some(file => hasFile(file)) ? t : f; const hasPkgProp = props => arrify(props).some(prop => has(pkg, prop)); -const hasPkgSubProp = pkgProp => props => hasPkgProp(arrify(props).map(p => `${pkgProp}.${p}`)); +const hasPkgSubProp = pkgProp => props => + hasPkgProp(arrify(props).map(p => `${pkgProp}.${p}`)); -const ifPkgSubProp = pkgProp => (props, t, f) => (hasPkgSubProp(pkgProp)(props) ? t : f); +const ifPkgSubProp = pkgProp => (props, t, f) => + hasPkgSubProp(pkgProp)(props) ? t : f; const hasScript = hasPkgSubProp('scripts'); const hasPeerDep = hasPkgSubProp('peerDependencies'); @@ -74,8 +80,11 @@ const ifAnyDep = (deps, t, f) => (hasAnyDep(arrify(deps)) ? t : f); const ifScript = ifPkgSubProp('scripts'); function envIsSet(name) { - // eslint-disable-next-line no-prototype-builtins - return process.env.hasOwnProperty(name) && process.env[name] && process.env[name] !== 'undefined'; + return ( + process.env.hasOwnProperty(name) && + process.env[name] && + process.env[name] !== 'undefined' + ); } const hasTypescript = hasAnyDep('typescript') && hasFile('tsconfig.json'); @@ -112,7 +121,11 @@ function getConcurrentlyArgs(scripts, { killOthers = true } = {}) { return all; }, {}); const prefixColors = Object.keys(scripts) - .reduce((pColors, _s, i) => pColors.concat([`${colors[i % colors.length]}.bold.white`]), []) + .reduce( + (pColors, _s, i) => + pColors.concat([`${colors[i % colors.length]}.bold.white`]), + [], + ) .join(','); // prettier-ignore @@ -121,7 +134,8 @@ function getConcurrentlyArgs(scripts, { killOthers = true } = {}) { '--prefix', '[{name}]', '--names', Object.keys(scripts).join(','), '--prefix-colors', prefixColors, - ...Object.values(scripts).map(s => JSON.stringify(s)), // stringify escapes quotes ✨ + ...Object.values(scripts) + .map(s => JSON.stringify(s)), // stringify escapes quotes ✨ ].filter(Boolean); }