@wyze/rio
Version:
A utility to compile Node modules.
124 lines (100 loc) • 3.19 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var meow = _interopDefault(require('meow'));
var rollup = require('rollup');
var bucklescript = _interopDefault(require('rollup-plugin-bucklescript'));
var builtins = _interopDefault(require('builtins'));
var commonjs = _interopDefault(require('@rollup/plugin-commonjs'));
var json = _interopDefault(require('@rollup/plugin-json'));
var readPkg = _interopDefault(require('read-pkg'));
var resolve = _interopDefault(require('@rollup/plugin-node-resolve'));
var sucrase = _interopDefault(require('@rollup/plugin-sucrase'));
function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
const whenMatch = (match, plugin) =>
match ? plugin() : undefined;
const maybeAddScript = (input) =>
whenMatch(/\.m?(j|t)sx?$/.test(input), () =>
sucrase({
exclude: ['node_modules/**'],
transforms: [whenMatch(/\.tsx?/.test(input), () => 'typescript')],
})
);
const maybeAddReason = (input) =>
whenMatch(/\.(ml|re)$/.test(input), bucklescript);
const options = {
inlineDynamicImports: false,
input: '', // Will be overwritten in build function
};
const build = async (input, flags) => {
const { binary, externals } = flags;
const banner = _nullishCoalesce(flags.banner, () => ( (binary ? '#!/usr/bin/env node' : undefined)));
const file = _nullishCoalesce(flags.output, () => ( (binary ? 'bin/index.js' : undefined)));
const format = flags.format;
const plugins = [
json(),
maybeAddScript(input),
maybeAddReason(input),
commonjs({
include: 'node_modules/**',
}),
resolve({
extensions: ['.mjs', '.js', '.json', '.ts'],
}),
].filter(Boolean);
const external = builtins()
.concat(
binary ? Object.keys((await readPkg()).dependencies || {}) : undefined
)
.concat(externals !== undefined ? externals.split(',') : undefined)
.filter(Boolean);
const bundle = await rollup.rollup({ ...options, external, input, plugins });
await bundle.write({ banner, file, format });
};
const cli = meow(
`
Usage
$ rio [options] <input>
Options
--banner, -b Add banner to top of output file
--binary Pass good defaults for binary files
--externals, -e Add external files that shouldn't be bundled
--format, -f Output file format (esm, umd, etc.)
--output, -o Output file
Examples
$ rio -o out.js in.ts
$ rio -o out.js -f esm in.ts
$ rio -o out.js -e chalk,debug in.ts
$ rio -o out.js -b '#!/usr/bin/env node' in.ts
$ rio --binary in.ts
`,
{
flags: {
banner: {
alias: 'b',
type: 'string',
},
binary: {
type: 'boolean',
},
externals: {
alias: 'e',
type: 'string',
},
format: {
alias: 'f',
type: 'string',
default: 'cjs',
},
output: {
alias: 'o',
type: 'string',
},
},
}
);
const { input, flags, showHelp } = cli;
if (input.length === 0) {
showHelp(0);
}
build(input[0], flags);
;