UNPKG

rolldown

Version:

Fast JavaScript/TypeScript bundler in Rust with Rollup-compatible API.

1,376 lines (1,345 loc) • 99.9 kB
import { augmentCodeLocation, colors, error, import_binding, logCycleLoading, logInputHookInOutputPlugin, logInvalidLogPosition, logMinifyWarning, logMultiplyNotifyOption, logPluginError, parseAst } from "./parse-ast-index-BN2JFoRu.mjs"; import path from "node:path"; import * as v from "valibot"; import { toJsonSchema } from "@valibot/to-json-schema"; import { Buffer } from "node:buffer"; import { Worker } from "node:worker_threads"; import { availableParallelism } from "node:os"; //#region src/utils/define-config.ts function defineConfig(config) { return config; } //#endregion //#region src/utils/misc.ts function arraify(value) { return Array.isArray(value) ? value : [value]; } function isNullish(value) { return value === null || value === void 0; } function unimplemented(info) { if (info) throw new Error(`unimplemented: ${info}`); throw new Error("unimplemented"); } function unreachable(info) { if (info) throw new Error(`unreachable: ${info}`); throw new Error("unreachable"); } function unsupported(info) { throw new Error(`UNSUPPORTED: ${info}`); } function noop(..._args) {} //#endregion //#region src/log/logging.ts const LOG_LEVEL_SILENT = "silent"; const LOG_LEVEL_ERROR = "error"; const LOG_LEVEL_WARN = "warn"; const LOG_LEVEL_INFO = "info"; const LOG_LEVEL_DEBUG = "debug"; const logLevelPriority = { [LOG_LEVEL_DEBUG]: 0, [LOG_LEVEL_INFO]: 1, [LOG_LEVEL_WARN]: 2, [LOG_LEVEL_SILENT]: 3 }; //#endregion //#region src/log/log-handler.ts const normalizeLog = (log) => typeof log === "string" ? { message: log } : typeof log === "function" ? normalizeLog(log()) : log; function getLogHandler(level, code, logger, pluginName, logLevel) { if (logLevelPriority[level] < logLevelPriority[logLevel]) return noop; return (log, pos) => { if (pos != null) logger(LOG_LEVEL_WARN, logInvalidLogPosition(pluginName)); log = normalizeLog(log); if (log.code && !log.pluginCode) log.pluginCode = log.code; log.code = code; log.plugin = pluginName; logger(level, log); }; } //#endregion //#region src/utils/normalize-hook.ts function normalizeHook(hook) { if (typeof hook === "function" || typeof hook === "string") return { handler: hook, options: {}, meta: {} }; if (typeof hook === "object" && hook !== null) { const { handler, order,...options } = hook; return { handler, options, meta: { order } }; } unreachable("Invalid hook type"); } //#endregion //#region src/log/logger.ts function getLogger(plugins, onLog, logLevel) { const minimalPriority = logLevelPriority[logLevel]; const logger = (level, log, skipped = new Set()) => { const logPriority = logLevelPriority[level]; if (logPriority < minimalPriority) return; for (const plugin of getSortedPlugins("onLog", plugins)) { if (skipped.has(plugin)) continue; const { onLog: pluginOnLog } = plugin; if (pluginOnLog) { const getLogHandler$1 = (level$1) => { if (logLevelPriority[level$1] < minimalPriority) return () => {}; return (log$1) => logger(level$1, normalizeLog(log$1), new Set(skipped).add(plugin)); }; const handler = "handler" in pluginOnLog ? pluginOnLog.handler : pluginOnLog; if (handler.call({ debug: getLogHandler$1(LOG_LEVEL_DEBUG), error: (log$1) => error(normalizeLog(log$1)), info: getLogHandler$1(LOG_LEVEL_INFO), meta: { rollupVersion: "4.23.0", rolldownVersion: VERSION, watchMode: false }, warn: getLogHandler$1(LOG_LEVEL_WARN), pluginName: plugin.name || "unknown" }, level, log) === false) return; } } onLog(level, log); }; return logger; } const getOnLog = (config, logLevel, printLog = defaultPrintLog) => { const { onwarn, onLog } = config; const defaultOnLog = getDefaultOnLog(printLog, onwarn); if (onLog) { const minimalPriority = logLevelPriority[logLevel]; return (level, log) => onLog(level, addLogToString(log), (level$1, handledLog) => { if (level$1 === LOG_LEVEL_ERROR) return error(normalizeLog(handledLog)); if (logLevelPriority[level$1] >= minimalPriority) defaultOnLog(level$1, normalizeLog(handledLog)); }); } return defaultOnLog; }; const getDefaultOnLog = (printLog, onwarn) => onwarn ? (level, log) => { if (level === LOG_LEVEL_WARN) onwarn(addLogToString(log), (warning) => printLog(LOG_LEVEL_WARN, normalizeLog(warning))); else printLog(level, log); } : printLog; const addLogToString = (log) => { Object.defineProperty(log, "toString", { value: () => getExtendedLogMessage(log), writable: true }); return log; }; const defaultPrintLog = (level, log) => { const message = getExtendedLogMessage(log); switch (level) { case LOG_LEVEL_WARN: return console.warn(message); case LOG_LEVEL_DEBUG: return console.debug(message); default: return console.info(message); } }; const getExtendedLogMessage = (log) => { let prefix = ""; if (log.plugin) prefix += `(${log.plugin} plugin) `; if (log.loc) prefix += `${relativeId(log.loc.file)} (${log.loc.line}:${log.loc.column}) `; return prefix + log.message; }; function relativeId(id) { if (!path.isAbsolute(id)) return id; return path.relative(path.resolve(), id); } //#endregion //#region src/builtin-plugin/utils.ts function makeBuiltinPluginCallable(plugin) { let callablePlugin = new import_binding.BindingCallableBuiltinPlugin(bindingifyBuiltInPlugin(plugin)); const wrappedPlugin = plugin; for (const key in callablePlugin) wrappedPlugin[key] = function(...args) { return callablePlugin[key](...args); }; return wrappedPlugin; } function bindingifyBuiltInPlugin(plugin) { return { __name: plugin.name, options: plugin._options }; } //#endregion //#region src/builtin-plugin/constructors.ts var BuiltinPlugin = class { constructor(name, _options) { this.name = name; this._options = _options; } }; function modulePreloadPolyfillPlugin(config) { return new BuiltinPlugin("builtin:module-preload-polyfill", config); } function dynamicImportVarsPlugin() { return new BuiltinPlugin("builtin:dynamic-import-vars"); } function importGlobPlugin(config) { return new BuiltinPlugin("builtin:import-glob", config); } function manifestPlugin(config) { return new BuiltinPlugin("builtin:manifest", config); } function wasmHelperPlugin() { return new BuiltinPlugin("builtin:wasm-helper"); } function wasmFallbackPlugin() { return new BuiltinPlugin("builtin:wasm-fallback"); } function loadFallbackPlugin() { return new BuiltinPlugin("builtin:load-fallback"); } function jsonPlugin(config) { return new BuiltinPlugin("builtin:json", config); } function buildImportAnalysisPlugin(config) { return new BuiltinPlugin("builtin:build-import-analysis", config); } function viteResolvePlugin(config) { const builtinPlugin = new BuiltinPlugin("builtin:vite-resolve", { ...config, runtime: process.versions.deno ? "deno" : process.versions.bun ? "bun" : "node" }); return makeBuiltinPluginCallable(builtinPlugin); } function moduleFederationPlugin(config) { return new BuiltinPlugin("builtin:module-federation", { ...config, remotes: config.remotes && Object.entries(config.remotes).map(([name, remote]) => { if (typeof remote === "string") { const [entryGlobalName] = remote.split("@"); const entry = remote.replace(entryGlobalName + "@", ""); return { entry, name, entryGlobalName }; } return { ...remote, name: remote.name ?? name }; }), manifest: config.manifest === false ? void 0 : config.manifest === true ? {} : config.manifest }); } function isolatedDeclarationPlugin(config) { return new BuiltinPlugin("builtin:isolated-declaration", config); } //#endregion //#region src/utils/async-flatten.ts async function asyncFlatten(array) { do array = (await Promise.all(array)).flat(Infinity); while (array.some((v$1) => v$1?.then)); return array; } //#endregion //#region src/constants/plugin.ts const ENUMERATED_INPUT_PLUGIN_HOOK_NAMES = [ "options", "buildStart", "resolveId", "load", "transform", "moduleParsed", "buildEnd", "onLog", "resolveDynamicImport", "closeBundle", "closeWatcher", "watchChange" ]; const ENUMERATED_OUTPUT_PLUGIN_HOOK_NAMES = [ "augmentChunkHash", "outputOptions", "renderChunk", "renderStart", "renderError", "writeBundle", "generateBundle" ]; const ENUMERATED_PLUGIN_HOOK_NAMES = [ ...ENUMERATED_INPUT_PLUGIN_HOOK_NAMES, ...ENUMERATED_OUTPUT_PLUGIN_HOOK_NAMES, "footer", "banner", "intro", "outro" ]; const DEFINED_HOOK_NAMES = { [ENUMERATED_PLUGIN_HOOK_NAMES[0]]: ENUMERATED_PLUGIN_HOOK_NAMES[0], [ENUMERATED_PLUGIN_HOOK_NAMES[1]]: ENUMERATED_PLUGIN_HOOK_NAMES[1], [ENUMERATED_PLUGIN_HOOK_NAMES[2]]: ENUMERATED_PLUGIN_HOOK_NAMES[2], [ENUMERATED_PLUGIN_HOOK_NAMES[3]]: ENUMERATED_PLUGIN_HOOK_NAMES[3], [ENUMERATED_PLUGIN_HOOK_NAMES[4]]: ENUMERATED_PLUGIN_HOOK_NAMES[4], [ENUMERATED_PLUGIN_HOOK_NAMES[5]]: ENUMERATED_PLUGIN_HOOK_NAMES[5], [ENUMERATED_PLUGIN_HOOK_NAMES[6]]: ENUMERATED_PLUGIN_HOOK_NAMES[6], [ENUMERATED_PLUGIN_HOOK_NAMES[7]]: ENUMERATED_PLUGIN_HOOK_NAMES[7], [ENUMERATED_PLUGIN_HOOK_NAMES[8]]: ENUMERATED_PLUGIN_HOOK_NAMES[8], [ENUMERATED_PLUGIN_HOOK_NAMES[9]]: ENUMERATED_PLUGIN_HOOK_NAMES[9], [ENUMERATED_PLUGIN_HOOK_NAMES[10]]: ENUMERATED_PLUGIN_HOOK_NAMES[10], [ENUMERATED_PLUGIN_HOOK_NAMES[11]]: ENUMERATED_PLUGIN_HOOK_NAMES[11], [ENUMERATED_PLUGIN_HOOK_NAMES[12]]: ENUMERATED_PLUGIN_HOOK_NAMES[12], [ENUMERATED_PLUGIN_HOOK_NAMES[13]]: ENUMERATED_PLUGIN_HOOK_NAMES[13], [ENUMERATED_PLUGIN_HOOK_NAMES[14]]: ENUMERATED_PLUGIN_HOOK_NAMES[14], [ENUMERATED_PLUGIN_HOOK_NAMES[15]]: ENUMERATED_PLUGIN_HOOK_NAMES[15], [ENUMERATED_PLUGIN_HOOK_NAMES[16]]: ENUMERATED_PLUGIN_HOOK_NAMES[16], [ENUMERATED_PLUGIN_HOOK_NAMES[17]]: ENUMERATED_PLUGIN_HOOK_NAMES[17], [ENUMERATED_PLUGIN_HOOK_NAMES[18]]: ENUMERATED_PLUGIN_HOOK_NAMES[18], [ENUMERATED_PLUGIN_HOOK_NAMES[19]]: ENUMERATED_PLUGIN_HOOK_NAMES[19], [ENUMERATED_PLUGIN_HOOK_NAMES[20]]: ENUMERATED_PLUGIN_HOOK_NAMES[20], [ENUMERATED_PLUGIN_HOOK_NAMES[21]]: ENUMERATED_PLUGIN_HOOK_NAMES[21], [ENUMERATED_PLUGIN_HOOK_NAMES[22]]: ENUMERATED_PLUGIN_HOOK_NAMES[22] }; //#endregion //#region src/utils/normalize-plugin-option.ts const normalizePluginOption = async (plugins) => (await asyncFlatten([plugins])).filter(Boolean); function checkOutputPluginOption(plugins, onLog) { for (const plugin of plugins) for (const hook of ENUMERATED_INPUT_PLUGIN_HOOK_NAMES) if (hook in plugin) { delete plugin[hook]; onLog(LOG_LEVEL_WARN, logInputHookInOutputPlugin(plugin.name, hook)); } return plugins; } function normalizePlugins(plugins, anonymousPrefix) { for (const [index, plugin] of plugins.entries()) { if ("_parallel" in plugin) continue; if (plugin instanceof BuiltinPlugin) continue; if (!plugin.name) plugin.name = `${anonymousPrefix}${index + 1}`; } return plugins; } const ANONYMOUS_PLUGIN_PREFIX = "at position "; const ANONYMOUS_OUTPUT_PLUGIN_PREFIX = "at output position "; //#endregion //#region src/plugin/plugin-driver.ts var PluginDriver = class { static async callOptionsHook(inputOptions) { const logLevel = inputOptions.logLevel || LOG_LEVEL_INFO; const plugins = getSortedPlugins("options", getObjectPlugins(await normalizePluginOption(inputOptions.plugins))); const logger = getLogger(plugins, getOnLog(inputOptions, logLevel), logLevel); for (const plugin of plugins) { const name = plugin.name || "unknown"; const options = plugin.options; if (options) { const { handler } = normalizeHook(options); const result = await handler.call({ debug: getLogHandler(LOG_LEVEL_DEBUG, "PLUGIN_LOG", logger, name, logLevel), error: (e) => error(logPluginError(normalizeLog(e), name, { hook: "onLog" })), info: getLogHandler(LOG_LEVEL_INFO, "PLUGIN_LOG", logger, name, logLevel), meta: { rollupVersion: "4.23.0", rolldownVersion: VERSION, watchMode: false }, warn: getLogHandler(LOG_LEVEL_WARN, "PLUGIN_WARNING", logger, name, logLevel), pluginName: name }, inputOptions); if (result) inputOptions = result; } } return inputOptions; } static callOutputOptionsHook(rawPlugins, outputOptions) { const sortedPlugins = getSortedPlugins("outputOptions", getObjectPlugins(rawPlugins)); for (const plugin of sortedPlugins) { const options = plugin.outputOptions; if (options) { const { handler } = normalizeHook(options); const result = handler.call(null, outputOptions); if (result) outputOptions = result; } } return outputOptions; } }; function getObjectPlugins(plugins) { return plugins.filter((plugin) => { if (!plugin) return void 0; if ("_parallel" in plugin) return void 0; if (plugin instanceof BuiltinPlugin) return void 0; return plugin; }); } function getSortedPlugins(hookName, plugins) { const pre = []; const normal = []; const post = []; for (const plugin of plugins) { const hook = plugin[hookName]; if (hook) { if (typeof hook === "object") { if (hook.order === "pre") { pre.push(plugin); continue; } if (hook.order === "post") { post.push(plugin); continue; } } normal.push(plugin); } } return [ ...pre, ...normal, ...post ]; } //#endregion //#region src/utils/validator.ts const StringOrRegExpSchema = v.union([v.string(), v.instance(RegExp)]); const LogLevelSchema = v.union([ v.literal("debug"), v.literal("info"), v.literal("warn") ]); const LogLevelOptionSchema = v.union([LogLevelSchema, v.literal("silent")]); const LogLevelWithErrorSchema = v.union([LogLevelSchema, v.literal("error")]); const RollupLogSchema = v.any(); const RollupLogWithStringSchema = v.union([RollupLogSchema, v.string()]); const InputOptionSchema = v.union([ v.string(), v.array(v.string()), v.record(v.string(), v.string()) ]); const ExternalSchema = v.union([ StringOrRegExpSchema, v.array(StringOrRegExpSchema), v.pipe(v.function(), v.args(v.tuple([ v.string(), v.optional(v.string()), v.boolean() ])), v.returns(v.nullish(v.boolean()))) ]); const ModuleTypesSchema = v.record(v.string(), v.union([ v.literal("base64"), v.literal("binary"), v.literal("css"), v.literal("dataurl"), v.literal("empty"), v.literal("js"), v.literal("json"), v.literal("jsx"), v.literal("text"), v.literal("ts"), v.literal("tsx") ])); const JsxOptionsSchema = v.strictObject({ development: v.pipe(v.optional(v.boolean()), v.description("Development specific information")), factory: v.pipe(v.optional(v.string()), v.description("Jsx element transformation")), fragment: v.pipe(v.optional(v.string()), v.description("Jsx fragment transformation")), importSource: v.pipe(v.optional(v.string()), v.description("Import the factory of element and fragment if mode is classic")), jsxImportSource: v.pipe(v.optional(v.string()), v.description("Import the factory of element and fragment if mode is automatic")), mode: v.pipe(v.optional(v.union([ v.literal("classic"), v.literal("automatic"), v.literal("preserve") ])), v.description("Jsx transformation mode")), refresh: v.pipe(v.optional(v.boolean()), v.description("React refresh transformation")) }); const HelperModeSchema = v.union([v.literal("Runtime"), v.literal("External")]); const DecoratorOptionSchema = v.object({ legacy: v.optional(v.boolean()), emitDecoratorMetadata: v.optional(v.boolean()) }); const HelpersSchema = v.object({ mode: v.optional(HelperModeSchema) }); const RewriteImportExtensionsSchema = v.union([ v.literal("rewrite"), v.literal("remove"), v.boolean() ]); const TypescriptSchema = v.object({ jsxPragma: v.optional(v.string()), jsxPragmaFrag: v.optional(v.string()), onlyRemoveTypeImports: v.optional(v.boolean()), allowNamespaces: v.optional(v.boolean()), allowDeclareFields: v.optional(v.boolean()), declaration: v.optional(v.object({ stripInternal: v.optional(v.boolean()), sourcemap: v.optional(v.boolean()) })), rewriteImportExtensions: v.optional(RewriteImportExtensionsSchema) }); const AssumptionsSchema = v.object({ ignoreFunctionLength: v.optional(v.boolean()), noDocumentAll: v.optional(v.boolean()), objectRestNoSymbols: v.optional(v.boolean()), pureGetters: v.optional(v.boolean()), setPublicClassFields: v.optional(v.boolean()) }); const TransformOptionsSchema = v.object({ assumptions: v.optional(AssumptionsSchema), typescript: v.optional(TypescriptSchema), helpers: v.optional(HelpersSchema), decorators: v.optional(DecoratorOptionSchema) }); const WatchOptionsSchema = v.strictObject({ chokidar: v.optional(v.never(`The "watch.chokidar" option is deprecated, please use "watch.notify" instead of it`)), exclude: v.optional(v.union([StringOrRegExpSchema, v.array(StringOrRegExpSchema)])), include: v.optional(v.union([StringOrRegExpSchema, v.array(StringOrRegExpSchema)])), notify: v.pipe(v.optional(v.strictObject({ compareContents: v.optional(v.boolean()), pollInterval: v.optional(v.number()) })), v.description("Notify options")), skipWrite: v.pipe(v.optional(v.boolean()), v.description("Skip the bundle.write() step")), buildDelay: v.pipe(v.optional(v.number()), v.description("Throttle watch rebuilds")) }); const ChecksOptionsSchema = v.strictObject({ circularDependency: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting circular dependency")), eval: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting eval")), missingGlobalName: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting missing global name")), missingNameOptionForIifeExport: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting missing name option for iife export")), mixedExport: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting mixed export")), unresolvedEntry: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting unresolved entry")), unresolvedImport: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting unresolved import")), filenameConflict: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting filename conflict")), commonJsVariableInEsm: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting common js variable in esm")), importIsUndefined: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting import is undefined")), configurationFieldConflict: v.pipe(v.optional(v.boolean()), v.description("Whether to emit warning when detecting configuration field conflict")) }); const MinifyOptionsSchema = v.strictObject({ mangle: v.boolean(), compress: v.boolean(), deadCodeElimination: v.boolean(), removeWhitespace: v.boolean() }); const ResolveOptionsSchema = v.strictObject({ alias: v.optional(v.record(v.string(), v.union([v.string(), v.array(v.string())]))), aliasFields: v.optional(v.array(v.array(v.string()))), conditionNames: v.optional(v.array(v.string())), extensionAlias: v.optional(v.record(v.string(), v.array(v.string()))), exportsFields: v.optional(v.array(v.array(v.string()))), extensions: v.optional(v.array(v.string())), mainFields: v.optional(v.array(v.string())), mainFiles: v.optional(v.array(v.string())), modules: v.optional(v.array(v.string())), symlinks: v.optional(v.boolean()), tsconfigFilename: v.optional(v.string()) }); const TreeshakingOptionsSchema = v.union([v.boolean(), v.looseObject({ annotations: v.optional(v.boolean()), manualPureFunctions: v.optional(v.array(v.string())), unknownGlobalSideEffects: v.optional(v.boolean()) })]); const OnLogSchema = v.pipe(v.function(), v.args(v.tuple([ LogLevelSchema, RollupLogSchema, v.pipe(v.function(), v.args(v.tuple([LogLevelWithErrorSchema, RollupLogWithStringSchema]))) ]))); const OnwarnSchema = v.pipe(v.function(), v.args(v.tuple([RollupLogSchema, v.pipe(v.function(), v.args(v.tuple([v.union([RollupLogWithStringSchema, v.pipe(v.function(), v.returns(RollupLogWithStringSchema))])])))]))); const InputOptionsSchema = v.strictObject({ input: v.optional(InputOptionSchema), plugins: v.optional(v.custom(() => true)), external: v.optional(ExternalSchema), resolve: v.optional(ResolveOptionsSchema), cwd: v.pipe(v.optional(v.string()), v.description("Current working directory")), platform: v.pipe(v.optional(v.union([ v.literal("browser"), v.literal("neutral"), v.literal("node") ])), v.description(`Platform for which the code should be generated (node, ${colors.underline("browser")}, neutral)`)), shimMissingExports: v.pipe(v.optional(v.boolean()), v.description("Create shim variables for missing exports")), treeshake: v.optional(TreeshakingOptionsSchema), logLevel: v.pipe(v.optional(LogLevelOptionSchema), v.description(`Log level (${colors.dim("silent")}, ${colors.underline(colors.gray("info"))}, debug, ${colors.yellow("warn")})`)), onLog: v.optional(OnLogSchema), onwarn: v.optional(OnwarnSchema), moduleTypes: v.pipe(v.optional(ModuleTypesSchema), v.description("Module types for customized extensions")), experimental: v.optional(v.strictObject({ disableLiveBindings: v.optional(v.boolean()), enableComposingJsPlugins: v.optional(v.boolean()), resolveNewUrlToAsset: v.optional(v.boolean()), strictExecutionOrder: v.optional(v.boolean()), hmr: v.optional(v.boolean()) })), define: v.pipe(v.optional(v.record(v.string(), v.string())), v.description("Define global variables")), inject: v.optional(v.record(v.string(), v.union([v.string(), v.tuple([v.string(), v.string()])]))), profilerNames: v.optional(v.boolean()), jsx: v.optional(v.union([ v.boolean(), JsxOptionsSchema, v.string("react"), v.string("react-jsx"), v.string("preserve") ])), transform: v.optional(TransformOptionsSchema), watch: v.optional(v.union([WatchOptionsSchema, v.literal(false)])), dropLabels: v.pipe(v.optional(v.array(v.string())), v.description("Remove labeled statements with these label names")), checks: v.optional(ChecksOptionsSchema), keepNames: v.pipe(v.optional(v.boolean()), v.description("Keep function/class name")) }); const InputCliOverrideSchema = v.strictObject({ external: v.pipe(v.optional(v.array(v.string())), v.description("Comma-separated list of module ids to exclude from the bundle `<module-id>,...`")), inject: v.pipe(v.optional(v.record(v.string(), v.string())), v.description("Inject import statements on demand")), treeshake: v.pipe(v.optional(v.boolean()), v.description("enable treeshaking")), jsx: v.pipe(v.optional(JsxOptionsSchema), v.description("enable jsx")) }); const InputCliOptionsSchema = v.omit(v.strictObject({ ...InputOptionsSchema.entries, ...InputCliOverrideSchema.entries }), [ "input", "plugins", "onwarn", "onLog", "resolve", "experimental", "profilerNames", "watch" ]); var ESTarget = /* @__PURE__ */ function(ESTarget$1) { ESTarget$1["ES6"] = "es6"; ESTarget$1["ES2015"] = "es2015"; ESTarget$1["ES2016"] = "es2016"; ESTarget$1["ES2017"] = "es2017"; ESTarget$1["ES2018"] = "es2018"; ESTarget$1["ES2019"] = "es2019"; ESTarget$1["ES2020"] = "es2020"; ESTarget$1["ES2021"] = "es2021"; ESTarget$1["ES2022"] = "es2022"; ESTarget$1["ES2023"] = "es2023"; ESTarget$1["ES2024"] = "es2024"; ESTarget$1["ESNext"] = "esnext"; return ESTarget$1; }(ESTarget || {}); const ModuleFormatSchema = v.union([ v.literal("es"), v.literal("cjs"), v.literal("esm"), v.literal("module"), v.literal("commonjs"), v.literal("iife"), v.literal("umd") ]); const AddonFunctionSchema = v.pipe(v.function(), v.args(v.tuple([v.custom(() => true)])), v.returnsAsync(v.unionAsync([v.string(), v.pipeAsync(v.promise(), v.awaitAsync(), v.string())]))); const ChunkFileNamesSchema = v.union([v.string(), v.pipe(v.function(), v.args(v.tuple([v.custom(() => true)])), v.returns(v.string()))]); const AssetFileNamesSchema = v.union([v.string(), v.pipe(v.function(), v.args(v.tuple([v.custom(() => true)])), v.returns(v.string()))]); const SanitizeFileNameSchema = v.union([v.boolean(), v.pipe(v.function(), v.args(v.tuple([v.string()])), v.returns(v.string()))]); const GlobalsFunctionSchema = v.pipe(v.function(), v.args(v.tuple([v.string()])), v.returns(v.string())); const AdvancedChunksSchema = v.strictObject({ minSize: v.optional(v.number()), maxSize: v.optional(v.number()), minModuleSize: v.optional(v.number()), maxModuleSize: v.optional(v.number()), minShareCount: v.optional(v.number()), groups: v.optional(v.array(v.strictObject({ name: v.string(), test: v.optional(v.union([v.string(), v.instance(RegExp)])), priority: v.optional(v.number()), minSize: v.optional(v.number()), minShareCount: v.optional(v.number()), maxSize: v.optional(v.number()), minModuleSize: v.optional(v.number()), maxModuleSize: v.optional(v.number()) }))) }); const OutputOptionsSchema = v.strictObject({ dir: v.pipe(v.optional(v.string()), v.description("Output directory, defaults to `dist` if `file` is not set")), file: v.pipe(v.optional(v.string()), v.description("Single output file")), exports: v.pipe(v.optional(v.union([ v.literal("auto"), v.literal("named"), v.literal("default"), v.literal("none") ])), v.description(`Specify a export mode (${colors.underline("auto")}, named, default, none)`)), hashCharacters: v.pipe(v.optional(v.union([ v.literal("base64"), v.literal("base36"), v.literal("hex") ])), v.description("Use the specified character set for file hashes")), format: v.pipe(v.optional(ModuleFormatSchema), v.description(`Output format of the generated bundle (supports ${colors.underline("esm")}, cjs, and iife)`)), sourcemap: v.pipe(v.optional(v.union([ v.boolean(), v.literal("inline"), v.literal("hidden") ])), v.description(`Generate sourcemap (\`-s inline\` for inline, or ${colors.bold("pass the `-s` on the last argument if you want to generate `.map` file")})`)), sourcemapDebugIds: v.pipe(v.optional(v.boolean()), v.description("Inject sourcemap debug IDs")), sourcemapIgnoreList: v.optional(v.union([v.boolean(), v.custom(() => true)])), sourcemapPathTransform: v.optional(v.custom(() => true)), banner: v.optional(v.union([v.string(), AddonFunctionSchema])), footer: v.optional(v.union([v.string(), AddonFunctionSchema])), intro: v.optional(v.union([v.string(), AddonFunctionSchema])), outro: v.optional(v.union([v.string(), AddonFunctionSchema])), extend: v.pipe(v.optional(v.boolean()), v.description("Extend global variable defined by name in IIFE / UMD formats")), esModule: v.optional(v.union([v.boolean(), v.literal("if-default-prop")])), assetFileNames: v.optional(AssetFileNamesSchema), entryFileNames: v.optional(ChunkFileNamesSchema), chunkFileNames: v.optional(ChunkFileNamesSchema), cssEntryFileNames: v.optional(ChunkFileNamesSchema), cssChunkFileNames: v.optional(ChunkFileNamesSchema), sanitizeFileName: v.optional(SanitizeFileNameSchema), minify: v.pipe(v.optional(v.union([ v.boolean(), v.string("dce-only"), MinifyOptionsSchema ])), v.description("Minify the bundled file")), name: v.pipe(v.optional(v.string()), v.description("Name for UMD / IIFE format outputs")), globals: v.pipe(v.optional(v.union([v.record(v.string(), v.string()), GlobalsFunctionSchema])), v.description("Global variable of UMD / IIFE dependencies (syntax: `key=value`)")), externalLiveBindings: v.pipe(v.optional(v.boolean()), v.description("external live bindings")), inlineDynamicImports: v.pipe(v.optional(v.boolean()), v.description("Inline dynamic imports")), advancedChunks: v.optional(AdvancedChunksSchema), comments: v.pipe(v.optional(v.union([v.literal("none"), v.literal("preserve-legal")])), v.description("Control comments in the output")), target: v.pipe(v.optional(v.enum(ESTarget)), v.description("The JavaScript target environment")), plugins: v.optional(v.custom(() => true)) }); const getAddonDescription = (placement, wrapper) => { return `Code to insert the ${colors.bold(placement)} of the bundled file (${colors.bold(wrapper)} the wrapper function)`; }; const OutputCliOverrideSchema = v.strictObject({ assetFileNames: v.pipe(v.optional(v.string()), v.description("Name pattern for asset files")), entryFileNames: v.pipe(v.optional(v.string()), v.description("Name pattern for emitted entry chunks")), chunkFileNames: v.pipe(v.optional(v.string()), v.description("Name pattern for emitted secondary chunks")), cssEntryFileNames: v.pipe(v.optional(v.string()), v.description("Name pattern for emitted css entry chunks")), cssChunkFileNames: v.pipe(v.optional(v.string()), v.description("Name pattern for emitted css secondary chunks")), sanitizeFileName: v.pipe(v.optional(v.boolean()), v.description("Sanitize file name")), banner: v.pipe(v.optional(v.string()), v.description(getAddonDescription("top", "outside"))), footer: v.pipe(v.optional(v.string()), v.description(getAddonDescription("bottom", "outside"))), intro: v.pipe(v.optional(v.string()), v.description(getAddonDescription("top", "inside"))), outro: v.pipe(v.optional(v.string()), v.description(getAddonDescription("bottom", "inside"))), esModule: v.pipe(v.optional(v.boolean()), v.description("Always generate `__esModule` marks in non-ESM formats, defaults to `if-default-prop` (use `--no-esModule` to always disable)")), globals: v.pipe(v.optional(v.record(v.string(), v.string())), v.description("Global variable of UMD / IIFE dependencies (syntax: `key=value`)")), advancedChunks: v.pipe(v.optional(v.strictObject({ minSize: v.pipe(v.optional(v.number()), v.description("Minimum size of the chunk")), minShareCount: v.pipe(v.optional(v.number()), v.description("Minimum share count of the chunk")) })), v.description("Global variable of UMD / IIFE dependencies (syntax: `key=value`)")), minify: v.pipe(v.optional(v.boolean()), v.description("Minify the bundled file")) }); const OutputCliOptionsSchema = v.omit(v.strictObject({ ...OutputOptionsSchema.entries, ...OutputCliOverrideSchema.entries }), [ "sourcemapIgnoreList", "sourcemapPathTransform", "plugins" ]); const CliOptionsSchema = v.strictObject({ config: v.pipe(v.optional(v.union([v.string(), v.boolean()])), v.description("Path to the config file (default: `rolldown.config.js`)")), help: v.pipe(v.optional(v.boolean()), v.description("Show help")), version: v.pipe(v.optional(v.boolean()), v.description("Show version number")), watch: v.pipe(v.optional(v.boolean()), v.description("Watch files in bundle and rebuild on changes")), ...InputCliOptionsSchema.entries, ...OutputCliOptionsSchema.entries }); function validateCliOptions(options) { let parsed = v.safeParse(CliOptionsSchema, options); return [parsed.output, parsed.issues?.map((issue) => { const option = issue.path?.map((pathItem) => pathItem.key).join(" "); return `Invalid value for option ${option}: ${issue.message}`; })]; } const inputHelperMsgRecord = { output: { ignored: true } }; const outputHelperMsgRecord = {}; function validateOption(key, options) { if (process.env.ROLLDOWN_OPTIONS_VALIDATION === "loose") return; let parsed = v.safeParse(key === "input" ? InputOptionsSchema : OutputOptionsSchema, options); if (!parsed.success) { const errors = parsed.issues.map((issue) => { const issuePaths = issue.path.map((path$1) => path$1.key); let issueMsg = issue.message; if (issue.type === "union") { const subIssue = issue.issues?.find((i) => !(i.type !== issue.received && i.input === issue.input)); if (subIssue) { if (subIssue.path) issuePaths.push(subIssue.path.map((path$1) => path$1.key)); issueMsg = subIssue.message; } } const stringPath = issuePaths.join("."); const helper = key === "input" ? inputHelperMsgRecord[stringPath] : outputHelperMsgRecord[stringPath]; if (helper && helper.ignored) return ""; return `- For the "${stringPath}". ${issueMsg}. ${helper ? helper.msg : ""}`; }).filter(Boolean); if (errors.length) throw new Error(`Failed validate ${key} options.\n` + errors.join("\n")); } } function getInputCliKeys() { return v.keyof(InputCliOptionsSchema).options; } function getOutputCliKeys() { return v.keyof(OutputCliOptionsSchema).options; } function getJsonSchema() { return toJsonSchema(CliOptionsSchema); } //#endregion //#region src/utils/asset-source.ts function transformAssetSource(bindingAssetSource$1) { return bindingAssetSource$1.inner; } function bindingAssetSource(source) { return { inner: source }; } //#endregion //#region src/types/sourcemap.ts function bindingifySourcemap$1(map) { if (map == null) return; return { inner: typeof map === "string" ? map : { file: map.file ?? void 0, mappings: map.mappings, sourceRoot: "sourceRoot" in map ? map.sourceRoot ?? void 0 : void 0, sources: map.sources?.map((s) => s ?? void 0), sourcesContent: map.sourcesContent?.map((s) => s ?? void 0), names: map.names, x_google_ignoreList: map.x_google_ignoreList, debugId: "debugId" in map ? map.debugId : void 0 } }; } //#endregion //#region src/utils/error.ts function normalizeErrors(rawErrors) { const errors = rawErrors.map((e) => e instanceof Error ? e : Object.assign(new Error(), { kind: e.kind, message: e.message, stack: void 0 })); let summary = `Build failed with ${errors.length} error${errors.length < 2 ? "" : "s"}:\n`; for (let i = 0; i < errors.length; i++) { summary += "\n"; if (i >= 5) { summary += "..."; break; } summary += getErrorMessage(errors[i]); } const wrapper = new Error(summary); Object.defineProperty(wrapper, "errors", { configurable: true, enumerable: true, get: () => errors, set: (value) => Object.defineProperty(wrapper, "errors", { configurable: true, enumerable: true, value }) }); return wrapper; } function getErrorMessage(e) { if (Object.hasOwn(e, "kind")) return e.message; let s = ""; if (e.plugin) s += `[plugin ${e.plugin}]`; const id = e.id ?? e.loc?.file; if (id) { s += " " + id; if (e.loc) s += `:${e.loc.line}:${e.loc.column}`; } if (s) s += "\n"; const message = `${e.name ?? "Error"}: ${e.message}`; s += message; if (e.frame) s = joinNewLine(s, e.frame); if (e.stack) s = joinNewLine(s, e.stack.replace(message, "")); return s; } function joinNewLine(s1, s2) { return s1.replace(/\n+$/, "") + "\n" + s2.replace(/^\n+/, ""); } //#endregion //#region src/utils/transform-rendered-module.ts function transformToRenderedModule(bindingRenderedModule) { return { get code() { return bindingRenderedModule.code; }, get renderedLength() { return bindingRenderedModule.code?.length || 0; }, get renderedExports() { return bindingRenderedModule.renderedExports; } }; } //#endregion //#region src/utils/transform-rendered-chunk.ts function transformRenderedChunk(chunk) { return { get name() { return chunk.name; }, get isEntry() { return chunk.isEntry; }, get isDynamicEntry() { return chunk.isDynamicEntry; }, get facadeModuleId() { return chunk.facadeModuleId; }, get moduleIds() { return chunk.moduleIds; }, get exports() { return chunk.exports; }, get fileName() { return chunk.fileName; }, get imports() { return chunk.imports; }, get dynamicImports() { return chunk.dynamicImports; }, get modules() { return transformChunkModules(chunk.modules); } }; } function transformChunkModules(modules) { const result = {}; for (let i = 0; i < modules.values.length; i++) { let key = modules.keys[i]; const mod = modules.values[i]; result[key] = transformToRenderedModule(mod); } return result; } //#endregion //#region src/utils/transform-to-rollup-output.ts function transformToRollupSourceMap(map) { const parsed = JSON.parse(map); const obj = { ...parsed, toString() { return JSON.stringify(obj); }, toUrl() { return `data:application/json;charset=utf-8;base64,${Buffer.from(obj.toString(), "utf-8").toString("base64")}`; } }; return obj; } function transformToRollupOutputChunk(bindingChunk, changed) { const chunk = { type: "chunk", get code() { return bindingChunk.code; }, fileName: bindingChunk.fileName, name: bindingChunk.name, get modules() { return transformChunkModules(bindingChunk.modules); }, get imports() { return bindingChunk.imports; }, get dynamicImports() { return bindingChunk.dynamicImports; }, exports: bindingChunk.exports, isEntry: bindingChunk.isEntry, facadeModuleId: bindingChunk.facadeModuleId || null, isDynamicEntry: bindingChunk.isDynamicEntry, get moduleIds() { return bindingChunk.moduleIds; }, get map() { return bindingChunk.map ? transformToRollupSourceMap(bindingChunk.map) : null; }, sourcemapFileName: bindingChunk.sourcemapFileName || null, preliminaryFileName: bindingChunk.preliminaryFileName }; const cache = {}; return new Proxy(chunk, { get(target, p) { if (p in cache) return cache[p]; return target[p]; }, set(target, p, newValue) { cache[p] = newValue; changed?.updated.add(bindingChunk.fileName); return true; }, has(target, p) { if (p in cache) return true; return p in target; } }); } function transformToRollupOutputAsset(bindingAsset, changed) { const asset = { type: "asset", fileName: bindingAsset.fileName, originalFileName: bindingAsset.originalFileName || null, originalFileNames: bindingAsset.originalFileNames, get source() { return transformAssetSource(bindingAsset.source); }, name: bindingAsset.name ?? void 0, names: bindingAsset.names }; const cache = {}; return new Proxy(asset, { get(target, p) { if (p in cache) return cache[p]; return target[p]; }, set(target, p, newValue) { cache[p] = newValue; changed?.updated.add(bindingAsset.fileName); return true; } }); } function transformToRollupOutput(output, changed) { handleOutputErrors(output); const { chunks, assets } = output; return { output: [...chunks.map((chunk) => transformToRollupOutputChunk(chunk, changed)), ...assets.map((asset) => transformToRollupOutputAsset(asset, changed))] }; } function handleOutputErrors(output) { const rawErrors = output.errors; if (rawErrors.length > 0) throw normalizeErrors(rawErrors); } function transformToOutputBundle(output, changed) { const bundle = Object.fromEntries(transformToRollupOutput(output, changed).output.map((item) => [item.fileName, item])); return new Proxy(bundle, { deleteProperty(target, property) { if (typeof property === "string") changed.deleted.add(property); return true; } }); } function collectChangedBundle(changed, bundle) { const assets = []; const chunks = []; for (const key in bundle) { if (changed.deleted.has(key) || !changed.updated.has(key)) continue; const item = bundle[key]; if (item.type === "asset") assets.push({ filename: item.fileName, originalFileNames: item.originalFileNames, source: bindingAssetSource(item.source), names: item.names }); else chunks.push({ code: item.code, filename: item.fileName, name: item.name, isEntry: item.isEntry, exports: item.exports, modules: {}, imports: item.imports, dynamicImports: item.dynamicImports, facadeModuleId: item.facadeModuleId || void 0, isDynamicEntry: item.isDynamicEntry, moduleIds: item.moduleIds, map: bindingifySourcemap$1(item.map), sourcemapFilename: item.sourcemapFileName || void 0, preliminaryFilename: item.preliminaryFileName }); } return { assets, chunks, deleted: Array.from(changed.deleted) }; } //#endregion //#region src/utils/transform-sourcemap.ts function isEmptySourcemapFiled(array) { if (!array) return true; if (array.length === 0 || !array[0]) return true; return false; } function normalizeTransformHookSourcemap(id, originalCode, rawMap) { if (!rawMap) return; let map = typeof rawMap === "object" ? rawMap : JSON.parse(rawMap); if (isEmptySourcemapFiled(map.sourcesContent)) map.sourcesContent = [originalCode]; if (isEmptySourcemapFiled(map.sources) || map.sources && map.sources.length === 1 && map.sources[0] !== id) map.sources = [id]; return map; } //#endregion //#region src/utils/transform-module-info.ts function transformModuleInfo(info, option) { return { get ast() { return unsupported("ModuleInfo#ast"); }, get code() { return info.code; }, id: info.id, importers: info.importers, dynamicImporters: info.dynamicImporters, importedIds: info.importedIds, dynamicallyImportedIds: info.dynamicallyImportedIds, exports: info.exports, isEntry: info.isEntry, ...option }; } //#endregion //#region src/plugin/minimal-plugin-context.ts var MinimalPluginContextImpl = class { info; warn; debug; meta; constructor(onLog, logLevel, pluginName) { this.pluginName = pluginName; this.debug = getLogHandler(LOG_LEVEL_DEBUG, "PLUGIN_LOG", onLog, pluginName, logLevel); this.info = getLogHandler(LOG_LEVEL_INFO, "PLUGIN_LOG", onLog, pluginName, logLevel); this.warn = getLogHandler(LOG_LEVEL_WARN, "PLUGIN_WARNING", onLog, pluginName, logLevel); this.meta = { rollupVersion: "4.23.0", rolldownVersion: VERSION, watchMode: false }; } error(e) { return error(logPluginError(normalizeLog(e), this.pluginName)); } }; //#endregion //#region src/utils/transform-side-effects.ts function bindingifySideEffects(sideEffects) { switch (sideEffects) { case true: return import_binding.BindingHookSideEffects.True; case false: return import_binding.BindingHookSideEffects.False; case "no-treeshake": return import_binding.BindingHookSideEffects.NoTreeshake; case null: case void 0: return void 0; default: throw new Error(`Unexpected side effects: ${sideEffects}`); } } //#endregion //#region src/utils/resolved-external.ts function transformResolvedExternal(bindingResolvedExternal$1) { switch (bindingResolvedExternal$1.type) { case "Bool": return bindingResolvedExternal$1.field0; case "Absolute": return "absolute"; case "Relative": unreachable(`The PluginContext resolve result external couldn't be 'relative'`); } } function bindingResolvedExternal(external) { if (typeof external === "boolean") return { type: "Bool", field0: external }; if (external === "absolute") return { type: "Absolute" }; if (external === "relative") return { type: "Relative" }; } //#endregion //#region src/plugin/plugin-context.ts var PluginContextImpl = class extends MinimalPluginContextImpl { getModuleInfo; constructor(outputOptions, context, plugin, data, onLog, logLevel, currentLoadingModule) { super(onLog, logLevel, plugin.name); this.outputOptions = outputOptions; this.context = context; this.data = data; this.onLog = onLog; this.currentLoadingModule = currentLoadingModule; this.getModuleInfo = (id) => this.data.getModuleInfo(id, context); } async load(options) { const id = options.id; if (id === this.currentLoadingModule) this.onLog(LOG_LEVEL_WARN, logCycleLoading(this.pluginName, this.currentLoadingModule)); const moduleInfo = this.data.getModuleInfo(id, this.context); if (moduleInfo && moduleInfo.code !== null) return moduleInfo; const rawOptions = { meta: options.meta || {}, moduleSideEffects: options.moduleSideEffects || null, invalidate: false }; this.data.updateModuleOption(id, rawOptions); async function createLoadModulePromise(context, data) { const loadPromise = data.loadModulePromiseMap.get(id); if (loadPromise) return loadPromise; let resolveFn; const promise = new Promise((resolve, _) => { resolveFn = resolve; }); data.loadModulePromiseMap.set(id, promise); try { await context.load(id, bindingifySideEffects(options.moduleSideEffects), resolveFn); } finally { data.loadModulePromiseMap.delete(id); } return promise; } await createLoadModulePromise(this.context, this.data); return this.data.getModuleInfo(id, this.context); } async resolve(source, importer, options) { let receipt = void 0; if (options != null) receipt = this.data.saveResolveOptions(options); const res = await this.context.resolve(source, importer, { custom: receipt, skipSelf: options?.skipSelf }); if (receipt != null) this.data.removeSavedResolveOptions(receipt); if (res == null) return null; const info = this.data.getModuleOption(res.id) || {}; return { ...res, external: transformResolvedExternal(res.external), ...info }; } emitFile = (file) => { if (file.type === "prebuilt-chunk") return unimplemented("PluginContext.emitFile with type prebuilt-chunk"); if (file.type === "chunk") return this.context.emitChunk(file); const fnSanitizedFileName = file.fileName || typeof this.outputOptions.sanitizeFileName !== "function" ? void 0 : this.outputOptions.sanitizeFileName(file.name || "asset"); const filename = file.fileName ? void 0 : this.getAssetFileNames(file); return this.context.emitFile({ ...file, originalFileName: file.originalFileName || void 0, source: bindingAssetSource(file.source) }, filename, fnSanitizedFileName); }; getAssetFileNames(file) { if (typeof this.outputOptions.assetFileNames === "function") return this.outputOptions.assetFileNames({ names: file.name ? [file.name] : [], originalFileNames: file.originalFileName ? [file.originalFileName] : [], source: file.source, type: "asset" }); } getFileName(referenceId) { return this.context.getFileName(referenceId); } getModuleIds() { return this.data.getModuleIds(this.context); } addWatchFile(id) { this.context.addWatchFile(id); } parse(input, options) { return parseAst(input, options); } }; //#endregion //#region src/plugin/transform-plugin-context.ts var TransformPluginContextImpl = class extends PluginContextImpl { constructor(outputOptions, context, plugin, data, inner, moduleId, moduleSource, onLog, LogLevelOption) { super(outputOptions, context, plugin, data, onLog, LogLevelOption, moduleId); this.inner = inner; this.moduleId = moduleId; this.moduleSource = moduleSource; const getLogHandler$1 = (handler) => (log, pos) => { log = normalizeLog(log); if (pos) augmentCodeLocation(log, pos, moduleSource, moduleId); log.id = moduleId; log.hook = "transform"; handler(log); }; this.debug = getLogHandler$1(this.debug); this.warn = getLogHandler$1(this.warn); this.info = getLogHandler$1(this.info); } error(e, pos) { if (typeof e === "string") e = { message: e }; if (pos) augmentCodeLocation(e, pos, this.moduleSource, this.moduleId); e.id = this.moduleId; e.hook = "transform"; return error(logPluginError(normalizeLog(e), this.pluginName)); } getCombinedSourcemap() { return JSON.parse(this.inner.getCombinedSourcemap()); } }; //#endregion //#region src/plugin/bindingify-plugin-hook-meta.ts function bindingifyPluginHookMeta(options) { return { order: bindingPluginOrder(options.order) }; } function bindingPluginOrder(order) { switch (order) { case "post": return import_binding.BindingPluginOrder.Post; case "pre": return import_binding.BindingPluginOrder.Pre; case null: case void 0: return void 0; default: throw new Error(`Unknown plugin order: ${order}`); } } //#endregion //#region src/constants/plugin-context.ts const SYMBOL_FOR_RESOLVE_CALLER_THAT_SKIP_SELF = Symbol("plugin-context-resolve-caller"); //#endregion //#region src/plugin/bindingify-hook-filter.ts function bindingifyStringFilter(matcher) { if (typeof matcher === "string" || matcher instanceof RegExp) return { include: [matcher] }; if (Array.isArray(matcher)) return { include: matcher }; return { include: matcher.include ? arraify(matcher.include) : void 0, exclude: matcher.exclude ? arraify(matcher.exclude) : void 0 }; } function bindingifyResolveIdFilter(filterOption) { return filterOption?.id ? bindingifyStringFilter(filterOption.id) : void 0; } function bindingifyLoadFilter(filterOption) { return filterOption?.id ? bindingifyStringFilter(filterOption.id) : void 0; } function bindingifyTransformFilter(filterOption) { if (!filterOption) return void 0; const { id, code, moduleType } = filterOption; let moduleTypeRet; if (moduleType) if (Array.isArray(moduleType)) moduleTypeRet = moduleType; else moduleTypeRet = moduleType.include; return { id: id ? bindingifyStringFilter(id) : void 0, code: code ? bindingifyStringFilter(code) : void 0, moduleType: moduleTypeRet }; } //#endregion //#region src/options/normalized-input-options.ts var NormalizedInputOptionsImpl = class { inner; constructor(inner, onLog) { this.onLog = onLog; this.inner = inner; } get shimMissingExports() { return this.inner.shimMissingExports; } get input() { return this.inner.input; } get cwd() { return this.inner.cwd ?? void 0; } get platform() { return this.inner.platform; } }; //#endregion //#region src/plugin/bindingify-build-hooks.ts function bindingifyBuildStart(args) { const hook = args.plugin.buildStart; if (!hook) return {}; const { handler, meta } = normalizeHook(hook); return { plugin: async (ctx, opts) => { await handler.call(new PluginContextImpl(args.outputOptions, ctx, args.plugin, args.pluginContextData, args.onLog, args.logLevel), new NormalizedInputOptionsImpl(opts, args.onLog)); }, meta: bindingifyPluginHookMeta(meta) }; } function bindingifyBuildEnd(args) { const hook = args.plugin.buildEnd; if (!hook) return {}; const { handler, meta } = normalizeHook(hook); return { plugin: async (ctx, err) => { await handler.call(new PluginContextImpl(args.outputOptions, ctx, args.plugin, args.pluginContextData, args.onLog, args.logLevel), err ? normalizeErrors(err) : void 0); }, meta: bindingifyPluginHookMeta(meta) }; } function bindingifyResolveId(args) { const hook = args.plugin.resolveId; if (!hook) return {}; const { handler, meta, options } = normalizeHook(hook); return { plugin: async (ctx, specifier, importer, extraOptions) => { const contextResolveOptions = extraOptions.custom != null ? args.pluginContextData.getSavedResolveOptions(extraOptions.custom) : void 0; const newExtraOptions = { ...extraOptions, custom: contextResolveOptions?.custom, [SYMBOL_FOR_RESOLVE_CALLER_THAT_