erp-web/node-jiti/dist-index.mjs.a1526ac0.js

1159 lines
37 KiB
JavaScript

"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.build = build;exports.defineBuildConfig = defineBuildConfig;exports.definePreset = definePreset;var _nodeModule = _interopRequireDefault(require("node:module"));
var _nodeFs = require("node:fs");
var _pathe = require("pathe");
var _chalk = _interopRequireDefault(require("chalk"));
var _consola = require("consola");
var _defu = require("defu");
var _hookable = require("hookable");
var _prettyBytes = _interopRequireDefault(require("pretty-bytes"));
var _globby = require("globby");
var _promises = _interopRequireWildcard(require("node:fs/promises"));
var _jiti = _interopRequireDefault(require("jiti"));
var _nodeUrl = require("node:url");
var _rollup = require("rollup");
var _pluginCommonjs = _interopRequireDefault(require("@rollup/plugin-commonjs"));
var _pluginNodeResolve = require("@rollup/plugin-node-resolve");
var _pluginAlias = _interopRequireDefault(require("@rollup/plugin-alias"));
var _rollupPluginDts = _interopRequireDefault(require("rollup-plugin-dts"));
var _pluginReplace = _interopRequireDefault(require("@rollup/plugin-replace"));
var _mlly = require("mlly");
var _esbuild = require("esbuild");
var _pluginutils = require("@rollup/pluginutils");
var _pluginJson = _interopRequireDefault(require("@rollup/plugin-json"));
var _magicString = _interopRequireDefault(require("magic-string"));
var _untyped = require("untyped");
var _babelPlugin = _interopRequireDefault(require("untyped/babel-plugin"));
var _scule = require("scule");
var _mkdist = require("mkdist");function _getRequireWildcardCache(nodeInterop) {if (typeof WeakMap !== "function") return null;var cacheBabelInterop = new WeakMap();var cacheNodeInterop = new WeakMap();return (_getRequireWildcardCache = function (nodeInterop) {return nodeInterop ? cacheNodeInterop : cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj, nodeInterop) {if (!nodeInterop && obj && obj.__esModule) {return obj;}if (obj === null || typeof obj !== "object" && typeof obj !== "function") {return { default: obj };}var cache = _getRequireWildcardCache(nodeInterop);if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
function defineBuildConfig(config) {
return (Array.isArray(config) ? config : [config]).filter(Boolean);
}
function definePreset(preset) {
return preset;
}
const autoPreset = definePreset(() => {
return {
hooks: {
"build:prepare"(ctx) {
if (!ctx.pkg || ctx.options.entries.length > 0) {
return;
}
const sourceFiles = listRecursively((0, _pathe.join)(ctx.options.rootDir, "src"));
const res = inferEntries(ctx.pkg, sourceFiles, ctx.options.rootDir);
for (const message of res.warnings) {
warn(ctx, message);
}
ctx.options.entries.push(...res.entries);
if (res.cjs) {
ctx.options.rollup.emitCJS = true;
}
if (res.dts) {
ctx.options.declaration = res.dts;
}
_consola.consola.info(
"Automatically detected entries:",
_chalk.default.cyan(
ctx.options.entries.map(
(e) => _chalk.default.bold(
e.input.replace(ctx.options.rootDir + "/", "").replace(/\/$/, "/*")
)
).join(", ")
),
_chalk.default.gray(
["esm", res.cjs && "cjs", res.dts && "dts"].filter(Boolean).map((tag) => `[${tag}]`).join(" ")
)
);
}
}
};
});
function inferEntries(pkg, sourceFiles, rootDir) {
const warnings = [];
sourceFiles.sort((a, b) => a.split("/").length - b.split("/").length);
const outputs = extractExportFilenames(pkg.exports);
if (pkg.bin) {
const binaries = typeof pkg.bin === "string" ? [pkg.bin] : Object.values(pkg.bin);
for (const file of binaries) {
outputs.push({ file });
}
}
if (pkg.main) {
outputs.push({ file: pkg.main });
}
if (pkg.module) {
outputs.push({ type: "esm", file: pkg.module });
}
if (pkg.types || pkg.typings) {
outputs.push({ file: pkg.types || pkg.typings });
}
const isESMPkg = pkg.type === "module";
for (const output of outputs.filter((o) => !o.type)) {
const isJS = output.file.endsWith(".js");
if (isESMPkg && isJS || output.file.endsWith(".mjs")) {
output.type = "esm";
} else if (!isESMPkg && isJS || output.file.endsWith(".cjs")) {
output.type = "cjs";
}
}
let cjs = false;
let dts = false;
const entries = [];
for (const output of outputs) {
const outputSlug = output.file.replace(
/(\*[^/\\]*|\.d\.(m|c)?ts|\.\w+)$/,
""
);
const isDir = outputSlug.endsWith("/");
if (isDir && ["./", "/"].includes(outputSlug)) {
continue;
}
const possiblePaths = getEntrypointPaths(outputSlug);
const input = possiblePaths.reduce((source, d) => {
if (source) {
return source;
}
const SOURCE_RE = new RegExp(`(?<=/|$)${d}${isDir ? "" : "\\.\\w+"}$`);
return sourceFiles.find((i) => SOURCE_RE.test(i))?.replace(/(\.d\.(m|c)?ts|\.\w+)$/, "");
}, void 0);
if (!input) {
if (!(0, _nodeFs.existsSync)((0, _pathe.resolve)(rootDir || ".", output.file))) {
warnings.push(`Could not find entrypoint for \`${output.file}\``);
}
continue;
}
if (output.type === "cjs") {
cjs = true;
}
const entry = entries.find((i) => i.input === input) || entries[entries.push({ input }) - 1];
if (/\.d\.(m|c)?ts$/.test(output.file)) {
dts = true;
}
if (isDir) {
entry.outDir = outputSlug;
entry.format = output.type;
}
}
return { entries, cjs, dts, warnings };
}
const getEntrypointPaths = (path) => {
const segments = (0, _pathe.normalize)(path).split("/");
return segments.map((_, index) => segments.slice(index).join("/")).filter(Boolean);
};
async function ensuredir(path) {
await _promises.default.mkdir((0, _pathe.dirname)(path), { recursive: true });
}
function warn(ctx, message) {
if (ctx.warnings.has(message)) {
return;
}
_consola.consola.debug("[unbuild] [warn]", message);
ctx.warnings.add(message);
}
async function symlink(from, to, force = true) {
await ensuredir(to);
if (force) {
await _promises.default.unlink(to).catch(() => {
});
}
await _promises.default.symlink(from, to, "junction");
}
function dumpObject(obj) {
return "{ " + Object.keys(obj).map((key) => `${key}: ${JSON.stringify(obj[key])}`).join(", ") + " }";
}
function getpkg(id = "") {
const s = id.split("/");
return s[0][0] === "@" ? `${s[0]}/${s[1]}` : s[0];
}
async function rmdir(dir) {
await _promises.default.unlink(dir).catch(() => {
});
await _promises.default.rm(dir, { recursive: true, force: true }).catch(() => {
});
}
function listRecursively(path) {
const filenames = /* @__PURE__ */new Set();
const walk = (path2) => {
const files = (0, _nodeFs.readdirSync)(path2);
for (const file of files) {
const fullPath = (0, _pathe.resolve)(path2, file);
if ((0, _nodeFs.statSync)(fullPath).isDirectory()) {
filenames.add(fullPath + "/");
walk(fullPath);
} else {
filenames.add(fullPath);
}
}
};
walk(path);
return [...filenames];
}
function tryRequire(id, rootDir = process.cwd()) {
const _require = (0, _jiti.default)(rootDir, { interopDefault: true, esmResolve: true });
try {
return _require(id);
} catch (error) {
if (error.code !== "MODULE_NOT_FOUND") {
console.error(`Error trying import ${id} from ${rootDir}`, error);
}
return {};
}
}
function tryResolve(id, rootDir = process.cwd()) {
const _require = (0, _jiti.default)(rootDir, { interopDefault: true, esmResolve: true });
try {
return _require.resolve(id);
} catch (error) {
if (error.code !== "MODULE_NOT_FOUND") {
console.error(`Error trying import ${id} from ${rootDir}`, error);
}
return id;
}
}
function resolvePreset(preset, rootDir) {
if (preset === "auto") {
preset = autoPreset;
} else if (typeof preset === "string") {
preset = tryRequire(preset, rootDir) || {};
}
if (typeof preset === "function") {
preset = preset();
}
return preset;
}
function inferExportType(condition, previousConditions = [], filename = "") {
if (filename) {
if (filename.endsWith(".d.ts")) {
return "esm";
}
if (filename.endsWith(".mjs")) {
return "esm";
}
if (filename.endsWith(".cjs")) {
return "cjs";
}
}
switch (condition) {
case "import":{
return "esm";
}
case "require":{
return "cjs";
}
default:{
if (previousConditions.length === 0) {
return "esm";
}
const [newCondition, ...rest] = previousConditions;
return inferExportType(newCondition, rest, filename);
}
}
}
function extractExportFilenames(exports, conditions = []) {
if (!exports) {
return [];
}
if (typeof exports === "string") {
return [{ file: exports, type: "esm" }];
}
return Object.entries(exports).filter(([subpath]) => !subpath.endsWith(".json")).flatMap(
([condition, exports2]) => typeof exports2 === "string" ? {
file: exports2,
type: inferExportType(condition, conditions, exports2)
} : extractExportFilenames(exports2, [...conditions, condition])
);
}
function arrayIncludes(arr, searchElement) {
return arr.some(
(entry) => entry instanceof RegExp ? entry.test(searchElement) : entry === searchElement
);
}
function removeExtension(filename) {
return filename.replace(/\.(js|mjs|cjs|ts|mts|cts|json|jsx|tsx)$/, "");
}
function validateDependencies(ctx) {
const usedDependencies = /* @__PURE__ */new Set();
const unusedDependencies = new Set(
Object.keys(ctx.pkg.dependencies || {})
);
const implicitDependencies = /* @__PURE__ */new Set();
for (const id of ctx.usedImports) {
unusedDependencies.delete(id);
usedDependencies.add(id);
}
if (Array.isArray(ctx.options.dependencies)) {
for (const id of ctx.options.dependencies) {
unusedDependencies.delete(id);
}
}
for (const id of usedDependencies) {
if (!arrayIncludes(ctx.options.externals, id) && !id.startsWith("chunks/") && !ctx.options.dependencies.includes(getpkg(id)) && !ctx.options.peerDependencies.includes(getpkg(id))) {
implicitDependencies.add(id);
}
}
if (unusedDependencies.size > 0) {
warn(
ctx,
"Potential unused dependencies found: " + [...unusedDependencies].map((id) => _chalk.default.cyan(id)).join(", ")
);
}
if (implicitDependencies.size > 0 && !ctx.options.rollup.inlineDependencies) {
warn(
ctx,
"Potential implicit dependencies found: " + [...implicitDependencies].map((id) => _chalk.default.cyan(id)).join(", ")
);
}
}
function validatePackage(pkg, rootDir, ctx) {
if (!pkg) {
return;
}
const filenames = new Set(
[
...(typeof pkg.bin === "string" ? [pkg.bin] : Object.values(pkg.bin || {})),
pkg.main,
pkg.module,
pkg.types,
pkg.typings,
...extractExportFilenames(pkg.exports).map((i) => i.file)].
map((i) => i && (0, _pathe.resolve)(rootDir, i.replace(/\/[^/]*\*.*$/, "")))
);
const missingOutputs = [];
for (const filename of filenames) {
if (filename && !filename.includes("*") && !(0, _nodeFs.existsSync)(filename)) {
missingOutputs.push(filename.replace(rootDir + "/", ""));
}
}
if (missingOutputs.length > 0) {
warn(
ctx,
`Potential missing package.json files: ${missingOutputs.map((o) => _chalk.default.cyan(o)).join(", ")}`
);
}
}
const DefaultLoaders = {
".js": "js",
".mjs": "js",
".cjs": "js",
".ts": "ts",
".mts": "ts",
".cts": "ts",
".tsx": "tsx",
".jsx": "jsx"
};
function esbuild(options) {
const {
include = /\.(ts|js|tsx|jsx)$/,
exclude = /node_modules/,
loaders: loaderOptions,
...esbuildOptions
} = options;
const loaders = { ...DefaultLoaders };
if (loaderOptions) {
for (const [key, value] of Object.entries(loaderOptions)) {
if (typeof value === "string") {
loaders[key] = value;
} else if (value === false) {
delete loaders[key];
}
}
}
const getLoader = (id = "") => {
return loaders[(0, _pathe.extname)(id)];
};
const filter = (0, _pluginutils.createFilter)(include, exclude);
return {
name: "esbuild",
async transform(code, id) {
if (!filter(id)) {
return null;
}
const loader = getLoader(id);
if (!loader) {
return null;
}
const result = await (0, _esbuild.transform)(code, {
...esbuildOptions,
loader,
sourcefile: id
});
printWarnings(id, result, this);
return result.code && {
code: result.code,
map: result.map || null
};
},
async renderChunk(code, { fileName }) {
if (!options.minify) {
return null;
}
if (/\.d\.(c|m)?tsx?$/.test(fileName)) {
return null;
}
const loader = getLoader(fileName);
if (!loader) {
return null;
}
const result = await (0, _esbuild.transform)(code, {
...esbuildOptions,
loader,
sourcefile: fileName,
minify: true
});
if (result.code) {
return {
code: result.code,
map: result.map || null
};
}
}
};
}
function printWarnings(id, result, plugin) {
if (result.warnings) {
for (const warning of result.warnings) {
let message = "[esbuild]";
if (warning.location) {
message += ` (${(0, _pathe.relative)(process.cwd(), id)}:${warning.location.line}:${warning.location.column})`;
}
message += ` ${warning.text}`;
plugin.warn(message);
}
}
}
const EXPORT_DEFAULT = "export default ";
function JSONPlugin(options) {
const plugin = (0, _pluginJson.default)(options);
return {
...plugin,
name: "unbuild-json",
transform(code, id) {
const res = plugin.transform.call(this, code, id);
if (res && typeof res !== "string" && "code" in res && res.code && res.code.startsWith(EXPORT_DEFAULT)) {
res.code = res.code.replace(EXPORT_DEFAULT, "module.exports = ");
}
return res;
}
};
}
const defaults = {
include: [/\.(md|txt|css|htm|html)$/],
exclude: []
};
function rawPlugin(opts = {}) {
opts = { ...opts, ...defaults };
const filter = (0, _pluginutils.createFilter)(opts.include, opts.exclude);
return {
name: "unbuild-raw",
transform(code, id) {
if (filter(id)) {
return {
code: `export default ${JSON.stringify(code)}`,
map: null
};
}
}
};
}
function cjsPlugin(_opts) {
return {
name: "unbuild-cjs",
renderChunk(code, _chunk, opts) {
if (opts.format === "es") {
return CJSToESM(code);
}
return null;
}
};
}
const CJSyntaxRe = /__filename|__dirname|require\(|require\.resolve\(/;
const CJSShim = `
// -- Unbuild CommonJS Shims --
import __cjs_url__ from 'url';
import __cjs_path__ from 'path';
import __cjs_mod__ from 'module';
const __filename = __cjs_url__.fileURLToPath(import.meta.url);
const __dirname = __cjs_path__.dirname(__filename);
const require = __cjs_mod__.createRequire(import.meta.url);
`;
function CJSToESM(code) {
if (code.includes(CJSShim) || !CJSyntaxRe.test(code)) {
return null;
}
const lastESMImport = (0, _mlly.findStaticImports)(code).pop();
const indexToAppend = lastESMImport ? lastESMImport.end : 0;
const s = new _magicString.default(code);
s.appendRight(indexToAppend, CJSShim);
return {
code: s.toString(),
map: s.generateMap()
};
}
const SHEBANG_RE = /^#![^\n]*/;
function shebangPlugin(options = {}) {
const shebangs = /* @__PURE__ */new Map();
return {
name: "unbuild-shebang",
// @ts-ignore temp workaround
_options: options,
transform(code, mod) {
let shebang;
code = code.replace(SHEBANG_RE, (match) => {
shebang = match;
return "";
});
if (!shebang) {
return null;
}
shebangs.set(mod, shebang);
return { code, map: null };
},
renderChunk(code, chunk, { sourcemap }) {
if (options.preserve === false) {
return null;
}
const shebang = shebangs.get(chunk.facadeModuleId);
if (!shebang) {
return null;
}
const s = new _magicString.default(code);
s.prepend(`${shebang}
`);
return {
code: s.toString(),
map: sourcemap ? s.generateMap({ hires: true }) : null
};
},
async writeBundle(options2, bundle) {
for (const [fileName, output] of Object.entries(bundle)) {
if (output.type !== "chunk") {
continue;
}
if (output.code?.match(SHEBANG_RE)) {
const outFile = (0, _pathe.resolve)(options2.dir, fileName);
await makeExecutable(outFile);
}
}
}
};
}
async function makeExecutable(filePath) {
await _nodeFs.promises.chmod(
filePath,
493
/* rwx r-x r-x */
).catch(() => {
});
}
function getShebang(code, append = "\n") {
const m = code.match(SHEBANG_RE);
return m ? m + append : "";
}
const DEFAULT_EXTENSIONS = [
".ts",
".tsx",
".mjs",
".cjs",
".js",
".jsx",
".json"];
async function rollupBuild(ctx) {
if (ctx.options.stub) {
const jitiPath = await (0, _mlly.resolvePath)("jiti", { url: "file:///Users/xiatao/Documents/Outsourcing/haojing/erp-web/node_modules/.pnpm/unbuild@2.0.0_sass@1.75.0_typescript@5.4.5/node_modules/unbuild/dist/index.mjs" });
const serializedJitiOptions = JSON.stringify(
{
...ctx.options.stubOptions.jiti,
alias: {
...resolveAliases(ctx),
...ctx.options.stubOptions.jiti.alias
}
},
null,
2
);
for (const entry of ctx.options.entries.filter(
(entry2) => entry2.builder === "rollup"
)) {
const output = (0, _pathe.resolve)(
ctx.options.rootDir,
ctx.options.outDir,
entry.name
);
const resolvedEntry = (0, _pathe.normalize)(
tryResolve(entry.input, ctx.options.rootDir) || entry.input
);
const resolvedEntryWithoutExt = resolvedEntry.slice(
0,
Math.max(0, resolvedEntry.length - (0, _pathe.extname)(resolvedEntry).length)
);
const code = await _nodeFs.promises.readFile(resolvedEntry, "utf8");
const shebang = getShebang(code);
await (0, _promises.mkdir)((0, _pathe.dirname)(output), { recursive: true });
if (ctx.options.rollup.emitCJS) {
await (0, _promises.writeFile)(
output + ".cjs",
`${shebang}module.exports = require(${JSON.stringify(
jitiPath
)})(null, ${serializedJitiOptions})(${JSON.stringify(
resolvedEntry
)})`
);
}
const namedExports = await (0, _mlly.resolveModuleExportNames)(
resolvedEntry,
{
extensions: DEFAULT_EXTENSIONS
}
).catch((error) => {
warn(ctx, `Cannot analyze ${resolvedEntry} for exports:` + error);
return [];
});
const hasDefaultExport = namedExports.includes("default") || namedExports.length === 0;
await (0, _promises.writeFile)(
output + ".mjs",
shebang + [
`import jiti from ${JSON.stringify((0, _nodeUrl.pathToFileURL)(jitiPath).href)};`,
"",
`/** @type {import(${JSON.stringify(resolvedEntryWithoutExt)})} */`,
`const _module = jiti(null, ${serializedJitiOptions})(${JSON.stringify(
resolvedEntry
)});`,
hasDefaultExport ? "\nexport default _module;" : "",
...namedExports.filter((name) => name !== "default").map((name) => `export const ${name} = _module.${name};`)].
join("\n")
);
await (0, _promises.writeFile)(
output + ".d.ts",
[
`export * from ${JSON.stringify(resolvedEntryWithoutExt)};`,
hasDefaultExport ? `export { default } from ${JSON.stringify(
resolvedEntryWithoutExt
)};` : ""].
join("\n")
);
if (shebang) {
await makeExecutable(output + ".cjs");
await makeExecutable(output + ".mjs");
}
}
await ctx.hooks.callHook("rollup:done", ctx);
return;
}
const rollupOptions = getRollupOptions(ctx);
await ctx.hooks.callHook("rollup:options", ctx, rollupOptions);
if (Object.keys(rollupOptions.input).length === 0) {
return;
}
const buildResult = await (0, _rollup.rollup)(rollupOptions);
await ctx.hooks.callHook("rollup:build", ctx, buildResult);
const allOutputOptions = rollupOptions.output;
for (const outputOptions of allOutputOptions) {
const { output } = await buildResult.write(outputOptions);
const chunkFileNames = /* @__PURE__ */new Set();
const outputChunks = output.filter(
(e) => e.type === "chunk"
);
for (const entry of outputChunks) {
chunkFileNames.add(entry.fileName);
for (const id of entry.imports) {
ctx.usedImports.add(id);
}
if (entry.isEntry) {
ctx.buildEntries.push({
chunks: entry.imports.filter(
(i) => outputChunks.find((c) => c.fileName === i)
),
modules: Object.entries(entry.modules).map(([id, mod]) => ({
id,
bytes: mod.renderedLength
})),
path: entry.fileName,
bytes: Buffer.byteLength(entry.code, "utf8"),
exports: entry.exports
});
}
}
for (const chunkFileName of chunkFileNames) {
ctx.usedImports.delete(chunkFileName);
}
}
if (ctx.options.declaration) {
rollupOptions.plugins = rollupOptions.plugins || [];
const shebangPlugin2 = rollupOptions.plugins.find(
(p) => p && p.name === "unbuild-shebang"
);
shebangPlugin2._options.preserve = false;
rollupOptions.plugins.push((0, _rollupPluginDts.default)(ctx.options.rollup.dts));
await ctx.hooks.callHook("rollup:dts:options", ctx, rollupOptions);
const typesBuild = await (0, _rollup.rollup)(rollupOptions);
await ctx.hooks.callHook("rollup:dts:build", ctx, typesBuild);
if (ctx.options.rollup.emitCJS) {
await typesBuild.write({
dir: (0, _pathe.resolve)(ctx.options.rootDir, ctx.options.outDir),
entryFileNames: "[name].d.cts",
chunkFileNames: (chunk) => getChunkFilename(ctx, chunk, "d.cts")
});
}
await typesBuild.write({
dir: (0, _pathe.resolve)(ctx.options.rootDir, ctx.options.outDir),
entryFileNames: "[name].d.mts",
chunkFileNames: (chunk) => getChunkFilename(ctx, chunk, "d.mts")
});
if (ctx.options.declaration === true || ctx.options.declaration === "compatible") {
await typesBuild.write({
dir: (0, _pathe.resolve)(ctx.options.rootDir, ctx.options.outDir),
entryFileNames: "[name].d.ts",
chunkFileNames: (chunk) => getChunkFilename(ctx, chunk, "d.ts")
});
}
}
await ctx.hooks.callHook("rollup:done", ctx);
}
const getChunkFilename = (ctx, chunk, ext) => {
if (chunk.isDynamicEntry) {
return `chunks/[name].${ext}`;
}
return `shared/${ctx.options.name}.[hash].${ext}`;
};
function getRollupOptions(ctx) {
return {
input: Object.fromEntries(
ctx.options.entries.filter((entry) => entry.builder === "rollup").map((entry) => [
entry.name,
(0, _pathe.resolve)(ctx.options.rootDir, entry.input)]
)
),
output: [
ctx.options.rollup.emitCJS && {
dir: (0, _pathe.resolve)(ctx.options.rootDir, ctx.options.outDir),
entryFileNames: "[name].cjs",
chunkFileNames: (chunk) => getChunkFilename(ctx, chunk, "cjs"),
format: "cjs",
exports: "auto",
interop: "compat",
generatedCode: { constBindings: true },
externalLiveBindings: false,
freeze: false,
sourcemap: ctx.options.sourcemap,
...ctx.options.rollup.output
},
{
dir: (0, _pathe.resolve)(ctx.options.rootDir, ctx.options.outDir),
entryFileNames: "[name].mjs",
chunkFileNames: (chunk) => getChunkFilename(ctx, chunk, "mjs"),
format: "esm",
exports: "auto",
generatedCode: { constBindings: true },
externalLiveBindings: false,
freeze: false,
sourcemap: ctx.options.sourcemap,
...ctx.options.rollup.output
}].
filter(Boolean),
external(id) {
const pkg = getpkg(id);
const isExplicitExternal = arrayIncludes(ctx.options.externals, pkg) || arrayIncludes(ctx.options.externals, id);
if (isExplicitExternal) {
return true;
}
if (ctx.options.rollup.inlineDependencies || id[0] === "." || (0, _pathe.isAbsolute)(id) || /src[/\\]/.test(id) || id.startsWith(ctx.pkg.name)) {
return false;
}
if (!isExplicitExternal) {
warn(ctx, `Inlined implicit external ${id}`);
}
return isExplicitExternal;
},
onwarn(warning, rollupWarn) {
if (!warning.code || !["CIRCULAR_DEPENDENCY"].includes(warning.code)) {
rollupWarn(warning);
}
},
plugins: [
ctx.options.rollup.replace && (0, _pluginReplace.default)({
...ctx.options.rollup.replace,
values: {
...ctx.options.replace,
...ctx.options.rollup.replace.values
}
}),
ctx.options.rollup.alias && (0, _pluginAlias.default)({
...ctx.options.rollup.alias,
entries: resolveAliases(ctx)
}),
ctx.options.rollup.resolve && (0, _pluginNodeResolve.nodeResolve)({
extensions: DEFAULT_EXTENSIONS,
...ctx.options.rollup.resolve
}),
ctx.options.rollup.json && JSONPlugin({
...ctx.options.rollup.json
}),
shebangPlugin(),
ctx.options.rollup.esbuild && esbuild({
sourcemap: ctx.options.sourcemap,
...ctx.options.rollup.esbuild
}),
ctx.options.rollup.commonjs && (0, _pluginCommonjs.default)({
extensions: DEFAULT_EXTENSIONS,
...ctx.options.rollup.commonjs
}),
// Preserve dynamic imports for CommonJS
{
renderDynamicImport() {
return { left: "import(", right: ")" };
}
},
ctx.options.rollup.cjsBridge && cjsPlugin(),
rawPlugin()].
filter(Boolean)
};
}
function resolveAliases(ctx) {
const aliases = {
[ctx.pkg.name]: ctx.options.rootDir,
...ctx.options.alias
};
if (ctx.options.rollup.alias) {
if (Array.isArray(ctx.options.rollup.alias.entries)) {
Object.assign(
aliases,
Object.fromEntries(
ctx.options.rollup.alias.entries.map((entry) => {
return [entry.find, entry.replacement];
})
)
);
} else {
Object.assign(
aliases,
ctx.options.rollup.alias.entries || ctx.options.rollup.alias
);
}
}
return aliases;
}
async function typesBuild(ctx) {
const entries = ctx.options.entries.filter(
(entry) => entry.builder === "untyped"
);
await ctx.hooks.callHook("untyped:entries", ctx, entries);
for (const entry of entries) {
const options = {
jiti: {
esmResolve: true,
interopDefault: true,
transformOptions: {
babel: {
plugins: [_babelPlugin.default]
}
}
}
};
await ctx.hooks.callHook("untyped:entry:options", ctx, entry, options);
const _require = (0, _jiti.default)(ctx.options.rootDir, options.jiti);
const distDir = entry.outDir;
const srcConfig = _require((0, _pathe.resolve)(ctx.options.rootDir, entry.input));
const defaults = entry.defaults || {};
const schema = await (0, _untyped.resolveSchema)(srcConfig, defaults);
await ctx.hooks.callHook("untyped:entry:schema", ctx, entry, schema);
const outputs = {
markdown: {
fileName: (0, _pathe.resolve)(distDir, `${entry.name}.md`),
contents: (0, _untyped.generateMarkdown)(schema)
},
schema: {
fileName: `${entry.name}.schema.json`,
contents: JSON.stringify(schema, null, 2)
},
defaults: {
fileName: `${entry.name}.defaults.json`,
contents: JSON.stringify(defaults, null, 2)
},
declaration: entry.declaration ? {
fileName: `${entry.name}.d.ts`,
contents: (0, _untyped.generateTypes)(schema, {
interfaceName: (0, _scule.pascalCase)(entry.name + "-schema")
})
} : void 0
};
await ctx.hooks.callHook("untyped:entry:outputs", ctx, entry, outputs);
for (const output of Object.values(outputs)) {
await (0, _promises.writeFile)(
(0, _pathe.resolve)(distDir, output.fileName),
output.contents,
"utf8"
);
}
}
await ctx.hooks.callHook("untyped:done", ctx);
}
async function mkdistBuild(ctx) {
const entries = ctx.options.entries.filter(
(e) => e.builder === "mkdist"
);
await ctx.hooks.callHook("mkdist:entries", ctx, entries);
for (const entry of entries) {
const distDir = entry.outDir;
if (ctx.options.stub) {
await rmdir(distDir);
await symlink(entry.input, distDir);
} else {
const mkdistOptions = {
rootDir: ctx.options.rootDir,
srcDir: entry.input,
distDir,
cleanDist: false,
...entry
};
await ctx.hooks.callHook(
"mkdist:entry:options",
ctx,
entry,
mkdistOptions
);
const output = await (0, _mkdist.mkdist)(mkdistOptions);
ctx.buildEntries.push({
path: distDir,
chunks: output.writtenFiles.map((p) => (0, _pathe.relative)(ctx.options.outDir, p))
});
await ctx.hooks.callHook("mkdist:entry:build", ctx, entry, output);
}
}
await ctx.hooks.callHook("mkdist:done", ctx);
}
async function build(rootDir, stub, inputConfig = {}) {
rootDir = (0, _pathe.resolve)(process.cwd(), rootDir || ".");
const _buildConfig = tryRequire("./build.config", rootDir) || {};
const buildConfigs = (Array.isArray(_buildConfig) ? _buildConfig : [_buildConfig]).filter(Boolean);
const pkg = tryRequire("./package.json", rootDir) || {};
const cleanedDirs = [];
for (const buildConfig of buildConfigs) {
await _build(rootDir, stub, inputConfig, buildConfig, pkg, cleanedDirs);
}
}
async function _build(rootDir, stub, inputConfig = {}, buildConfig, pkg, cleanedDirs) {
const preset = resolvePreset(
buildConfig.preset || pkg.unbuild?.preset || pkg.build?.preset || inputConfig.preset || "auto",
rootDir
);
const options = (0, _defu.defu)(
buildConfig,
pkg.unbuild || pkg.build,
inputConfig,
preset,
{
name: (pkg?.name || "").split("/").pop() || "default",
rootDir,
entries: [],
clean: true,
declaration: false,
outDir: "dist",
stub,
stubOptions: {
/**
* See https://github.com/unjs/jiti#options
*/
jiti: {
esmResolve: true,
interopDefault: true,
alias: {}
}
},
externals: [
..._nodeModule.default.builtinModules,
..._nodeModule.default.builtinModules.map((m) => "node:" + m)],
dependencies: [],
devDependencies: [],
peerDependencies: [],
alias: {},
replace: {},
failOnWarn: true,
sourcemap: false,
rollup: {
emitCJS: false,
cjsBridge: false,
inlineDependencies: false,
// Plugins
replace: {
preventAssignment: true
},
alias: {},
resolve: {
preferBuiltins: true
},
json: {
preferConst: true
},
commonjs: {
ignoreTryCatch: true
},
esbuild: { target: "es2020" },
dts: {
// https://github.com/Swatinem/rollup-plugin-dts/issues/143
compilerOptions: { preserveSymlinks: false },
respectExternal: true
}
}
}
);
options.outDir = (0, _pathe.resolve)(options.rootDir, options.outDir);
const ctx = {
options,
warnings: /* @__PURE__ */new Set(),
pkg,
buildEntries: [],
usedImports: /* @__PURE__ */new Set(),
hooks: (0, _hookable.createHooks)()
};
if (preset.hooks) {
ctx.hooks.addHooks(preset.hooks);
}
if (inputConfig.hooks) {
ctx.hooks.addHooks(inputConfig.hooks);
}
if (buildConfig.hooks) {
ctx.hooks.addHooks(buildConfig.hooks);
}
await ctx.hooks.callHook("build:prepare", ctx);
options.entries = options.entries.map(
(entry) => typeof entry === "string" ? { input: entry } : entry
);
for (const entry of options.entries) {
if (typeof entry.name !== "string") {
let relativeInput = (0, _pathe.isAbsolute)(entry.input) ? (0, _pathe.relative)(rootDir, entry.input) : (0, _pathe.normalize)(entry.input);
if (relativeInput.startsWith("./")) {
relativeInput = relativeInput.slice(2);
}
entry.name = removeExtension(relativeInput.replace(/^src\//, ""));
}
if (!entry.input) {
throw new Error("Missing entry input: " + dumpObject(entry));
}
if (!entry.builder) {
entry.builder = entry.input.endsWith("/") ? "mkdist" : "rollup";
}
if (options.declaration !== void 0 && entry.declaration === void 0) {
entry.declaration = options.declaration;
}
entry.input = (0, _pathe.resolve)(options.rootDir, entry.input);
entry.outDir = (0, _pathe.resolve)(options.rootDir, entry.outDir || options.outDir);
}
options.dependencies = Object.keys(pkg.dependencies || {});
options.peerDependencies = Object.keys(pkg.peerDependencies || {});
options.devDependencies = Object.keys(pkg.devDependencies || {});
options.externals.push(...options.dependencies, ...options.peerDependencies);
await ctx.hooks.callHook("build:before", ctx);
_consola.consola.info(
_chalk.default.cyan(`${options.stub ? "Stubbing" : "Building"} ${options.name}`)
);
if (process.env.DEBUG) {
_consola.consola.info(`${_chalk.default.bold("Root dir:")} ${options.rootDir}
${_chalk.default.bold("Entries:")}
${options.entries.map((entry) => " " + dumpObject(entry)).join("\n ")}
`);
}
if (options.clean) {
for (const dir of new Set(
options.entries.map((e) => e.outDir).filter(Boolean).sort()
)) {
if (cleanedDirs.some((c) => dir.startsWith(c))) {
continue;
}
cleanedDirs.push(dir);
_consola.consola.info(
`Cleaning dist directory: \`./${(0, _pathe.relative)(process.cwd(), dir)}\``
);
await rmdir(dir);
await _nodeFs.promises.mkdir(dir, { recursive: true });
}
}
await typesBuild(ctx);
await mkdistBuild(ctx);
await rollupBuild(ctx);
if (options.stub) {
await ctx.hooks.callHook("build:done", ctx);
return;
}
_consola.consola.success(_chalk.default.green("Build succeeded for " + options.name));
const outFiles = await (0, _globby.globby)("**", { cwd: options.outDir });
for (const file of outFiles) {
let entry = ctx.buildEntries.find((e) => e.path === file);
if (!entry) {
entry = {
path: file,
chunk: true
};
ctx.buildEntries.push(entry);
}
if (!entry.bytes) {
const stat = await _nodeFs.promises.stat((0, _pathe.resolve)(options.outDir, file));
entry.bytes = stat.size;
}
}
const rPath = (p) => (0, _pathe.relative)(process.cwd(), (0, _pathe.resolve)(options.outDir, p));
for (const entry of ctx.buildEntries.filter((e) => !e.chunk)) {
let totalBytes = entry.bytes || 0;
for (const chunk of entry.chunks || []) {
totalBytes += ctx.buildEntries.find((e) => e.path === chunk)?.bytes || 0;
}
let line = ` ${_chalk.default.bold(rPath(entry.path))} (` + [
totalBytes && `total size: ${_chalk.default.cyan((0, _prettyBytes.default)(totalBytes))}`,
entry.bytes && `chunk size: ${_chalk.default.cyan((0, _prettyBytes.default)(entry.bytes))}`,
entry.exports?.length && `exports: ${_chalk.default.gray(entry.exports.join(", "))}`].
filter(Boolean).join(", ") + ")";
if (entry.chunks?.length) {
line += "\n" + entry.chunks.map((p) => {
const chunk = ctx.buildEntries.find((e) => e.path === p) || {};
return _chalk.default.gray(
" \u2514\u2500 " + rPath(p) + _chalk.default.bold(
chunk.bytes ? ` (${(0, _prettyBytes.default)(chunk?.bytes)})` : ""
)
);
}).join("\n");
}
if (entry.modules?.length) {
line += "\n" + entry.modules.filter((m) => m.id.includes("node_modules")).sort((a, b) => (b.bytes || 0) - (a.bytes || 0)).map((m) => {
return _chalk.default.gray(
" \u{1F4E6} " + rPath(m.id) + _chalk.default.bold(m.bytes ? ` (${(0, _prettyBytes.default)(m.bytes)})` : "")
);
}).join("\n");
}
_consola.consola.log(entry.chunk ? _chalk.default.gray(line) : line);
}
console.log(
"\u03A3 Total dist size (byte size):",
_chalk.default.cyan(
(0, _prettyBytes.default)(ctx.buildEntries.reduce((a, e) => a + (e.bytes || 0), 0))
)
);
validateDependencies(ctx);
validatePackage(pkg, rootDir, ctx);
await ctx.hooks.callHook("build:done", ctx);
_consola.consola.log("");
if (ctx.warnings.size > 0) {
_consola.consola.warn(
"Build is done with some warnings:\n\n" + [...ctx.warnings].map((msg) => "- " + msg).join("\n")
);
if (ctx.options.failOnWarn) {
_consola.consola.error(
"Exiting with code (1). You can change this behavior by setting `failOnWarn: false` ."
);
process.exit(1);
}
}
} /* v7-3b6eca811e065baf */