@rajzik/lumos
Version:
Centralized CLI for JavaScript and TypeScript dev tools.
166 lines (165 loc) • 6.46 kB
JavaScript
;
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;