@rollipop/rolldown 0.0.0 → 1.0.0-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +25 -0
- package/README.md +11 -1
- package/bin/cli.mjs +2 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +1191 -0
- package/dist/config.d.mts +14 -0
- package/dist/config.mjs +4 -0
- package/dist/experimental-index.d.mts +316 -0
- package/dist/experimental-index.mjs +350 -0
- package/dist/experimental-runtime-types.d.ts +98 -0
- package/dist/filter-index.d.mts +196 -0
- package/dist/filter-index.mjs +386 -0
- package/dist/get-log-filter.d.mts +3 -0
- package/dist/get-log-filter.mjs +68 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.mjs +50 -0
- package/dist/parallel-plugin-worker.d.mts +1 -0
- package/dist/parallel-plugin-worker.mjs +28 -0
- package/dist/parallel-plugin.d.mts +13 -0
- package/dist/parallel-plugin.mjs +6 -0
- package/dist/parse-ast-index.d.mts +32 -0
- package/dist/parse-ast-index.mjs +60 -0
- package/dist/plugins-index.d.mts +33 -0
- package/dist/plugins-index.mjs +40 -0
- package/dist/shared/binding-D_jQsHun.mjs +583 -0
- package/dist/shared/binding-hSQGgsUz.d.mts +1877 -0
- package/dist/shared/bindingify-input-options-DfXGy4QO.mjs +2193 -0
- package/dist/shared/constructors-B-HbV10G.mjs +68 -0
- package/dist/shared/constructors-DMl58KN5.d.mts +37 -0
- package/dist/shared/define-config-BSxBeCq6.d.mts +3810 -0
- package/dist/shared/define-config-DJOr6Iwt.mjs +6 -0
- package/dist/shared/error-D5tMcn3l.mjs +85 -0
- package/dist/shared/get-log-filter-semyr3Lj.d.mts +35 -0
- package/dist/shared/load-config-CNjYgiQv.mjs +120 -0
- package/dist/shared/logging-C6h4g8dA.d.mts +50 -0
- package/dist/shared/logs-D80CXhvg.mjs +180 -0
- package/dist/shared/misc-DJYbNKZX.mjs +21 -0
- package/dist/shared/normalize-string-or-regex-B8PEhdn1.mjs +66 -0
- package/dist/shared/parse-iQx2ihYn.mjs +74 -0
- package/dist/shared/prompt-BYQIwEjg.mjs +845 -0
- package/dist/shared/resolve-tsconfig-CxoM-bno.mjs +113 -0
- package/dist/shared/rolldown-C0o3hS3w.mjs +40 -0
- package/dist/shared/rolldown-build-80GULIOI.mjs +3326 -0
- package/dist/shared/transform-DY2pi3Qm.d.mts +149 -0
- package/dist/shared/watch-C2am0Ahc.mjs +374 -0
- package/dist/utils-index.d.mts +376 -0
- package/dist/utils-index.mjs +2414 -0
- package/package.json +130 -2
- package/.editorconfig +0 -10
- package/.gitattributes +0 -4
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { a as RolldownLog } from "./logging-C6h4g8dA.mjs";
|
|
2
|
+
import { B as ParserOptions$1, I as MinifyOptions$1, K as TsconfigCache$1, L as MinifyResult$1, W as SourceMap, a as BindingEnhancedTransformOptions, b as BindingTsconfigResult, o as BindingEnhancedTransformResult, z as ParseResult$1 } from "./binding-hSQGgsUz.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/resolve-tsconfig.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Cache for tsconfig resolution to avoid redundant file system operations.
|
|
7
|
+
*
|
|
8
|
+
* The cache stores resolved tsconfig configurations keyed by their file paths.
|
|
9
|
+
* When transforming multiple files in the same project, tsconfig lookups are
|
|
10
|
+
* deduplicated, improving performance.
|
|
11
|
+
*
|
|
12
|
+
* @category Utilities
|
|
13
|
+
* @experimental
|
|
14
|
+
*/
|
|
15
|
+
declare class TsconfigCache extends TsconfigCache$1 {
|
|
16
|
+
constructor();
|
|
17
|
+
}
|
|
18
|
+
/** @hidden This is only expected to be used by Vite */
|
|
19
|
+
declare function resolveTsconfig(filename: string, cache?: TsconfigCache | null): BindingTsconfigResult | null;
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/utils/parse.d.ts
|
|
22
|
+
/**
|
|
23
|
+
* Result of parsing a code
|
|
24
|
+
*
|
|
25
|
+
* @category Utilities
|
|
26
|
+
*/
|
|
27
|
+
interface ParseResult extends ParseResult$1 {}
|
|
28
|
+
/**
|
|
29
|
+
* Options for parsing a code
|
|
30
|
+
*
|
|
31
|
+
* @category Utilities
|
|
32
|
+
*/
|
|
33
|
+
interface ParserOptions extends ParserOptions$1 {}
|
|
34
|
+
/**
|
|
35
|
+
* Parse JS/TS source asynchronously on a separate thread.
|
|
36
|
+
*
|
|
37
|
+
* Note that not all of the workload can happen on a separate thread.
|
|
38
|
+
* Parsing on Rust side does happen in a separate thread, but deserialization of the AST to JS objects
|
|
39
|
+
* has to happen on current thread. This synchronous deserialization work typically outweighs
|
|
40
|
+
* the asynchronous parsing by a factor of between 3 and 20.
|
|
41
|
+
*
|
|
42
|
+
* i.e. the majority of the workload cannot be parallelized by using this method.
|
|
43
|
+
*
|
|
44
|
+
* Generally {@linkcode parseSync} is preferable to use as it does not have the overhead of spawning a thread.
|
|
45
|
+
* If you need to parallelize parsing multiple files, it is recommended to use worker threads.
|
|
46
|
+
*
|
|
47
|
+
* @category Utilities
|
|
48
|
+
*/
|
|
49
|
+
declare function parse(filename: string, sourceText: string, options?: ParserOptions | null): Promise<ParseResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Parse JS/TS source synchronously on current thread.
|
|
52
|
+
*
|
|
53
|
+
* This is generally preferable over {@linkcode parse} (async) as it does not have the overhead
|
|
54
|
+
* of spawning a thread, and the majority of the workload cannot be parallelized anyway
|
|
55
|
+
* (see {@linkcode parse} documentation for details).
|
|
56
|
+
*
|
|
57
|
+
* If you need to parallelize parsing multiple files, it is recommended to use worker threads
|
|
58
|
+
* with {@linkcode parseSync} rather than using {@linkcode parse}.
|
|
59
|
+
*
|
|
60
|
+
* @category Utilities
|
|
61
|
+
*/
|
|
62
|
+
declare function parseSync(filename: string, sourceText: string, options?: ParserOptions | null): ParseResult;
|
|
63
|
+
//#endregion
|
|
64
|
+
//#region src/utils/minify.d.ts
|
|
65
|
+
/**
|
|
66
|
+
* Options for minification.
|
|
67
|
+
*
|
|
68
|
+
* @category Utilities
|
|
69
|
+
*/
|
|
70
|
+
interface MinifyOptions extends MinifyOptions$1 {
|
|
71
|
+
inputMap?: SourceMap;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The result of minification.
|
|
75
|
+
*
|
|
76
|
+
* @category Utilities
|
|
77
|
+
*/
|
|
78
|
+
interface MinifyResult extends MinifyResult$1 {}
|
|
79
|
+
/**
|
|
80
|
+
* Minify asynchronously.
|
|
81
|
+
*
|
|
82
|
+
* Note: This function can be slower than {@linkcode minifySync} due to the overhead of spawning a thread.
|
|
83
|
+
*
|
|
84
|
+
* @category Utilities
|
|
85
|
+
* @experimental
|
|
86
|
+
*/
|
|
87
|
+
declare function minify(filename: string, sourceText: string, options?: MinifyOptions | null): Promise<MinifyResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Minify synchronously.
|
|
90
|
+
*
|
|
91
|
+
* @category Utilities
|
|
92
|
+
* @experimental
|
|
93
|
+
*/
|
|
94
|
+
declare function minifySync(filename: string, sourceText: string, options?: MinifyOptions | null): MinifyResult;
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/utils/transform.d.ts
|
|
97
|
+
/**
|
|
98
|
+
* Options for transforming a code.
|
|
99
|
+
*
|
|
100
|
+
* @category Utilities
|
|
101
|
+
*/
|
|
102
|
+
interface TransformOptions extends BindingEnhancedTransformOptions {}
|
|
103
|
+
/**
|
|
104
|
+
* Result of transforming a code.
|
|
105
|
+
*
|
|
106
|
+
* @category Utilities
|
|
107
|
+
*/
|
|
108
|
+
type TransformResult = Omit<BindingEnhancedTransformResult, "errors" | "warnings"> & {
|
|
109
|
+
errors: Error[];
|
|
110
|
+
warnings: RolldownLog[];
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Transpile a JavaScript or TypeScript into a target ECMAScript version, asynchronously.
|
|
114
|
+
*
|
|
115
|
+
* Note: This function can be slower than `transformSync` due to the overhead of spawning a thread.
|
|
116
|
+
*
|
|
117
|
+
* @param filename The name of the file being transformed. If this is a
|
|
118
|
+
* relative path, consider setting the {@linkcode TransformOptions#cwd} option.
|
|
119
|
+
* @param sourceText The source code to transform.
|
|
120
|
+
* @param options The transform options including tsconfig and inputMap. See {@linkcode TransformOptions} for more information.
|
|
121
|
+
* @param cache Optional tsconfig cache for reusing resolved tsconfig across multiple transforms.
|
|
122
|
+
* Only used when `options.tsconfig` is `true`.
|
|
123
|
+
*
|
|
124
|
+
* @returns a promise that resolves to an object containing the transformed code,
|
|
125
|
+
* source maps, and any errors that occurred during parsing or transformation.
|
|
126
|
+
*
|
|
127
|
+
* @category Utilities
|
|
128
|
+
* @experimental
|
|
129
|
+
*/
|
|
130
|
+
declare function transform(filename: string, sourceText: string, options?: TransformOptions | null, cache?: TsconfigCache | null): Promise<TransformResult>;
|
|
131
|
+
/**
|
|
132
|
+
* Transpile a JavaScript or TypeScript into a target ECMAScript version.
|
|
133
|
+
*
|
|
134
|
+
* @param filename The name of the file being transformed. If this is a
|
|
135
|
+
* relative path, consider setting the {@linkcode TransformOptions#cwd} option.
|
|
136
|
+
* @param sourceText The source code to transform.
|
|
137
|
+
* @param options The transform options including tsconfig and inputMap. See {@linkcode TransformOptions} for more information.
|
|
138
|
+
* @param cache Optional tsconfig cache for reusing resolved tsconfig across multiple transforms.
|
|
139
|
+
* Only used when `options.tsconfig` is `true`.
|
|
140
|
+
*
|
|
141
|
+
* @returns an object containing the transformed code, source maps, and any errors
|
|
142
|
+
* that occurred during parsing or transformation.
|
|
143
|
+
*
|
|
144
|
+
* @category Utilities
|
|
145
|
+
* @experimental
|
|
146
|
+
*/
|
|
147
|
+
declare function transformSync(filename: string, sourceText: string, options?: TransformOptions | null, cache?: TsconfigCache | null): TransformResult;
|
|
148
|
+
//#endregion
|
|
149
|
+
export { MinifyOptions as a, minifySync as c, parse as d, parseSync as f, transformSync as i, ParseResult as l, resolveTsconfig as m, TransformResult as n, MinifyResult as o, TsconfigCache as p, transform as r, minify as s, TransformOptions as t, ParserOptions as u };
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { n as __toESM, t as require_binding } from "./binding-D_jQsHun.mjs";
|
|
2
|
+
import { o as logMultipleWatcherOption } from "./logs-D80CXhvg.mjs";
|
|
3
|
+
import { v as LOG_LEVEL_WARN } from "./bindingify-input-options-DfXGy4QO.mjs";
|
|
4
|
+
import { t as arraify } from "./misc-DJYbNKZX.mjs";
|
|
5
|
+
import { n as createBundlerOptions, u as PluginDriver } from "./rolldown-build-80GULIOI.mjs";
|
|
6
|
+
import { t as aggregateBindingErrorsIntoJsError } from "./error-D5tMcn3l.mjs";
|
|
7
|
+
//#region ../../node_modules/.pnpm/signal-exit@4.1.0/node_modules/signal-exit/dist/mjs/signals.js
|
|
8
|
+
/**
|
|
9
|
+
* This is not the set of all possible signals.
|
|
10
|
+
*
|
|
11
|
+
* It IS, however, the set of all signals that trigger
|
|
12
|
+
* an exit on either Linux or BSD systems. Linux is a
|
|
13
|
+
* superset of the signal names supported on BSD, and
|
|
14
|
+
* the unknown signals just fail to register, so we can
|
|
15
|
+
* catch that easily enough.
|
|
16
|
+
*
|
|
17
|
+
* Windows signals are a different set, since there are
|
|
18
|
+
* signals that terminate Windows processes, but don't
|
|
19
|
+
* terminate (or don't even exist) on Posix systems.
|
|
20
|
+
*
|
|
21
|
+
* Don't bother with SIGKILL. It's uncatchable, which
|
|
22
|
+
* means that we can't fire any callbacks anyway.
|
|
23
|
+
*
|
|
24
|
+
* If a user does happen to register a handler on a non-
|
|
25
|
+
* fatal signal like SIGWINCH or something, and then
|
|
26
|
+
* exit, it'll end up firing `process.emit('exit')`, so
|
|
27
|
+
* the handler will be fired anyway.
|
|
28
|
+
*
|
|
29
|
+
* SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
|
|
30
|
+
* artificially, inherently leave the process in a
|
|
31
|
+
* state from which it is not safe to try and enter JS
|
|
32
|
+
* listeners.
|
|
33
|
+
*/
|
|
34
|
+
const signals = [];
|
|
35
|
+
signals.push("SIGHUP", "SIGINT", "SIGTERM");
|
|
36
|
+
if (process.platform !== "win32") signals.push("SIGALRM", "SIGABRT", "SIGVTALRM", "SIGXCPU", "SIGXFSZ", "SIGUSR2", "SIGTRAP", "SIGSYS", "SIGQUIT", "SIGIOT");
|
|
37
|
+
if (process.platform === "linux") signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SIGSTKFLT");
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region ../../node_modules/.pnpm/signal-exit@4.1.0/node_modules/signal-exit/dist/mjs/index.js
|
|
40
|
+
const processOk = (process) => !!process && typeof process === "object" && typeof process.removeListener === "function" && typeof process.emit === "function" && typeof process.reallyExit === "function" && typeof process.listeners === "function" && typeof process.kill === "function" && typeof process.pid === "number" && typeof process.on === "function";
|
|
41
|
+
const kExitEmitter = Symbol.for("signal-exit emitter");
|
|
42
|
+
const global = globalThis;
|
|
43
|
+
const ObjectDefineProperty = Object.defineProperty.bind(Object);
|
|
44
|
+
var Emitter = class {
|
|
45
|
+
emitted = {
|
|
46
|
+
afterExit: false,
|
|
47
|
+
exit: false
|
|
48
|
+
};
|
|
49
|
+
listeners = {
|
|
50
|
+
afterExit: [],
|
|
51
|
+
exit: []
|
|
52
|
+
};
|
|
53
|
+
count = 0;
|
|
54
|
+
id = Math.random();
|
|
55
|
+
constructor() {
|
|
56
|
+
if (global[kExitEmitter]) return global[kExitEmitter];
|
|
57
|
+
ObjectDefineProperty(global, kExitEmitter, {
|
|
58
|
+
value: this,
|
|
59
|
+
writable: false,
|
|
60
|
+
enumerable: false,
|
|
61
|
+
configurable: false
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
on(ev, fn) {
|
|
65
|
+
this.listeners[ev].push(fn);
|
|
66
|
+
}
|
|
67
|
+
removeListener(ev, fn) {
|
|
68
|
+
const list = this.listeners[ev];
|
|
69
|
+
const i = list.indexOf(fn);
|
|
70
|
+
/* c8 ignore start */
|
|
71
|
+
if (i === -1) return;
|
|
72
|
+
/* c8 ignore stop */
|
|
73
|
+
if (i === 0 && list.length === 1) list.length = 0;
|
|
74
|
+
else list.splice(i, 1);
|
|
75
|
+
}
|
|
76
|
+
emit(ev, code, signal) {
|
|
77
|
+
if (this.emitted[ev]) return false;
|
|
78
|
+
this.emitted[ev] = true;
|
|
79
|
+
let ret = false;
|
|
80
|
+
for (const fn of this.listeners[ev]) ret = fn(code, signal) === true || ret;
|
|
81
|
+
if (ev === "exit") ret = this.emit("afterExit", code, signal) || ret;
|
|
82
|
+
return ret;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var SignalExitBase = class {};
|
|
86
|
+
const signalExitWrap = (handler) => {
|
|
87
|
+
return {
|
|
88
|
+
onExit(cb, opts) {
|
|
89
|
+
return handler.onExit(cb, opts);
|
|
90
|
+
},
|
|
91
|
+
load() {
|
|
92
|
+
return handler.load();
|
|
93
|
+
},
|
|
94
|
+
unload() {
|
|
95
|
+
return handler.unload();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
var SignalExitFallback = class extends SignalExitBase {
|
|
100
|
+
onExit() {
|
|
101
|
+
return () => {};
|
|
102
|
+
}
|
|
103
|
+
load() {}
|
|
104
|
+
unload() {}
|
|
105
|
+
};
|
|
106
|
+
var SignalExit = class extends SignalExitBase {
|
|
107
|
+
/* c8 ignore start */
|
|
108
|
+
#hupSig = process$1.platform === "win32" ? "SIGINT" : "SIGHUP";
|
|
109
|
+
/* c8 ignore stop */
|
|
110
|
+
#emitter = new Emitter();
|
|
111
|
+
#process;
|
|
112
|
+
#originalProcessEmit;
|
|
113
|
+
#originalProcessReallyExit;
|
|
114
|
+
#sigListeners = {};
|
|
115
|
+
#loaded = false;
|
|
116
|
+
constructor(process) {
|
|
117
|
+
super();
|
|
118
|
+
this.#process = process;
|
|
119
|
+
this.#sigListeners = {};
|
|
120
|
+
for (const sig of signals) this.#sigListeners[sig] = () => {
|
|
121
|
+
const listeners = this.#process.listeners(sig);
|
|
122
|
+
let { count } = this.#emitter;
|
|
123
|
+
/* c8 ignore start */
|
|
124
|
+
const p = process;
|
|
125
|
+
if (typeof p.__signal_exit_emitter__ === "object" && typeof p.__signal_exit_emitter__.count === "number") count += p.__signal_exit_emitter__.count;
|
|
126
|
+
/* c8 ignore stop */
|
|
127
|
+
if (listeners.length === count) {
|
|
128
|
+
this.unload();
|
|
129
|
+
const ret = this.#emitter.emit("exit", null, sig);
|
|
130
|
+
/* c8 ignore start */
|
|
131
|
+
const s = sig === "SIGHUP" ? this.#hupSig : sig;
|
|
132
|
+
if (!ret) process.kill(process.pid, s);
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
this.#originalProcessReallyExit = process.reallyExit;
|
|
136
|
+
this.#originalProcessEmit = process.emit;
|
|
137
|
+
}
|
|
138
|
+
onExit(cb, opts) {
|
|
139
|
+
/* c8 ignore start */
|
|
140
|
+
if (!processOk(this.#process)) return () => {};
|
|
141
|
+
/* c8 ignore stop */
|
|
142
|
+
if (this.#loaded === false) this.load();
|
|
143
|
+
const ev = opts?.alwaysLast ? "afterExit" : "exit";
|
|
144
|
+
this.#emitter.on(ev, cb);
|
|
145
|
+
return () => {
|
|
146
|
+
this.#emitter.removeListener(ev, cb);
|
|
147
|
+
if (this.#emitter.listeners["exit"].length === 0 && this.#emitter.listeners["afterExit"].length === 0) this.unload();
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
load() {
|
|
151
|
+
if (this.#loaded) return;
|
|
152
|
+
this.#loaded = true;
|
|
153
|
+
this.#emitter.count += 1;
|
|
154
|
+
for (const sig of signals) try {
|
|
155
|
+
const fn = this.#sigListeners[sig];
|
|
156
|
+
if (fn) this.#process.on(sig, fn);
|
|
157
|
+
} catch (_) {}
|
|
158
|
+
this.#process.emit = (ev, ...a) => {
|
|
159
|
+
return this.#processEmit(ev, ...a);
|
|
160
|
+
};
|
|
161
|
+
this.#process.reallyExit = (code) => {
|
|
162
|
+
return this.#processReallyExit(code);
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
unload() {
|
|
166
|
+
if (!this.#loaded) return;
|
|
167
|
+
this.#loaded = false;
|
|
168
|
+
signals.forEach((sig) => {
|
|
169
|
+
const listener = this.#sigListeners[sig];
|
|
170
|
+
/* c8 ignore start */
|
|
171
|
+
if (!listener) throw new Error("Listener not defined for signal: " + sig);
|
|
172
|
+
/* c8 ignore stop */
|
|
173
|
+
try {
|
|
174
|
+
this.#process.removeListener(sig, listener);
|
|
175
|
+
} catch (_) {}
|
|
176
|
+
/* c8 ignore stop */
|
|
177
|
+
});
|
|
178
|
+
this.#process.emit = this.#originalProcessEmit;
|
|
179
|
+
this.#process.reallyExit = this.#originalProcessReallyExit;
|
|
180
|
+
this.#emitter.count -= 1;
|
|
181
|
+
}
|
|
182
|
+
#processReallyExit(code) {
|
|
183
|
+
/* c8 ignore start */
|
|
184
|
+
if (!processOk(this.#process)) return 0;
|
|
185
|
+
this.#process.exitCode = code || 0;
|
|
186
|
+
/* c8 ignore stop */
|
|
187
|
+
this.#emitter.emit("exit", this.#process.exitCode, null);
|
|
188
|
+
return this.#originalProcessReallyExit.call(this.#process, this.#process.exitCode);
|
|
189
|
+
}
|
|
190
|
+
#processEmit(ev, ...args) {
|
|
191
|
+
const og = this.#originalProcessEmit;
|
|
192
|
+
if (ev === "exit" && processOk(this.#process)) {
|
|
193
|
+
if (typeof args[0] === "number") this.#process.exitCode = args[0];
|
|
194
|
+
/* c8 ignore start */
|
|
195
|
+
const ret = og.call(this.#process, ev, ...args);
|
|
196
|
+
/* c8 ignore start */
|
|
197
|
+
this.#emitter.emit("exit", this.#process.exitCode, null);
|
|
198
|
+
/* c8 ignore stop */
|
|
199
|
+
return ret;
|
|
200
|
+
} else return og.call(this.#process, ev, ...args);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
const process$1 = globalThis.process;
|
|
204
|
+
const { onExit: onExit$1, load, unload } = signalExitWrap(processOk(process$1) ? new SignalExit(process$1) : new SignalExitFallback());
|
|
205
|
+
//#endregion
|
|
206
|
+
//#region src/utils/signal-exit.ts
|
|
207
|
+
function onExit(...args) {
|
|
208
|
+
if (typeof process === "object" && process.versions.webcontainer) {
|
|
209
|
+
process.on("exit", (code) => {
|
|
210
|
+
args[0](code, null);
|
|
211
|
+
});
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
onExit$1(...args);
|
|
215
|
+
}
|
|
216
|
+
//#endregion
|
|
217
|
+
//#region src/api/watch/watch-emitter.ts
|
|
218
|
+
var WatcherEmitter = class {
|
|
219
|
+
listeners = /* @__PURE__ */ new Map();
|
|
220
|
+
on(event, listener) {
|
|
221
|
+
const listeners = this.listeners.get(event);
|
|
222
|
+
if (listeners) listeners.push(listener);
|
|
223
|
+
else this.listeners.set(event, [listener]);
|
|
224
|
+
return this;
|
|
225
|
+
}
|
|
226
|
+
off(event, listener) {
|
|
227
|
+
const listeners = this.listeners.get(event);
|
|
228
|
+
if (listeners) {
|
|
229
|
+
const index = listeners.indexOf(listener);
|
|
230
|
+
if (index !== -1) listeners.splice(index, 1);
|
|
231
|
+
}
|
|
232
|
+
return this;
|
|
233
|
+
}
|
|
234
|
+
clear(event) {
|
|
235
|
+
this.listeners.delete(event);
|
|
236
|
+
}
|
|
237
|
+
/** Async emit — sequential dispatch so side effects from earlier handlers
|
|
238
|
+
* (e.g. `event.result.close()` triggering `closeBundle`) are visible to later handlers. */
|
|
239
|
+
async emit(event, ...args) {
|
|
240
|
+
const handlers = this.listeners.get(event);
|
|
241
|
+
if (handlers?.length) for (const h of handlers) await h(...args);
|
|
242
|
+
}
|
|
243
|
+
async close() {}
|
|
244
|
+
};
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/api/watch/watcher.ts
|
|
247
|
+
var import_binding = /* @__PURE__ */ __toESM(require_binding(), 1);
|
|
248
|
+
function createEventCallback(emitter) {
|
|
249
|
+
return async (event) => {
|
|
250
|
+
switch (event.eventKind()) {
|
|
251
|
+
case "event": {
|
|
252
|
+
const code = event.bundleEventKind();
|
|
253
|
+
if (code === "BUNDLE_END") {
|
|
254
|
+
const { duration, output, result } = event.bundleEndData();
|
|
255
|
+
await emitter.emit("event", {
|
|
256
|
+
code: "BUNDLE_END",
|
|
257
|
+
duration,
|
|
258
|
+
output: [output],
|
|
259
|
+
result
|
|
260
|
+
});
|
|
261
|
+
} else if (code === "ERROR") {
|
|
262
|
+
const data = event.bundleErrorData();
|
|
263
|
+
await emitter.emit("event", {
|
|
264
|
+
code: "ERROR",
|
|
265
|
+
error: aggregateBindingErrorsIntoJsError(data.error),
|
|
266
|
+
result: data.result
|
|
267
|
+
});
|
|
268
|
+
} else await emitter.emit("event", { code });
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
case "change": {
|
|
272
|
+
const { path, kind } = event.watchChangeData();
|
|
273
|
+
await emitter.emit("change", path, { event: kind });
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
case "restart":
|
|
277
|
+
await emitter.emit("restart");
|
|
278
|
+
break;
|
|
279
|
+
case "close":
|
|
280
|
+
await emitter.emit("close");
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
var Watcher = class {
|
|
286
|
+
closed;
|
|
287
|
+
inner;
|
|
288
|
+
emitter;
|
|
289
|
+
stopWorkers;
|
|
290
|
+
constructor(emitter, inner, stopWorkers) {
|
|
291
|
+
this.closed = false;
|
|
292
|
+
this.inner = inner;
|
|
293
|
+
this.emitter = emitter;
|
|
294
|
+
const originClose = emitter.close.bind(emitter);
|
|
295
|
+
emitter.close = async () => {
|
|
296
|
+
await this.close();
|
|
297
|
+
originClose();
|
|
298
|
+
};
|
|
299
|
+
this.stopWorkers = stopWorkers;
|
|
300
|
+
process.nextTick(() => this.run());
|
|
301
|
+
}
|
|
302
|
+
async close() {
|
|
303
|
+
if (this.closed) return;
|
|
304
|
+
this.closed = true;
|
|
305
|
+
for (const stop of this.stopWorkers) await stop?.();
|
|
306
|
+
await this.inner.close();
|
|
307
|
+
(0, import_binding.shutdownAsyncRuntime)();
|
|
308
|
+
}
|
|
309
|
+
async run() {
|
|
310
|
+
await this.inner.run();
|
|
311
|
+
this.inner.waitForClose();
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
async function createWatcher(emitter, input) {
|
|
315
|
+
const options = arraify(input);
|
|
316
|
+
const bundlerOptions = await Promise.all(options.map((option) => arraify(option.output || {}).map(async (output) => {
|
|
317
|
+
return createBundlerOptions(await PluginDriver.callOptionsHook(option, true), output, true);
|
|
318
|
+
})).flat());
|
|
319
|
+
warnMultiplePollingOptions(bundlerOptions);
|
|
320
|
+
const callback = createEventCallback(emitter);
|
|
321
|
+
new Watcher(emitter, new import_binding.BindingWatcher(bundlerOptions.map((option) => option.bundlerOptions), callback), bundlerOptions.map((option) => option.stopWorkers));
|
|
322
|
+
}
|
|
323
|
+
function warnMultiplePollingOptions(bundlerOptions) {
|
|
324
|
+
let found = false;
|
|
325
|
+
for (const option of bundlerOptions) {
|
|
326
|
+
const watch = option.inputOptions.watch;
|
|
327
|
+
const watcher = watch && typeof watch === "object" ? watch.watcher ?? watch.notify : void 0;
|
|
328
|
+
if (watcher && (watcher.usePolling != null || watcher.pollInterval != null)) {
|
|
329
|
+
if (found) {
|
|
330
|
+
option.onLog(LOG_LEVEL_WARN, logMultipleWatcherOption());
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
found = true;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
//#endregion
|
|
338
|
+
//#region src/api/watch/index.ts
|
|
339
|
+
/**
|
|
340
|
+
* The API compatible with Rollup's `watch` function.
|
|
341
|
+
*
|
|
342
|
+
* This function will rebuild the bundle when it detects that the individual modules have changed on disk.
|
|
343
|
+
*
|
|
344
|
+
* Note that when using this function, it is your responsibility to call `event.result.close()` in response to the `BUNDLE_END` event to avoid resource leaks.
|
|
345
|
+
*
|
|
346
|
+
* @param input The watch options object or the list of them.
|
|
347
|
+
* @returns A watcher object.
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* ```js
|
|
351
|
+
* import { watch } from 'rolldown';
|
|
352
|
+
*
|
|
353
|
+
* const watcher = watch({ /* ... *\/ });
|
|
354
|
+
* watcher.on('event', (event) => {
|
|
355
|
+
* if (event.code === 'BUNDLE_END') {
|
|
356
|
+
* console.log(event.duration);
|
|
357
|
+
* event.result.close();
|
|
358
|
+
* }
|
|
359
|
+
* });
|
|
360
|
+
*
|
|
361
|
+
* // Stop watching
|
|
362
|
+
* watcher.close();
|
|
363
|
+
* ```
|
|
364
|
+
*
|
|
365
|
+
* @experimental
|
|
366
|
+
* @category Programmatic APIs
|
|
367
|
+
*/
|
|
368
|
+
function watch(input) {
|
|
369
|
+
const emitter = new WatcherEmitter();
|
|
370
|
+
createWatcher(emitter, input);
|
|
371
|
+
return emitter;
|
|
372
|
+
}
|
|
373
|
+
//#endregion
|
|
374
|
+
export { onExit as n, watch as t };
|