prebundle
Version:
Prebundle Node.js dependencies, output a single js file, a package.json file and the dts files.
354 lines (353 loc) • 15.2 kB
JavaScript
import * as __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__ from "node:path";
import * as __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__ from "../compiled/fs-extra/index.js";
import * as __WEBPACK_EXTERNAL_MODULE_node_module_ab9f2194__ from "node:module";
import * as __WEBPACK_EXTERNAL_MODULE_node_url_e96de089__ from "node:url";
import * as __WEBPACK_EXTERNAL_MODULE__vercel_ncc_57e68fb3__ from "@vercel/ncc";
import * as __WEBPACK_EXTERNAL_MODULE__compiled_fast_glob_index_js_8d514d69__ from "../compiled/fast-glob/index.js";
import * as __WEBPACK_EXTERNAL_MODULE__compiled_rslog_index_js_c302f6e3__ from "../compiled/rslog/index.js";
import * as __WEBPACK_EXTERNAL_MODULE_rollup_plugin_dts_1c9650fc__ from "rollup-plugin-dts";
import * as __WEBPACK_EXTERNAL_MODULE_rollup__ from "rollup";
import * as __WEBPACK_EXTERNAL_MODULE_terser__ from "terser";
import * as __WEBPACK_EXTERNAL_MODULE_prettier__ from "prettier";
import * as __WEBPACK_EXTERNAL_MODULE_node_fs_5ea92f0c__ from "node:fs";
const DIST_DIR = 'compiled';
const DEFAULT_EXTERNALS = {
'./package.json': './package.json',
'../package.json': './package.json',
'../../package.json': './package.json'
};
const NODE_BUILTINS = [
'_stream_duplex',
'_stream_passthrough',
'_stream_readable',
'_stream_transform',
'_stream_writable',
'assert',
'buffer',
'child_process',
'cluster',
'console',
'constants',
'crypto',
'dgram',
'dns',
'domain',
'events',
'fs',
'http',
'https',
'module',
'net',
'os',
'path',
'process',
'punycode',
'querystring',
'readline',
'repl',
'stream',
'string_decoder',
'sys',
'timers',
'tls',
'tty',
'url',
'util',
'vm',
'zlib'
];
const cwd = process.cwd();
const helper_require = (0, __WEBPACK_EXTERNAL_MODULE_node_module_ab9f2194__.createRequire)(import.meta.url);
function findDepPath(name) {
try {
let entry = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.dirname)(helper_require.resolve((0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(name), {
paths: [
cwd
]
}));
while(!(0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.dirname)(entry).endsWith('node_modules'))entry = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.dirname)(entry);
if (name.includes('/')) return (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)((0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.dirname)(entry), name);
return entry;
} catch (err) {
return null;
}
}
const resolveConfig = async ()=>{
const configPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(cwd, 'prebundle.config.mjs');
const config = await import((0, __WEBPACK_EXTERNAL_MODULE_node_url_e96de089__.pathToFileURL)(configPath).href);
return config.default;
};
function parseTasks(dependencies, globalPrettier) {
const result = [];
for (const dep of dependencies){
const depName = 'string' == typeof dep ? dep : dep.name;
const importPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(cwd, DIST_DIR, depName);
const distPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(cwd, DIST_DIR, depName);
const depPath = findDepPath(depName);
if (!depPath) throw new Error(`Failed to resolve dependency: ${depName}`);
const depEntry = helper_require.resolve(depName, {
paths: [
cwd
]
});
const info = {
depName,
depPath,
depEntry,
distPath,
importPath
};
if ('string' == typeof dep) result.push({
minify: false,
target: 'es2019',
externals: {},
dtsExternals: [],
emitFiles: [],
packageJsonField: [],
prettier: globalPrettier,
...info
});
else result.push({
minify: dep.minify ?? false,
target: dep.target ?? 'es2019',
ignoreDts: dep.ignoreDts,
externals: dep.externals ?? {},
dtsExternals: dep.dtsExternals ?? [],
emitFiles: dep.emitFiles ?? [],
prettier: dep.prettier ?? globalPrettier,
afterBundle: dep.afterBundle,
beforeBundle: dep.beforeBundle,
packageJsonField: dep.packageJsonField ?? [],
...info
});
}
return result;
}
function pick(obj, keys) {
return keys.reduce((ret, key)=>{
if (void 0 !== obj[key]) ret[key] = obj[key];
return ret;
}, {});
}
function pkgNameToAtTypes(name) {
const mangled = name.replace(/^@([^\/]+)\/([^\/]+)/, '$1__$2');
return `@types/${mangled}`;
}
function findDirectTypeFile(filepath) {
if (/\.d\.[cm]?ts/.test(filepath)) return filepath;
const ext = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.extname)(filepath);
const base = filepath.slice(0, -ext.length);
const _find = (list)=>{
for (const f of list)try {
return helper_require.resolve(f, {
paths: [
cwd
]
});
} catch {}
};
switch(ext){
case '.js':
case '.ts':
return _find([
base + '.d.ts'
]);
case '.mjs':
case '.mts':
return _find([
base + '.d.mts',
base + '.d.ts'
]);
case '.cjs':
case '.cts':
return _find([
base + '.d.cts',
base + '.d.ts'
]);
default:
}
}
const { logger } = __WEBPACK_EXTERNAL_MODULE__compiled_rslog_index_js_c302f6e3__["default"];
function emitAssets(assets, distPath) {
for (const key of Object.keys(assets)){
const asset = assets[key];
__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].outputFileSync((0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(distPath, key), asset.source);
}
}
async function emitIndex(code, distPath, prettier) {
const distIndex = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(distPath, 'index.js');
if (prettier) {
const minimized = await (0, __WEBPACK_EXTERNAL_MODULE_terser__.minify)(code, {
compress: false,
mangle: false,
ecma: 2019
});
if (!minimized.code) throw new Error('terser minify failed');
const formatted = await (0, __WEBPACK_EXTERNAL_MODULE_prettier__.format)(minimized.code, {
filepath: distIndex
});
await __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].outputFile(distIndex, formatted);
} else await __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].outputFile(distIndex, code);
}
async function emitDts(task, externals) {
const outputDefaultDts = ()=>{
__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].outputFileSync((0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, 'index.d.ts'), 'export = any;\n');
};
if (task.ignoreDts) {
outputDefaultDts();
return;
}
const getTypes = (json)=>{
var _json_exports;
return json && (json.types || json.typing || json.typings || getTypes(null === (_json_exports = json.exports) || void 0 === _json_exports ? void 0 : _json_exports['.'])) || null;
};
const getInput = ()=>{
const pkgPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.depPath, 'package.json');
const pkgJson = __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].readJsonSync(pkgPath, 'utf-8');
const types = getTypes(pkgJson);
if (types) return (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.depPath, types);
const directTypeFile = findDirectTypeFile(task.depEntry);
if (directTypeFile) return directTypeFile;
const depTypesPath = findDepPath(`${pkgNameToAtTypes(task.depName)}/package.json`);
if (!depTypesPath) return null;
const depTypesPkg = __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].readJsonSync(depTypesPath, 'utf-8');
const depTypes = getTypes(depTypesPkg);
return depTypes ? (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)((0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.dirname)(depTypesPath), depTypes) : null;
};
const input = getInput();
if (!input) {
outputDefaultDts();
return;
}
try {
const inputConfig = {
input,
external: [
...Object.keys(externals),
...task.dtsExternals,
...NODE_BUILTINS
],
plugins: [
(0, __WEBPACK_EXTERNAL_MODULE_rollup_plugin_dts_1c9650fc__.dts)({
respectExternal: true,
compilerOptions: {
skipLibCheck: true,
preserveSymlinks: false,
composite: false,
declarationMap: false,
declaration: true,
noEmit: false,
emitDeclarationOnly: true,
noEmitOnError: true,
checkJs: false,
target: task.target
}
})
]
};
const outputConfig = {
dir: task.distPath,
format: 'esm',
exports: 'named',
entryFileNames: 'index.d.ts'
};
const bundle = await (0, __WEBPACK_EXTERNAL_MODULE_rollup__.rollup)(inputConfig);
await bundle.write(outputConfig);
} catch (error) {
logger.error(`rollup-plugin-dts failed: ${task.depName}`);
logger.error(error);
}
}
function emitPackageJson(task, assets) {
const packageJsonPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.depPath, 'package.json');
const packageJson = __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].readJsonSync(packageJsonPath, 'utf-8');
const outputPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, 'package.json');
const pickedPackageJson = pick(packageJson, [
'name',
'author',
'version',
'funding',
'license',
...task.packageJsonField
]);
if (task.depName !== pickedPackageJson.name) pickedPackageJson.name = task.depName;
pickedPackageJson.types = 'index.d.ts';
pickedPackageJson.type = 'commonjs';
if (assets['package.json']) try {
Object.assign(pickedPackageJson, pick(JSON.parse(assets['package.json'].source), [
'type'
]));
} catch {}
__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].writeJSONSync(outputPath, pickedPackageJson);
}
function emitLicense(task) {
const licensePath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.depPath, 'LICENSE');
if (__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].existsSync(licensePath)) __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].copySync(licensePath, (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, 'license'));
}
function emitExtraFiles(task) {
const { emitFiles } = task;
for (const item of emitFiles){
const path = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, item.path);
__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].outputFileSync(path, item.content);
}
}
function removeSourceMap(task) {
const maps = __WEBPACK_EXTERNAL_MODULE__compiled_fast_glob_index_js_8d514d69__["default"].sync((0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, '**/*.map'));
for (const mapPath of maps)__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].removeSync(mapPath);
}
function renameDistFolder(task) {
const pkgPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, 'package.json');
const pkgJson = __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].readJsonSync(pkgPath, 'utf-8');
for (const key of [
'types',
'typing',
'typings'
]){
var _pkgJson_key;
if (null === (_pkgJson_key = pkgJson[key]) || void 0 === _pkgJson_key ? void 0 : _pkgJson_key.startsWith('dist/')) {
pkgJson[key] = pkgJson[key].replace('dist/', 'types/');
const distFolder = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, 'dist');
const typesFolder = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(task.distPath, 'types');
if (__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].existsSync(distFolder)) __WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].renameSync(distFolder, typesFolder);
}
}
__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].writeJSONSync(pkgPath, pkgJson);
}
const pkgName = process.argv[2];
async function prebundle(task, commonExternals = {}) {
if (pkgName && task.depName !== pkgName) return;
logger.start(`prebundle: ${task.depName}`);
__WEBPACK_EXTERNAL_MODULE__compiled_fs_extra_index_js_a27e5f9c__["default"].removeSync(task.distPath);
if (task.beforeBundle) await task.beforeBundle(task);
const mergedExternals = {
...DEFAULT_EXTERNALS,
...commonExternals,
...task.externals
};
const nodeModulesPath = (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(process.cwd(), 'node_modules');
const hasNodeModules = (0, __WEBPACK_EXTERNAL_MODULE_node_fs_5ea92f0c__.existsSync)(nodeModulesPath);
const enableCache = !process.env.CI && hasNodeModules;
const { code, assets } = await (0, __WEBPACK_EXTERNAL_MODULE__vercel_ncc_57e68fb3__["default"])(task.depEntry, {
minify: task.minify,
target: task.target,
externals: mergedExternals,
assetBuilds: false,
cache: !!enableCache && (0, __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__.join)(nodeModulesPath, '.cache', 'ncc-cache')
});
await emitIndex(code, task.distPath, task.prettier);
emitAssets(assets, task.distPath);
await emitDts(task, mergedExternals);
emitLicense(task);
emitPackageJson(task, assets);
removeSourceMap(task);
renameDistFolder(task);
emitExtraFiles(task);
if (task.afterBundle) await task.afterBundle(task);
logger.success(`prebundle: ${task.depName}\n\n`);
}
async function run() {
const config = await resolveConfig();
const parsedTasks = parseTasks(config.dependencies, config.prettier);
for (const task of parsedTasks)await prebundle(task, config.externals);
}
export { run };