UNPKG

@rajzik/lumos

Version:

Centralized CLI for JavaScript and TypeScript dev tools.

166 lines (165 loc) 6.46 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const core_1 = require("@beemo/core"); const lumos_common_1 = require("@rajzik/lumos-common"); const fs_1 = __importDefault(require("fs")); function hasNoPositionalArgs(context, name) { const args = context.args._; return args.length === 0 || (args.length === 1 && args[0] === name); } function createWorkspacesGlob(workspaces) { const paths = workspaces.map(p => p.replace('./', '')); return paths.length === 1 ? `${paths[0]}/` : `{${paths.join(',')}}/`; } function cli(tool) { const { buildFolder, docsFolder, srcFolder, testsFolder, typesFolder } = lumos_common_1.getSettings(); const usingBabel = tool.isPluginEnabled('driver', 'babel'); const usingPrettier = tool.isPluginEnabled('driver', 'prettier'); const usingJest = tool.isPluginEnabled('driver', 'jest'); const usingTypescript = tool.isPluginEnabled('driver', 'typescript'); const workspaces = tool.getWorkspacePaths({ relative: true }); const pathPrefix = workspaces.length ? createWorkspacesGlob(workspaces) : ''; const exts = ['.ts', '.tsx', '.js', '.jsx']; /** * BABEL * - Add default extensions. * - Add source and output dirs by default. */ tool.onRunDriver.listen((context, _) => { if (!context.args.extensions) { context.addOption('--extensions', exts.join(',')); } if (hasNoPositionalArgs(context, 'babel')) { context.addArg(`./${srcFolder}`); context.addOption('--out-dir', context.args.esm ? './esm' : `./${buildFolder}`); } }, 'babel'); /** * NEXT JS */ tool.onRunDriver.listen((_context, driver) => { if (!usingTypescript) { driver.options.dependencies.push('typescript'); } }, 'next'); /** * ESLINT * - Add default extensions. * - Lint source and test folders by default. * - Create a `tsconfig.eslint.json` file. */ tool.onRunDriver.listen((context, driver) => { context.addOptions(['--color']); if (!context.args.ext) { context.addOption('--ext', exts.join(',')); } if (hasNoPositionalArgs(context, 'eslint')) { const args = [`./${pathPrefix}${srcFolder}`]; if (usingJest) { args.push(`./${pathPrefix}${testsFolder}`); } context.addArgs(args); } if (usingPrettier) { driver.options.dependencies.push('prettier'); } // Create a specialized tsconfig for ESLint driver.onCreateConfigFile.listen(createContext => { const configPath = createContext.cwd.append('tsconfig.eslint.json'); const include = [`${typesFolder}/**/*`]; // Always allow global types let extendsFrom = './tsconfig.json'; if (workspaces.length === 0) { include.push(`${srcFolder}/**/*`, `${testsFolder}/**/*`); } else { extendsFrom = './tsconfig.options.json'; workspaces.forEach(ws => { const wsPath = new core_1.Path(ws); include.push(wsPath.append(`${srcFolder}/**/*`).path(), wsPath.append(`${testsFolder}/**/*`).path(), wsPath.append(`${typesFolder}/**/*`).path()); }); } fs_1.default.writeFileSync(configPath.path(), JSON.stringify({ extends: extendsFrom, include, }, null, 2), 'utf8'); createContext.addConfigPath('eslint', configPath); }); }, 'eslint'); /** * JEST * - Set common arguments. Include more during code coverage. * - Set environment variables by default. */ tool.onRunDriver.listen((context, driver) => { context.addOptions(['--colors']); if (context.args.coverage) { context.addOptions(['--logHeapUsage', '--detectOpenHandles']); } if (usingTypescript) { driver.options.dependencies.push('typescript'); } driver.options.env.NODE_ENV = 'test'; driver.options.env.TZ = 'UTC'; }, 'jest'); /** * PRETTIER * - Always write files. * - Glob a ton of files by default. */ tool.onRunDriver.listen(context => { context.addOption('--write'); if (hasNoPositionalArgs(context, 'prettier')) { context.addArgs([ `./${pathPrefix}{bin,hooks,scripts,${srcFolder},${testsFolder}}/**/*.{ts,tsx,js,jsx,scss,css,gql,graphql,yml,yaml,md}`, `./${docsFolder}/**/*.md`, './*.{md,json}', ]); } }, 'prettier'); /** * TYPESCRIPT * - Pass Lumos settings to the TS driver options. */ tool.onRunDriver.listen((_, driver) => { driver.configure({ // Dont want to pull in TS types. // @ts-expect-error buildFolder, srcFolder, testsFolder, typesFolder, }); }, 'typescript'); /** * WEBPACK * - Set common and custom arguments. * - Handle Babel and TS integration. */ tool.onRunDriver.listen((context, driver) => { context.addOptions(['--colors', '--progress', '--bail']); if (usingBabel) { driver.options.dependencies.push('babel'); // Babel 7.5 handles dynamic imports natively, which will break Webpack // when transforming to `commonjs`. So always force Babel to ESM mode. process.env.ESM = 'true'; } if (usingTypescript) { driver.options.dependencies.push('typescript'); } // Since webpack config uses references and doesn't have access to Beemo, // we need to set these environment variables for easy access. driver.configure({ env: { SOURCE_MAPS: context.args.sourceMaps ? 'true' : '', WEBPACK_ANALYZE: context.args.analyze ? 'true' : '', WEBPACK_PARALLEL: String(context.args.parallel || ''), LUMOS_BUILD_FOLDER: context.args.buildFolder, LUMOS_ENTRY_POINT: context.args.entryPoint, }, }); }, 'webpack'); } exports.default = cli;