@vrowser/node-polyfill 0.0.0
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 +20 -0
- package/README.md +121 -0
- package/dist/crypto.d.ts +48 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +232 -0
- package/dist/crypto.js.map +1 -0
- package/dist/dns.d.ts +74 -0
- package/dist/dns.d.ts.map +1 -0
- package/dist/dns.js +172 -0
- package/dist/dns.js.map +1 -0
- package/dist/dns_promises.d.ts +2 -0
- package/dist/dns_promises.js +3 -0
- package/dist/events.d.ts +99 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +480 -0
- package/dist/events.js.map +1 -0
- package/dist/module.d.ts +40 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +72 -0
- package/dist/module.js.map +1 -0
- package/dist/net.d.ts +38 -0
- package/dist/net.d.ts.map +1 -0
- package/dist/net.js +53 -0
- package/dist/net.js.map +1 -0
- package/dist/os.d.ts +96 -0
- package/dist/os.d.ts.map +1 -0
- package/dist/os.js +140 -0
- package/dist/os.js.map +1 -0
- package/dist/perf_hooks.d.ts +124 -0
- package/dist/perf_hooks.d.ts.map +1 -0
- package/dist/perf_hooks.js +105 -0
- package/dist/perf_hooks.js.map +1 -0
- package/dist/process.d.ts +147 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +209 -0
- package/dist/process.js.map +1 -0
- package/dist/readline.d.ts +93 -0
- package/dist/readline.d.ts.map +1 -0
- package/dist/readline.js +268 -0
- package/dist/readline.js.map +1 -0
- package/dist/timers.d.ts +36 -0
- package/dist/timers.d.ts.map +1 -0
- package/dist/timers.js +54 -0
- package/dist/timers.js.map +1 -0
- package/dist/timers_promises.d.ts +22 -0
- package/dist/timers_promises.d.ts.map +1 -0
- package/dist/timers_promises.js +102 -0
- package/dist/timers_promises.js.map +1 -0
- package/dist/tty.d.ts +48 -0
- package/dist/tty.d.ts.map +1 -0
- package/dist/tty.js +67 -0
- package/dist/tty.js.map +1 -0
- package/dist/url.d.ts +39 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +41 -0
- package/dist/url.js.map +1 -0
- package/dist/util.d.ts +66 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +117 -0
- package/dist/util.js.map +1 -0
- package/package.json +125 -0
package/dist/readline.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { EventEmitter } from "./events.js";
|
|
2
|
+
|
|
3
|
+
//#region src/readline.ts
|
|
4
|
+
/**
|
|
5
|
+
* `node:readline` compatible entry point
|
|
6
|
+
*
|
|
7
|
+
* ANSI cursor/clear functions are fully implemented using escape sequences.
|
|
8
|
+
* Interface provides a minimal EventEmitter-based implementation for
|
|
9
|
+
* question/prompt/close/pause/resume workflows.
|
|
10
|
+
*
|
|
11
|
+
* @module readline
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Forked from:
|
|
15
|
+
* - node:readline (https://github.com/nodejs/node)
|
|
16
|
+
* - node:internal/readline/callbacks.js
|
|
17
|
+
* - node:internal/readline/utils.js
|
|
18
|
+
* @author kazuya kawaguchi (a.k.a. kazupon)
|
|
19
|
+
* @license MIT
|
|
20
|
+
*/
|
|
21
|
+
const kEscape = "\x1B";
|
|
22
|
+
const kClearToLineBeginning = `${kEscape}[1K`;
|
|
23
|
+
const kClearToLineEnd = `${kEscape}[0K`;
|
|
24
|
+
const kClearLine = `${kEscape}[2K`;
|
|
25
|
+
const kClearScreenDown = `${kEscape}[0J`;
|
|
26
|
+
function clearLine(stream, dir, cb) {
|
|
27
|
+
if (stream == null) {
|
|
28
|
+
if (typeof cb === "function") queueMicrotask(cb);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const code = dir < 0 ? kClearToLineBeginning : dir > 0 ? kClearToLineEnd : kClearLine;
|
|
32
|
+
return stream.write(code, cb);
|
|
33
|
+
}
|
|
34
|
+
function clearScreenDown(stream, cb) {
|
|
35
|
+
if (stream == null) {
|
|
36
|
+
if (typeof cb === "function") queueMicrotask(cb);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return stream.write(kClearScreenDown, cb);
|
|
40
|
+
}
|
|
41
|
+
function cursorTo(stream, x, y, cb) {
|
|
42
|
+
if (typeof y === "function") {
|
|
43
|
+
cb = y;
|
|
44
|
+
y = void 0;
|
|
45
|
+
}
|
|
46
|
+
if (stream == null || typeof x !== "number" && typeof y !== "number") {
|
|
47
|
+
if (typeof cb === "function") queueMicrotask(cb);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const data = typeof y !== "number" ? `${kEscape}[${x + 1}G` : `${kEscape}[${y + 1};${x + 1}H`;
|
|
51
|
+
return stream.write(data, cb);
|
|
52
|
+
}
|
|
53
|
+
function moveCursor(stream, dx, dy, cb) {
|
|
54
|
+
if (stream == null || !(dx || dy)) {
|
|
55
|
+
if (typeof cb === "function") queueMicrotask(cb);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
let data = "";
|
|
59
|
+
if (dx < 0) data += `${kEscape}[${-dx}D`;
|
|
60
|
+
else if (dx > 0) data += `${kEscape}[${dx}C`;
|
|
61
|
+
if (dy < 0) data += `${kEscape}[${-dy}A`;
|
|
62
|
+
else if (dy > 0) data += `${kEscape}[${dy}B`;
|
|
63
|
+
return stream.write(data, cb);
|
|
64
|
+
}
|
|
65
|
+
function emitKeypressEvents(_stream, _iface) {}
|
|
66
|
+
var Interface = class extends EventEmitter {
|
|
67
|
+
terminal;
|
|
68
|
+
input;
|
|
69
|
+
output;
|
|
70
|
+
#prompt;
|
|
71
|
+
#closed = false;
|
|
72
|
+
#paused = false;
|
|
73
|
+
#line = "";
|
|
74
|
+
constructor(inputOrOptions, output) {
|
|
75
|
+
super();
|
|
76
|
+
const opts = typeof inputOrOptions === "object" && inputOrOptions !== null && !Array.isArray(inputOrOptions) ? inputOrOptions : {
|
|
77
|
+
input: inputOrOptions,
|
|
78
|
+
output
|
|
79
|
+
};
|
|
80
|
+
this.input = opts.input ?? null;
|
|
81
|
+
this.output = opts.output ?? null;
|
|
82
|
+
this.terminal = opts.terminal ?? false;
|
|
83
|
+
this.#prompt = opts.prompt ?? "> ";
|
|
84
|
+
if (opts.signal) {
|
|
85
|
+
const onAbort = () => this.close();
|
|
86
|
+
opts.signal.addEventListener("abort", onAbort, { once: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
get line() {
|
|
90
|
+
return this.#line;
|
|
91
|
+
}
|
|
92
|
+
get cursor() {
|
|
93
|
+
return this.#line.length;
|
|
94
|
+
}
|
|
95
|
+
get closed() {
|
|
96
|
+
return this.#closed;
|
|
97
|
+
}
|
|
98
|
+
setPrompt(prompt) {
|
|
99
|
+
this.#prompt = prompt;
|
|
100
|
+
}
|
|
101
|
+
getPrompt() {
|
|
102
|
+
return this.#prompt;
|
|
103
|
+
}
|
|
104
|
+
prompt(_preserveCursor) {
|
|
105
|
+
if (this.#closed) return;
|
|
106
|
+
if (this.output) this.output.write(this.#prompt);
|
|
107
|
+
}
|
|
108
|
+
question(query, optionsOrCb, cb) {
|
|
109
|
+
const callback = typeof optionsOrCb === "function" ? optionsOrCb : cb;
|
|
110
|
+
const options = typeof optionsOrCb === "object" ? optionsOrCb : void 0;
|
|
111
|
+
if (this.#closed) throw new Error("readline was closed");
|
|
112
|
+
if (this.output) this.output.write(query);
|
|
113
|
+
const handler = (line) => {
|
|
114
|
+
if (typeof callback === "function") callback(line);
|
|
115
|
+
};
|
|
116
|
+
this.once("line", handler);
|
|
117
|
+
if (options?.signal) {
|
|
118
|
+
const onAbort = () => {
|
|
119
|
+
this.removeListener("line", handler);
|
|
120
|
+
};
|
|
121
|
+
options.signal.addEventListener("abort", onAbort, { once: true });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
write(data, _key) {
|
|
125
|
+
if (this.#closed) return;
|
|
126
|
+
if (data != null) this.#line += data;
|
|
127
|
+
}
|
|
128
|
+
pause() {
|
|
129
|
+
if (!this.#paused) {
|
|
130
|
+
this.#paused = true;
|
|
131
|
+
this.emit("pause");
|
|
132
|
+
}
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
resume() {
|
|
136
|
+
if (this.#paused) {
|
|
137
|
+
this.#paused = false;
|
|
138
|
+
this.emit("resume");
|
|
139
|
+
}
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
close() {
|
|
143
|
+
if (this.#closed) return;
|
|
144
|
+
this.#closed = true;
|
|
145
|
+
this.emit("close");
|
|
146
|
+
}
|
|
147
|
+
[Symbol.asyncIterator]() {
|
|
148
|
+
const lines = [];
|
|
149
|
+
const waiting = [];
|
|
150
|
+
let done = false;
|
|
151
|
+
this.on("line", (line) => {
|
|
152
|
+
if (waiting.length > 0) waiting.shift().resolve({
|
|
153
|
+
value: line,
|
|
154
|
+
done: false
|
|
155
|
+
});
|
|
156
|
+
else lines.push(line);
|
|
157
|
+
});
|
|
158
|
+
this.on("close", () => {
|
|
159
|
+
done = true;
|
|
160
|
+
while (waiting.length > 0) waiting.shift().resolve({
|
|
161
|
+
value: void 0,
|
|
162
|
+
done: true
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
next: () => {
|
|
167
|
+
if (lines.length > 0) return Promise.resolve({
|
|
168
|
+
value: lines.shift(),
|
|
169
|
+
done: false
|
|
170
|
+
});
|
|
171
|
+
if (done) return Promise.resolve({
|
|
172
|
+
value: void 0,
|
|
173
|
+
done: true
|
|
174
|
+
});
|
|
175
|
+
return new Promise((resolve) => {
|
|
176
|
+
waiting.push({ resolve });
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
return: () => {
|
|
180
|
+
this.close();
|
|
181
|
+
return Promise.resolve({
|
|
182
|
+
value: void 0,
|
|
183
|
+
done: true
|
|
184
|
+
});
|
|
185
|
+
},
|
|
186
|
+
[Symbol.asyncIterator]() {
|
|
187
|
+
return this;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
function createInterface(inputOrOptions, output) {
|
|
193
|
+
return new Interface(inputOrOptions, output);
|
|
194
|
+
}
|
|
195
|
+
var PromiseInterface = class extends Interface {
|
|
196
|
+
question(query, optionsOrCb, cb) {
|
|
197
|
+
if (typeof optionsOrCb === "function" || typeof cb === "function") return super.question(query, optionsOrCb, cb);
|
|
198
|
+
return new Promise((resolve, reject) => {
|
|
199
|
+
super.question(query, optionsOrCb, (answer) => resolve(answer));
|
|
200
|
+
if (optionsOrCb?.signal) optionsOrCb.signal.addEventListener("abort", () => {
|
|
201
|
+
reject(new DOMException("The operation was aborted", "AbortError"));
|
|
202
|
+
}, { once: true });
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
var Readline = class {
|
|
207
|
+
#stream;
|
|
208
|
+
#pending = [];
|
|
209
|
+
constructor(stream) {
|
|
210
|
+
this.#stream = stream;
|
|
211
|
+
}
|
|
212
|
+
cursorTo(x, y) {
|
|
213
|
+
const code = typeof y !== "number" ? `${kEscape}[${x + 1}G` : `${kEscape}[${y + 1};${x + 1}H`;
|
|
214
|
+
this.#pending.push(code);
|
|
215
|
+
return this;
|
|
216
|
+
}
|
|
217
|
+
moveCursor(dx, dy) {
|
|
218
|
+
let code = "";
|
|
219
|
+
if (dx < 0) code += `${kEscape}[${-dx}D`;
|
|
220
|
+
else if (dx > 0) code += `${kEscape}[${dx}C`;
|
|
221
|
+
if (dy < 0) code += `${kEscape}[${-dy}A`;
|
|
222
|
+
else if (dy > 0) code += `${kEscape}[${dy}B`;
|
|
223
|
+
if (code) this.#pending.push(code);
|
|
224
|
+
return this;
|
|
225
|
+
}
|
|
226
|
+
clearLine(dir) {
|
|
227
|
+
const code = dir < 0 ? kClearToLineBeginning : dir > 0 ? kClearToLineEnd : kClearLine;
|
|
228
|
+
this.#pending.push(code);
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
clearScreenDown() {
|
|
232
|
+
this.#pending.push(kClearScreenDown);
|
|
233
|
+
return this;
|
|
234
|
+
}
|
|
235
|
+
commit() {
|
|
236
|
+
return new Promise((resolve) => {
|
|
237
|
+
this.#stream.write(this.#pending.join(""), () => resolve());
|
|
238
|
+
this.#pending.length = 0;
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
rollback() {
|
|
242
|
+
this.#pending.length = 0;
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
const readline = {
|
|
247
|
+
clearLine,
|
|
248
|
+
clearScreenDown,
|
|
249
|
+
cursorTo,
|
|
250
|
+
moveCursor,
|
|
251
|
+
emitKeypressEvents,
|
|
252
|
+
Interface,
|
|
253
|
+
createInterface,
|
|
254
|
+
promises: null
|
|
255
|
+
};
|
|
256
|
+
var readline_default = readline;
|
|
257
|
+
const promises = {
|
|
258
|
+
createInterface(inputOrOptions, output) {
|
|
259
|
+
return new PromiseInterface(inputOrOptions, output);
|
|
260
|
+
},
|
|
261
|
+
Readline,
|
|
262
|
+
Interface: PromiseInterface
|
|
263
|
+
};
|
|
264
|
+
readline.promises = promises;
|
|
265
|
+
|
|
266
|
+
//#endregion
|
|
267
|
+
export { Interface, clearLine, clearScreenDown, createInterface, cursorTo, readline_default as default, emitKeypressEvents, moveCursor, promises };
|
|
268
|
+
//# sourceMappingURL=readline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readline.js","names":["#prompt","#line","#closed","#paused","lines: string[]","waiting: Array<{ resolve: (v: IteratorResult<string>) => void }>","#stream","#pending"],"sources":["../src/readline.ts"],"sourcesContent":["/**\n * `node:readline` compatible entry point\n *\n * ANSI cursor/clear functions are fully implemented using escape sequences.\n * Interface provides a minimal EventEmitter-based implementation for\n * question/prompt/close/pause/resume workflows.\n *\n * @module readline\n */\n\n/**\n * Forked from:\n * - node:readline (https://github.com/nodejs/node)\n * - node:internal/readline/callbacks.js\n * - node:internal/readline/utils.js\n * @author kazuya kawaguchi (a.k.a. kazupon)\n * @license MIT\n */\n\nimport { EventEmitter } from './events.ts'\n\ntype WritableStream = { write: (data: string, cb?: () => void) => boolean }\n\nconst kEscape = '\\x1b'\nconst kClearToLineBeginning = `${kEscape}[1K`\nconst kClearToLineEnd = `${kEscape}[0K`\nconst kClearLine = `${kEscape}[2K`\nconst kClearScreenDown = `${kEscape}[0J`\n\nexport function clearLine(\n stream: WritableStream | null | undefined,\n dir: number,\n cb?: () => void\n): boolean {\n if (stream == null) {\n if (typeof cb === 'function') {\n queueMicrotask(cb)\n }\n return true\n }\n const code = dir < 0 ? kClearToLineBeginning : dir > 0 ? kClearToLineEnd : kClearLine\n return stream.write(code, cb)\n}\n\nexport function clearScreenDown(\n stream: WritableStream | null | undefined,\n cb?: () => void\n): boolean {\n if (stream == null) {\n if (typeof cb === 'function') {\n queueMicrotask(cb)\n }\n return true\n }\n return stream.write(kClearScreenDown, cb)\n}\n\nexport function cursorTo(\n stream: WritableStream | null | undefined,\n x: number,\n y?: number | (() => void),\n cb?: () => void\n): boolean {\n if (typeof y === 'function') {\n cb = y\n y = undefined\n }\n if (stream == null || (typeof x !== 'number' && typeof y !== 'number')) {\n if (typeof cb === 'function') {\n queueMicrotask(cb)\n }\n return true\n }\n const data = typeof y !== 'number' ? `${kEscape}[${x + 1}G` : `${kEscape}[${y + 1};${x + 1}H`\n return stream.write(data, cb)\n}\n\nexport function moveCursor(\n stream: WritableStream | null | undefined,\n dx: number,\n dy: number,\n cb?: () => void\n): boolean {\n if (stream == null || !(dx || dy)) {\n if (typeof cb === 'function') {\n queueMicrotask(cb)\n }\n return true\n }\n let data = ''\n if (dx < 0) {\n data += `${kEscape}[${-dx}D`\n } else if (dx > 0) {\n data += `${kEscape}[${dx}C`\n }\n if (dy < 0) {\n data += `${kEscape}[${-dy}A`\n } else if (dy > 0) {\n data += `${kEscape}[${dy}B`\n }\n return stream.write(data, cb)\n}\n\nexport function emitKeypressEvents(_stream: unknown, _iface?: unknown): void {}\n\ninterface InterfaceOptions {\n input?: unknown\n output?: WritableStream | null\n completer?: Function\n terminal?: boolean\n history?: string[]\n historySize?: number\n prompt?: string\n crlfDelay?: number\n escapeCodeTimeout?: number\n tabSize?: number\n signal?: AbortSignal\n}\n\nexport class Interface extends EventEmitter {\n terminal: boolean\n input: unknown\n output: WritableStream | null\n #prompt: string\n #closed = false\n #paused = false\n #line = ''\n\n constructor(inputOrOptions?: InterfaceOptions, output?: WritableStream | null) {\n super()\n const opts = (\n typeof inputOrOptions === 'object' &&\n inputOrOptions !== null &&\n !Array.isArray(inputOrOptions)\n ? inputOrOptions\n : { input: inputOrOptions, output }\n ) as InterfaceOptions\n this.input = opts.input ?? null\n this.output = opts.output ?? null\n this.terminal = opts.terminal ?? false\n this.#prompt = opts.prompt ?? '> '\n\n if (opts.signal) {\n const onAbort = () => this.close()\n opts.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n get line(): string {\n return this.#line\n }\n get cursor(): number {\n return this.#line.length\n }\n get closed(): boolean {\n return this.#closed\n }\n\n setPrompt(prompt: string): void {\n this.#prompt = prompt\n }\n\n getPrompt(): string {\n return this.#prompt\n }\n\n prompt(_preserveCursor?: boolean): void {\n if (this.#closed) {\n return\n }\n if (this.output) {\n this.output.write(this.#prompt)\n }\n }\n\n question(query: string, optionsOrCb?: { signal?: AbortSignal } | Function, cb?: Function): void {\n const callback = typeof optionsOrCb === 'function' ? optionsOrCb : cb\n const options = typeof optionsOrCb === 'object' ? optionsOrCb : undefined\n\n if (this.#closed) {\n throw new Error('readline was closed')\n }\n\n if (this.output) {\n this.output.write(query)\n }\n\n const handler = (line: string) => {\n if (typeof callback === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- callback is validated as function above\n callback(line)\n }\n }\n this.once('line', handler)\n\n if (options?.signal) {\n const onAbort = () => {\n this.removeListener('line', handler)\n }\n options.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n write(\n data: string | null,\n _key?: { ctrl?: boolean; meta?: boolean; shift?: boolean; name?: string }\n ): void {\n if (this.#closed) {\n return\n }\n if (data != null) {\n this.#line += data\n }\n }\n\n pause(): this {\n if (!this.#paused) {\n this.#paused = true\n this.emit('pause')\n }\n return this\n }\n\n resume(): this {\n if (this.#paused) {\n this.#paused = false\n this.emit('resume')\n }\n return this\n }\n\n close(): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n this.emit('close')\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<string> {\n const lines: string[] = []\n const waiting: Array<{ resolve: (v: IteratorResult<string>) => void }> = []\n let done = false\n\n this.on('line', (line: string) => {\n if (waiting.length > 0) {\n waiting.shift()!.resolve({ value: line, done: false })\n } else {\n lines.push(line)\n }\n })\n\n this.on('close', () => {\n done = true\n while (waiting.length > 0) {\n waiting.shift()!.resolve({ value: undefined as unknown as string, done: true })\n }\n })\n\n return {\n next: () => {\n if (lines.length > 0) {\n return Promise.resolve({ value: lines.shift()!, done: false })\n }\n if (done) {\n return Promise.resolve({ value: undefined as unknown as string, done: true })\n }\n return new Promise<IteratorResult<string>>(resolve => {\n waiting.push({ resolve })\n })\n },\n return: () => {\n this.close()\n return Promise.resolve({ value: undefined as unknown as string, done: true })\n },\n [Symbol.asyncIterator]() {\n return this\n }\n }\n }\n}\n\nexport function createInterface(\n inputOrOptions?: InterfaceOptions,\n output?: WritableStream | null\n): Interface {\n return new Interface(inputOrOptions, output)\n}\n\nclass PromiseInterface extends Interface {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises -- intentionally returns Promise\n question(query: string, options?: { signal?: AbortSignal }): Promise<string>\n // eslint-disable-next-line @typescript-eslint/no-misused-promises -- intentionally returns Promise\n question(\n query: string,\n optionsOrCb?: { signal?: AbortSignal } | Function,\n cb?: Function\n ): void | Promise<string> {\n if (typeof optionsOrCb === 'function' || typeof cb === 'function') {\n return super.question(query, optionsOrCb, cb)\n }\n return new Promise<string>((resolve, reject) => {\n super.question(query, optionsOrCb, (answer: string) => resolve(answer))\n if (optionsOrCb?.signal) {\n optionsOrCb.signal.addEventListener(\n 'abort',\n () => {\n reject(new DOMException('The operation was aborted', 'AbortError'))\n },\n { once: true }\n )\n }\n })\n }\n}\n\nclass Readline {\n #stream: WritableStream\n #pending: string[] = []\n\n constructor(stream: WritableStream) {\n this.#stream = stream\n }\n\n cursorTo(x: number, y?: number): this {\n const code = typeof y !== 'number' ? `${kEscape}[${x + 1}G` : `${kEscape}[${y + 1};${x + 1}H`\n this.#pending.push(code)\n return this\n }\n\n moveCursor(dx: number, dy: number): this {\n let code = ''\n if (dx < 0) {\n code += `${kEscape}[${-dx}D`\n } else if (dx > 0) {\n code += `${kEscape}[${dx}C`\n }\n if (dy < 0) {\n code += `${kEscape}[${-dy}A`\n } else if (dy > 0) {\n code += `${kEscape}[${dy}B`\n }\n if (code) {\n this.#pending.push(code)\n }\n return this\n }\n\n clearLine(dir: number): this {\n const code = dir < 0 ? kClearToLineBeginning : dir > 0 ? kClearToLineEnd : kClearLine\n this.#pending.push(code)\n return this\n }\n\n clearScreenDown(): this {\n this.#pending.push(kClearScreenDown)\n return this\n }\n\n commit(): Promise<void> {\n return new Promise(resolve => {\n this.#stream.write(this.#pending.join(''), () => resolve())\n this.#pending.length = 0\n })\n }\n\n rollback(): this {\n this.#pending.length = 0\n return this\n }\n}\n\nconst readline = {\n clearLine,\n clearScreenDown,\n cursorTo,\n moveCursor,\n emitKeypressEvents,\n Interface,\n createInterface,\n promises: null as unknown // set below\n}\n\nexport default readline\n\nexport const promises = {\n createInterface(\n inputOrOptions?: InterfaceOptions,\n output?: WritableStream | null\n ): PromiseInterface {\n return new PromiseInterface(inputOrOptions, output)\n },\n Readline,\n Interface: PromiseInterface\n}\n\nreadline.promises = promises\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,UAAU;AAChB,MAAM,wBAAwB,GAAG,QAAQ;AACzC,MAAM,kBAAkB,GAAG,QAAQ;AACnC,MAAM,aAAa,GAAG,QAAQ;AAC9B,MAAM,mBAAmB,GAAG,QAAQ;AAEpC,SAAgB,UACd,QACA,KACA,IACS;AACT,KAAI,UAAU,MAAM;AAClB,MAAI,OAAO,OAAO,WAChB,gBAAe,GAAG;AAEpB,SAAO;;CAET,MAAM,OAAO,MAAM,IAAI,wBAAwB,MAAM,IAAI,kBAAkB;AAC3E,QAAO,OAAO,MAAM,MAAM,GAAG;;AAG/B,SAAgB,gBACd,QACA,IACS;AACT,KAAI,UAAU,MAAM;AAClB,MAAI,OAAO,OAAO,WAChB,gBAAe,GAAG;AAEpB,SAAO;;AAET,QAAO,OAAO,MAAM,kBAAkB,GAAG;;AAG3C,SAAgB,SACd,QACA,GACA,GACA,IACS;AACT,KAAI,OAAO,MAAM,YAAY;AAC3B,OAAK;AACL,MAAI;;AAEN,KAAI,UAAU,QAAS,OAAO,MAAM,YAAY,OAAO,MAAM,UAAW;AACtE,MAAI,OAAO,OAAO,WAChB,gBAAe,GAAG;AAEpB,SAAO;;CAET,MAAM,OAAO,OAAO,MAAM,WAAW,GAAG,QAAQ,GAAG,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE;AAC3F,QAAO,OAAO,MAAM,MAAM,GAAG;;AAG/B,SAAgB,WACd,QACA,IACA,IACA,IACS;AACT,KAAI,UAAU,QAAQ,EAAE,MAAM,KAAK;AACjC,MAAI,OAAO,OAAO,WAChB,gBAAe,GAAG;AAEpB,SAAO;;CAET,IAAI,OAAO;AACX,KAAI,KAAK,EACP,SAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG;UACjB,KAAK,EACd,SAAQ,GAAG,QAAQ,GAAG,GAAG;AAE3B,KAAI,KAAK,EACP,SAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG;UACjB,KAAK,EACd,SAAQ,GAAG,QAAQ,GAAG,GAAG;AAE3B,QAAO,OAAO,MAAM,MAAM,GAAG;;AAG/B,SAAgB,mBAAmB,SAAkB,QAAwB;AAgB7E,IAAa,YAAb,cAA+B,aAAa;CAC1C;CACA;CACA;CACA;CACA,UAAU;CACV,UAAU;CACV,QAAQ;CAER,YAAY,gBAAmC,QAAgC;AAC7E,SAAO;EACP,MAAM,OACJ,OAAO,mBAAmB,YAC1B,mBAAmB,QACnB,CAAC,MAAM,QAAQ,eAAe,GAC1B,iBACA;GAAE,OAAO;GAAgB;GAAQ;AAEvC,OAAK,QAAQ,KAAK,SAAS;AAC3B,OAAK,SAAS,KAAK,UAAU;AAC7B,OAAK,WAAW,KAAK,YAAY;AACjC,QAAKA,SAAU,KAAK,UAAU;AAE9B,MAAI,KAAK,QAAQ;GACf,MAAM,gBAAgB,KAAK,OAAO;AAClC,QAAK,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;;;CAIlE,IAAI,OAAe;AACjB,SAAO,MAAKC;;CAEd,IAAI,SAAiB;AACnB,SAAO,MAAKA,KAAM;;CAEpB,IAAI,SAAkB;AACpB,SAAO,MAAKC;;CAGd,UAAU,QAAsB;AAC9B,QAAKF,SAAU;;CAGjB,YAAoB;AAClB,SAAO,MAAKA;;CAGd,OAAO,iBAAiC;AACtC,MAAI,MAAKE,OACP;AAEF,MAAI,KAAK,OACP,MAAK,OAAO,MAAM,MAAKF,OAAQ;;CAInC,SAAS,OAAe,aAAmD,IAAqB;EAC9F,MAAM,WAAW,OAAO,gBAAgB,aAAa,cAAc;EACnE,MAAM,UAAU,OAAO,gBAAgB,WAAW,cAAc;AAEhE,MAAI,MAAKE,OACP,OAAM,IAAI,MAAM,sBAAsB;AAGxC,MAAI,KAAK,OACP,MAAK,OAAO,MAAM,MAAM;EAG1B,MAAM,WAAW,SAAiB;AAChC,OAAI,OAAO,aAAa,WAEtB,UAAS,KAAK;;AAGlB,OAAK,KAAK,QAAQ,QAAQ;AAE1B,MAAI,SAAS,QAAQ;GACnB,MAAM,gBAAgB;AACpB,SAAK,eAAe,QAAQ,QAAQ;;AAEtC,WAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;;;CAIrE,MACE,MACA,MACM;AACN,MAAI,MAAKA,OACP;AAEF,MAAI,QAAQ,KACV,OAAKD,QAAS;;CAIlB,QAAc;AACZ,MAAI,CAAC,MAAKE,QAAS;AACjB,SAAKA,SAAU;AACf,QAAK,KAAK,QAAQ;;AAEpB,SAAO;;CAGT,SAAe;AACb,MAAI,MAAKA,QAAS;AAChB,SAAKA,SAAU;AACf,QAAK,KAAK,SAAS;;AAErB,SAAO;;CAGT,QAAc;AACZ,MAAI,MAAKD,OACP;AAEF,QAAKA,SAAU;AACf,OAAK,KAAK,QAAQ;;CAGpB,CAAC,OAAO,iBAAgD;EACtD,MAAME,QAAkB,EAAE;EAC1B,MAAMC,UAAmE,EAAE;EAC3E,IAAI,OAAO;AAEX,OAAK,GAAG,SAAS,SAAiB;AAChC,OAAI,QAAQ,SAAS,EACnB,SAAQ,OAAO,CAAE,QAAQ;IAAE,OAAO;IAAM,MAAM;IAAO,CAAC;OAEtD,OAAM,KAAK,KAAK;IAElB;AAEF,OAAK,GAAG,eAAe;AACrB,UAAO;AACP,UAAO,QAAQ,SAAS,EACtB,SAAQ,OAAO,CAAE,QAAQ;IAAE,OAAO;IAAgC,MAAM;IAAM,CAAC;IAEjF;AAEF,SAAO;GACL,YAAY;AACV,QAAI,MAAM,SAAS,EACjB,QAAO,QAAQ,QAAQ;KAAE,OAAO,MAAM,OAAO;KAAG,MAAM;KAAO,CAAC;AAEhE,QAAI,KACF,QAAO,QAAQ,QAAQ;KAAE,OAAO;KAAgC,MAAM;KAAM,CAAC;AAE/E,WAAO,IAAI,SAAgC,YAAW;AACpD,aAAQ,KAAK,EAAE,SAAS,CAAC;MACzB;;GAEJ,cAAc;AACZ,SAAK,OAAO;AACZ,WAAO,QAAQ,QAAQ;KAAE,OAAO;KAAgC,MAAM;KAAM,CAAC;;GAE/E,CAAC,OAAO,iBAAiB;AACvB,WAAO;;GAEV;;;AAIL,SAAgB,gBACd,gBACA,QACW;AACX,QAAO,IAAI,UAAU,gBAAgB,OAAO;;AAG9C,IAAM,mBAAN,cAA+B,UAAU;CAIvC,SACE,OACA,aACA,IACwB;AACxB,MAAI,OAAO,gBAAgB,cAAc,OAAO,OAAO,WACrD,QAAO,MAAM,SAAS,OAAO,aAAa,GAAG;AAE/C,SAAO,IAAI,SAAiB,SAAS,WAAW;AAC9C,SAAM,SAAS,OAAO,cAAc,WAAmB,QAAQ,OAAO,CAAC;AACvE,OAAI,aAAa,OACf,aAAY,OAAO,iBACjB,eACM;AACJ,WAAO,IAAI,aAAa,6BAA6B,aAAa,CAAC;MAErE,EAAE,MAAM,MAAM,CACf;IAEH;;;AAIN,IAAM,WAAN,MAAe;CACb;CACA,WAAqB,EAAE;CAEvB,YAAY,QAAwB;AAClC,QAAKC,SAAU;;CAGjB,SAAS,GAAW,GAAkB;EACpC,MAAM,OAAO,OAAO,MAAM,WAAW,GAAG,QAAQ,GAAG,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE;AAC3F,QAAKC,QAAS,KAAK,KAAK;AACxB,SAAO;;CAGT,WAAW,IAAY,IAAkB;EACvC,IAAI,OAAO;AACX,MAAI,KAAK,EACP,SAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG;WACjB,KAAK,EACd,SAAQ,GAAG,QAAQ,GAAG,GAAG;AAE3B,MAAI,KAAK,EACP,SAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG;WACjB,KAAK,EACd,SAAQ,GAAG,QAAQ,GAAG,GAAG;AAE3B,MAAI,KACF,OAAKA,QAAS,KAAK,KAAK;AAE1B,SAAO;;CAGT,UAAU,KAAmB;EAC3B,MAAM,OAAO,MAAM,IAAI,wBAAwB,MAAM,IAAI,kBAAkB;AAC3E,QAAKA,QAAS,KAAK,KAAK;AACxB,SAAO;;CAGT,kBAAwB;AACtB,QAAKA,QAAS,KAAK,iBAAiB;AACpC,SAAO;;CAGT,SAAwB;AACtB,SAAO,IAAI,SAAQ,YAAW;AAC5B,SAAKD,OAAQ,MAAM,MAAKC,QAAS,KAAK,GAAG,QAAQ,SAAS,CAAC;AAC3D,SAAKA,QAAS,SAAS;IACvB;;CAGJ,WAAiB;AACf,QAAKA,QAAS,SAAS;AACvB,SAAO;;;AAIX,MAAM,WAAW;CACf;CACA;CACA;CACA;CACA;CACA;CACA;CACA,UAAU;CACX;AAED,uBAAe;AAEf,MAAa,WAAW;CACtB,gBACE,gBACA,QACkB;AAClB,SAAO,IAAI,iBAAiB,gBAAgB,OAAO;;CAErD;CACA,WAAW;CACZ;AAED,SAAS,WAAW"}
|
package/dist/timers.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
//#region src/timers.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* `node:timers` compatible entry point
|
|
4
|
+
*
|
|
5
|
+
* Core timer functions are re-exported from globalThis.
|
|
6
|
+
* setImmediate/clearImmediate use MessageChannel fallback for browsers.
|
|
7
|
+
*
|
|
8
|
+
* @module timers
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @author kazuya kawaguchi (a.k.a. kazupon)
|
|
12
|
+
* @license MIT
|
|
13
|
+
*/
|
|
14
|
+
declare const setTimeout: typeof globalThis.setTimeout;
|
|
15
|
+
declare const clearTimeout: typeof globalThis.clearTimeout;
|
|
16
|
+
declare const setInterval: typeof globalThis.setInterval;
|
|
17
|
+
declare const clearInterval: typeof globalThis.clearInterval;
|
|
18
|
+
declare const setImmediate: (cb: (...args: unknown[]) => void, ...args: unknown[]) => number;
|
|
19
|
+
declare const clearImmediate: (id: number) => void;
|
|
20
|
+
declare function active(..._args: unknown[]): void;
|
|
21
|
+
declare function unenroll(..._args: unknown[]): void;
|
|
22
|
+
declare function enroll(..._args: unknown[]): void;
|
|
23
|
+
declare const _default: {
|
|
24
|
+
setTimeout: typeof globalThis.setTimeout;
|
|
25
|
+
clearTimeout: typeof globalThis.clearTimeout;
|
|
26
|
+
setInterval: typeof globalThis.setInterval;
|
|
27
|
+
clearInterval: typeof globalThis.clearInterval;
|
|
28
|
+
setImmediate: (cb: (...args: unknown[]) => void, ...args: unknown[]) => number;
|
|
29
|
+
clearImmediate: (id: number) => void;
|
|
30
|
+
active: typeof active;
|
|
31
|
+
unenroll: typeof unenroll;
|
|
32
|
+
enroll: typeof enroll;
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { active, clearImmediate, clearInterval, clearTimeout, _default as default, enroll, setImmediate, setInterval, setTimeout, unenroll };
|
|
36
|
+
//# sourceMappingURL=timers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timers.d.ts","names":[],"sources":["../src/timers.ts"],"sourcesContent":[],"mappings":";;;;;;AAcA;AACA;AACA;AACA;AAKA;AA2BA;AAOA;AACgB,cA3CH,UA2CW,EAAA,OA3CD,UAAA,CAAA,UA2CC;AACR,cA3CH,YA2CS,EAAA,OA3CG,UAAA,CAAA,YA2CH;AAA8B,cA1CvC,WA0CuC,EAAA,OA1C5B,UAAA,CAAA,WA0C4B;cAzCvC,sBAAa,UAAA,CAAA;cAKb;cA2BA;iBAOG,MAAA;iBACA,QAAA;iBACA,MAAA;cAAoC"}
|
package/dist/timers.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//#region src/timers.ts
|
|
2
|
+
/**
|
|
3
|
+
* `node:timers` compatible entry point
|
|
4
|
+
*
|
|
5
|
+
* Core timer functions are re-exported from globalThis.
|
|
6
|
+
* setImmediate/clearImmediate use MessageChannel fallback for browsers.
|
|
7
|
+
*
|
|
8
|
+
* @module timers
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @author kazuya kawaguchi (a.k.a. kazupon)
|
|
12
|
+
* @license MIT
|
|
13
|
+
*/
|
|
14
|
+
const setTimeout = globalThis.setTimeout.bind(globalThis);
|
|
15
|
+
const clearTimeout = globalThis.clearTimeout.bind(globalThis);
|
|
16
|
+
const setInterval = globalThis.setInterval.bind(globalThis);
|
|
17
|
+
const clearInterval = globalThis.clearInterval.bind(globalThis);
|
|
18
|
+
let _immediateId = 0;
|
|
19
|
+
const _immediateCallbacks = /* @__PURE__ */ new Map();
|
|
20
|
+
const setImmediate = typeof globalThis.setImmediate === "function" ? globalThis.setImmediate.bind(globalThis) : (cb, ...args) => {
|
|
21
|
+
const id = ++_immediateId;
|
|
22
|
+
_immediateCallbacks.set(id, true);
|
|
23
|
+
if (typeof MessageChannel !== "undefined") {
|
|
24
|
+
const channel = new MessageChannel();
|
|
25
|
+
channel.port1.onmessage = () => {
|
|
26
|
+
if (_immediateCallbacks.delete(id)) cb(...args);
|
|
27
|
+
};
|
|
28
|
+
channel.port2.postMessage(null);
|
|
29
|
+
} else globalThis.setTimeout(() => {
|
|
30
|
+
if (_immediateCallbacks.delete(id)) cb(...args);
|
|
31
|
+
}, 0);
|
|
32
|
+
return id;
|
|
33
|
+
};
|
|
34
|
+
const clearImmediate = typeof globalThis.clearImmediate === "function" ? globalThis.clearImmediate.bind(globalThis) : (id) => {
|
|
35
|
+
_immediateCallbacks.delete(id);
|
|
36
|
+
};
|
|
37
|
+
function active(..._args) {}
|
|
38
|
+
function unenroll(..._args) {}
|
|
39
|
+
function enroll(..._args) {}
|
|
40
|
+
var timers_default = {
|
|
41
|
+
setTimeout,
|
|
42
|
+
clearTimeout,
|
|
43
|
+
setInterval,
|
|
44
|
+
clearInterval,
|
|
45
|
+
setImmediate,
|
|
46
|
+
clearImmediate,
|
|
47
|
+
active,
|
|
48
|
+
unenroll,
|
|
49
|
+
enroll
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
export { active, clearImmediate, clearInterval, clearTimeout, timers_default as default, enroll, setImmediate, setInterval, setTimeout, unenroll };
|
|
54
|
+
//# sourceMappingURL=timers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timers.js","names":["setImmediate: (cb: (...args: unknown[]) => void, ...args: unknown[]) => number","clearImmediate: (id: number) => void"],"sources":["../src/timers.ts"],"sourcesContent":["/**\n * `node:timers` compatible entry point\n *\n * Core timer functions are re-exported from globalThis.\n * setImmediate/clearImmediate use MessageChannel fallback for browsers.\n *\n * @module timers\n */\n\n/**\n * @author kazuya kawaguchi (a.k.a. kazupon)\n * @license MIT\n */\n\nexport const setTimeout = globalThis.setTimeout.bind(globalThis)\nexport const clearTimeout = globalThis.clearTimeout.bind(globalThis)\nexport const setInterval = globalThis.setInterval.bind(globalThis)\nexport const clearInterval = globalThis.clearInterval.bind(globalThis)\n\nlet _immediateId = 0\nconst _immediateCallbacks = new Map<number, boolean>()\n\nexport const setImmediate: (cb: (...args: unknown[]) => void, ...args: unknown[]) => number =\n typeof globalThis.setImmediate === 'function'\n ? (globalThis.setImmediate.bind(globalThis) as unknown as (\n cb: (...args: unknown[]) => void,\n ...args: unknown[]\n ) => number)\n : (cb: (...args: unknown[]) => void, ...args: unknown[]): number => {\n const id = ++_immediateId\n _immediateCallbacks.set(id, true)\n if (typeof MessageChannel !== 'undefined') {\n const channel = new MessageChannel()\n channel.port1.onmessage = () => {\n if (_immediateCallbacks.delete(id)) {\n cb(...args)\n }\n }\n channel.port2.postMessage(null)\n } else {\n globalThis.setTimeout(() => {\n if (_immediateCallbacks.delete(id)) {\n cb(...args)\n }\n }, 0)\n }\n return id\n }\n\nexport const clearImmediate: (id: number) => void =\n typeof globalThis.clearImmediate === 'function'\n ? globalThis.clearImmediate.bind(globalThis)\n : (id: number): void => {\n _immediateCallbacks.delete(id)\n }\n\nexport function active(..._args: unknown[]): void {}\nexport function unenroll(..._args: unknown[]): void {}\nexport function enroll(..._args: unknown[]): void {}\n\nexport default {\n setTimeout,\n clearTimeout,\n setInterval,\n clearInterval,\n setImmediate,\n clearImmediate,\n active,\n unenroll,\n enroll\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAa,aAAa,WAAW,WAAW,KAAK,WAAW;AAChE,MAAa,eAAe,WAAW,aAAa,KAAK,WAAW;AACpE,MAAa,cAAc,WAAW,YAAY,KAAK,WAAW;AAClE,MAAa,gBAAgB,WAAW,cAAc,KAAK,WAAW;AAEtE,IAAI,eAAe;AACnB,MAAM,sCAAsB,IAAI,KAAsB;AAEtD,MAAaA,eACX,OAAO,WAAW,iBAAiB,aAC9B,WAAW,aAAa,KAAK,WAAW,IAIxC,IAAkC,GAAG,SAA4B;CAChE,MAAM,KAAK,EAAE;AACb,qBAAoB,IAAI,IAAI,KAAK;AACjC,KAAI,OAAO,mBAAmB,aAAa;EACzC,MAAM,UAAU,IAAI,gBAAgB;AACpC,UAAQ,MAAM,kBAAkB;AAC9B,OAAI,oBAAoB,OAAO,GAAG,CAChC,IAAG,GAAG,KAAK;;AAGf,UAAQ,MAAM,YAAY,KAAK;OAE/B,YAAW,iBAAiB;AAC1B,MAAI,oBAAoB,OAAO,GAAG,CAChC,IAAG,GAAG,KAAK;IAEZ,EAAE;AAEP,QAAO;;AAGf,MAAaC,iBACX,OAAO,WAAW,mBAAmB,aACjC,WAAW,eAAe,KAAK,WAAW,IACzC,OAAqB;AACpB,qBAAoB,OAAO,GAAG;;AAGtC,SAAgB,OAAO,GAAG,OAAwB;AAClD,SAAgB,SAAS,GAAG,OAAwB;AACpD,SAAgB,OAAO,GAAG,OAAwB;AAElD,qBAAe;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
//#region src/timers_promises.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* `node:timers/promises` compatible entry point
|
|
4
|
+
*
|
|
5
|
+
* Promise-based timer functions with AbortSignal support.
|
|
6
|
+
*
|
|
7
|
+
* @module timers/promises
|
|
8
|
+
*/
|
|
9
|
+
interface TimerOptions {
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
ref?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare function setTimeout<T = void>(delay?: number, value?: T, options?: TimerOptions): Promise<T>;
|
|
14
|
+
declare function setImmediate<T = void>(value?: T, options?: TimerOptions): Promise<T>;
|
|
15
|
+
declare function setInterval<T = void>(delay?: number, value?: T, options?: TimerOptions): AsyncIterableIterator<T>;
|
|
16
|
+
declare const scheduler: {
|
|
17
|
+
wait(delay?: number, options?: TimerOptions): Promise<void>;
|
|
18
|
+
yield(): Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { scheduler, setImmediate, setInterval, setTimeout };
|
|
22
|
+
//# sourceMappingURL=timers_promises.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timers_promises.d.ts","names":[],"sources":["../src/timers_promises.ts"],"sourcesContent":[],"mappings":";;;AAoBA;;;;;UALU,YAAA,CASA;EAoBM,MAAA,CAAA,EA5BL,WA4BiB;EAAmB,GAAA,CAAA,EAAA,OAAA;;AAAoC,iBAxBnE,UAwBmE,CAAA,IAAA,IAAA,CAAA,CAAA,KAAA,CAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAtBzE,CAsByE,EAAA,OAAA,CAAA,EArBvE,YAqBuE,CAAA,EApBhF,OAoBgF,CApBxE,CAoBwE,CAAA;AAAR,iBAA3D,YAA2D,CAAA,IAAA,IAAA,CAAA,CAAA,KAAA,CAAA,EAA5B,CAA4B,EAAA,OAAA,CAAA,EAAf,YAAe,CAAA,EAAA,OAAA,CAAQ,CAAR,CAAA;AAAO,iBAiBlE,WAjBkE,CAAA,IAAA,IAAA,CAAA,CAAA,KAAA,CAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAmBxE,CAnBwE,EAAA,OAAA,CAAA,EAoBtE,YApBsE,CAAA,EAqB/E,qBArB+E,CAqBzD,CArByD,CAAA;AAiBlE,cAyDH,SAzDc,EAAA;EAEjB,IAAA,CAAA,KAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAwDuB,YAxDvB,CAAA,EAwDsC,OAxDtC,CAAA,IAAA,CAAA;EACE,KAAA,EAAA,EA0DD,OA1DC,CAAA,IAAA,CAAA;CACa"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { setImmediate as setImmediate$1 } from "./timers.js";
|
|
2
|
+
|
|
3
|
+
//#region src/timers_promises.ts
|
|
4
|
+
/**
|
|
5
|
+
* `node:timers/promises` compatible entry point
|
|
6
|
+
*
|
|
7
|
+
* Promise-based timer functions with AbortSignal support.
|
|
8
|
+
*
|
|
9
|
+
* @module timers/promises
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* @author kazuya kawaguchi (a.k.a. kazupon)
|
|
13
|
+
* @license MIT
|
|
14
|
+
*/
|
|
15
|
+
function setTimeout(delay, value, options) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
if (options?.signal?.aborted) {
|
|
18
|
+
reject(new DOMException("The operation was aborted", "AbortError"));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const id = globalThis.setTimeout(() => resolve(value), delay ?? 0);
|
|
22
|
+
if (options?.signal) options.signal.addEventListener("abort", () => {
|
|
23
|
+
globalThis.clearTimeout(id);
|
|
24
|
+
reject(new DOMException("The operation was aborted", "AbortError"));
|
|
25
|
+
}, { once: true });
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function setImmediate(value, options) {
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
if (options?.signal?.aborted) {
|
|
31
|
+
reject(new DOMException("The operation was aborted", "AbortError"));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
setImmediate$1(() => resolve(value));
|
|
35
|
+
if (options?.signal) options.signal.addEventListener("abort", () => reject(new DOMException("The operation was aborted", "AbortError")), { once: true });
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function setInterval(delay, value, options) {
|
|
39
|
+
let id = null;
|
|
40
|
+
let done = false;
|
|
41
|
+
const pending = [];
|
|
42
|
+
const queue = [];
|
|
43
|
+
const cleanup = () => {
|
|
44
|
+
done = true;
|
|
45
|
+
if (id != null) {
|
|
46
|
+
globalThis.clearInterval(id);
|
|
47
|
+
id = null;
|
|
48
|
+
}
|
|
49
|
+
while (pending.length > 0) pending.shift().resolve({
|
|
50
|
+
value: void 0,
|
|
51
|
+
done: true
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
if (options?.signal?.aborted) done = true;
|
|
55
|
+
else {
|
|
56
|
+
id = globalThis.setInterval(() => {
|
|
57
|
+
if (pending.length > 0) pending.shift().resolve({
|
|
58
|
+
value,
|
|
59
|
+
done: false
|
|
60
|
+
});
|
|
61
|
+
else queue.push(value);
|
|
62
|
+
}, delay ?? 0);
|
|
63
|
+
options?.signal?.addEventListener("abort", cleanup, { once: true });
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
next() {
|
|
67
|
+
if (queue.length > 0) return Promise.resolve({
|
|
68
|
+
value: queue.shift(),
|
|
69
|
+
done: false
|
|
70
|
+
});
|
|
71
|
+
if (done) return Promise.resolve({
|
|
72
|
+
value: void 0,
|
|
73
|
+
done: true
|
|
74
|
+
});
|
|
75
|
+
return new Promise((resolve) => {
|
|
76
|
+
pending.push({ resolve });
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
return() {
|
|
80
|
+
cleanup();
|
|
81
|
+
return Promise.resolve({
|
|
82
|
+
value: void 0,
|
|
83
|
+
done: true
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
[Symbol.asyncIterator]() {
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const scheduler = {
|
|
92
|
+
wait(delay, options) {
|
|
93
|
+
return setTimeout(delay, void 0, options);
|
|
94
|
+
},
|
|
95
|
+
yield() {
|
|
96
|
+
return new Promise((resolve) => queueMicrotask(resolve));
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
//#endregion
|
|
101
|
+
export { scheduler, setImmediate, setInterval, setTimeout };
|
|
102
|
+
//# sourceMappingURL=timers_promises.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timers_promises.js","names":["id: ReturnType<typeof globalThis.setInterval> | null","pending: Array<{ resolve: (v: IteratorResult<T>) => void }>","queue: T[]"],"sources":["../src/timers_promises.ts"],"sourcesContent":["/**\n * `node:timers/promises` compatible entry point\n *\n * Promise-based timer functions with AbortSignal support.\n *\n * @module timers/promises\n */\n\n/**\n * @author kazuya kawaguchi (a.k.a. kazupon)\n * @license MIT\n */\n\nimport { setImmediate as _setImmediate } from './timers.ts'\n\ninterface TimerOptions {\n signal?: AbortSignal\n ref?: boolean\n}\n\nexport function setTimeout<T = void>(\n delay?: number,\n value?: T,\n options?: TimerOptions\n): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n if (options?.signal?.aborted) {\n reject(new DOMException('The operation was aborted', 'AbortError'))\n return\n }\n const id = globalThis.setTimeout(() => resolve(value as T), delay ?? 0)\n if (options?.signal) {\n options.signal.addEventListener(\n 'abort',\n () => {\n globalThis.clearTimeout(id)\n reject(new DOMException('The operation was aborted', 'AbortError'))\n },\n { once: true }\n )\n }\n })\n}\n\nexport function setImmediate<T = void>(value?: T, options?: TimerOptions): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n if (options?.signal?.aborted) {\n reject(new DOMException('The operation was aborted', 'AbortError'))\n return\n }\n _setImmediate(() => resolve(value as T))\n if (options?.signal) {\n options.signal.addEventListener(\n 'abort',\n () => reject(new DOMException('The operation was aborted', 'AbortError')),\n { once: true }\n )\n }\n })\n}\n\nexport function setInterval<T = void>(\n delay?: number,\n value?: T,\n options?: TimerOptions\n): AsyncIterableIterator<T> {\n let id: ReturnType<typeof globalThis.setInterval> | null = null\n let done = false\n const pending: Array<{ resolve: (v: IteratorResult<T>) => void }> = []\n const queue: T[] = []\n\n const cleanup = () => {\n done = true\n if (id != null) {\n globalThis.clearInterval(id)\n id = null\n }\n while (pending.length > 0) {\n pending.shift()!.resolve({ value: undefined as T, done: true })\n }\n }\n\n if (options?.signal?.aborted) {\n done = true\n } else {\n id = globalThis.setInterval(() => {\n if (pending.length > 0) {\n pending.shift()!.resolve({ value: value as T, done: false })\n } else {\n queue.push(value as T)\n }\n }, delay ?? 0)\n\n options?.signal?.addEventListener('abort', cleanup, { once: true })\n }\n\n return {\n next(): Promise<IteratorResult<T>> {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false })\n }\n if (done) {\n return Promise.resolve({ value: undefined as T, done: true })\n }\n return new Promise(resolve => {\n pending.push({ resolve })\n })\n },\n return(): Promise<IteratorResult<T>> {\n cleanup()\n return Promise.resolve({ value: undefined as T, done: true })\n },\n [Symbol.asyncIterator]() {\n return this\n }\n }\n}\n\nexport const scheduler = {\n wait(delay?: number, options?: TimerOptions): Promise<void> {\n return setTimeout(delay, undefined, options)\n },\n yield(): Promise<void> {\n return new Promise<void>(resolve => queueMicrotask(resolve))\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,SAAgB,WACd,OACA,OACA,SACY;AACZ,QAAO,IAAI,SAAY,SAAS,WAAW;AACzC,MAAI,SAAS,QAAQ,SAAS;AAC5B,UAAO,IAAI,aAAa,6BAA6B,aAAa,CAAC;AACnE;;EAEF,MAAM,KAAK,WAAW,iBAAiB,QAAQ,MAAW,EAAE,SAAS,EAAE;AACvE,MAAI,SAAS,OACX,SAAQ,OAAO,iBACb,eACM;AACJ,cAAW,aAAa,GAAG;AAC3B,UAAO,IAAI,aAAa,6BAA6B,aAAa,CAAC;KAErE,EAAE,MAAM,MAAM,CACf;GAEH;;AAGJ,SAAgB,aAAuB,OAAW,SAAoC;AACpF,QAAO,IAAI,SAAY,SAAS,WAAW;AACzC,MAAI,SAAS,QAAQ,SAAS;AAC5B,UAAO,IAAI,aAAa,6BAA6B,aAAa,CAAC;AACnE;;AAEF,uBAAoB,QAAQ,MAAW,CAAC;AACxC,MAAI,SAAS,OACX,SAAQ,OAAO,iBACb,eACM,OAAO,IAAI,aAAa,6BAA6B,aAAa,CAAC,EACzE,EAAE,MAAM,MAAM,CACf;GAEH;;AAGJ,SAAgB,YACd,OACA,OACA,SAC0B;CAC1B,IAAIA,KAAuD;CAC3D,IAAI,OAAO;CACX,MAAMC,UAA8D,EAAE;CACtE,MAAMC,QAAa,EAAE;CAErB,MAAM,gBAAgB;AACpB,SAAO;AACP,MAAI,MAAM,MAAM;AACd,cAAW,cAAc,GAAG;AAC5B,QAAK;;AAEP,SAAO,QAAQ,SAAS,EACtB,SAAQ,OAAO,CAAE,QAAQ;GAAE,OAAO;GAAgB,MAAM;GAAM,CAAC;;AAInE,KAAI,SAAS,QAAQ,QACnB,QAAO;MACF;AACL,OAAK,WAAW,kBAAkB;AAChC,OAAI,QAAQ,SAAS,EACnB,SAAQ,OAAO,CAAE,QAAQ;IAAS;IAAY,MAAM;IAAO,CAAC;OAE5D,OAAM,KAAK,MAAW;KAEvB,SAAS,EAAE;AAEd,WAAS,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;;AAGrE,QAAO;EACL,OAAmC;AACjC,OAAI,MAAM,SAAS,EACjB,QAAO,QAAQ,QAAQ;IAAE,OAAO,MAAM,OAAO;IAAG,MAAM;IAAO,CAAC;AAEhE,OAAI,KACF,QAAO,QAAQ,QAAQ;IAAE,OAAO;IAAgB,MAAM;IAAM,CAAC;AAE/D,UAAO,IAAI,SAAQ,YAAW;AAC5B,YAAQ,KAAK,EAAE,SAAS,CAAC;KACzB;;EAEJ,SAAqC;AACnC,YAAS;AACT,UAAO,QAAQ,QAAQ;IAAE,OAAO;IAAgB,MAAM;IAAM,CAAC;;EAE/D,CAAC,OAAO,iBAAiB;AACvB,UAAO;;EAEV;;AAGH,MAAa,YAAY;CACvB,KAAK,OAAgB,SAAuC;AAC1D,SAAO,WAAW,OAAO,QAAW,QAAQ;;CAE9C,QAAuB;AACrB,SAAO,IAAI,SAAc,YAAW,eAAe,QAAQ,CAAC;;CAE/D"}
|
package/dist/tty.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/tty.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* `node:tty` compatible entry point
|
|
4
|
+
*
|
|
5
|
+
* Browser/Worker environments have no TTY. All functions return safe defaults.
|
|
6
|
+
*
|
|
7
|
+
* @module tty
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @author kazuya kawaguchi (a.k.a. kazupon)
|
|
11
|
+
* @license MIT
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Check if the given file descriptor is associated with a TTY.
|
|
15
|
+
* Always returns `false` in browser/Worker environments.
|
|
16
|
+
*/
|
|
17
|
+
declare function isatty(_fd?: number): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Stub ReadStream class for browser/Worker environments.
|
|
20
|
+
*/
|
|
21
|
+
declare class ReadStream {
|
|
22
|
+
readonly isTTY: false;
|
|
23
|
+
readonly isRaw = false;
|
|
24
|
+
setRawMode(_mode: boolean): this;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Stub WriteStream class for browser/Worker environments.
|
|
28
|
+
*/
|
|
29
|
+
declare class WriteStream {
|
|
30
|
+
readonly isTTY: false;
|
|
31
|
+
readonly columns = 80;
|
|
32
|
+
readonly rows = 24;
|
|
33
|
+
clearLine(_dir: number, _callback?: () => void): boolean;
|
|
34
|
+
clearScreenDown(_callback?: () => void): boolean;
|
|
35
|
+
cursorTo(_x: number, _y?: number, _callback?: () => void): boolean;
|
|
36
|
+
moveCursor(_dx: number, _dy: number, _callback?: () => void): boolean;
|
|
37
|
+
getColorDepth(): number;
|
|
38
|
+
hasColors(_count?: number): boolean;
|
|
39
|
+
getWindowSize(): [number, number];
|
|
40
|
+
}
|
|
41
|
+
declare const _default: {
|
|
42
|
+
isatty: typeof isatty;
|
|
43
|
+
ReadStream: typeof ReadStream;
|
|
44
|
+
WriteStream: typeof WriteStream;
|
|
45
|
+
};
|
|
46
|
+
//#endregion
|
|
47
|
+
export { ReadStream, WriteStream, _default as default, isatty };
|
|
48
|
+
//# sourceMappingURL=tty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tty.d.ts","names":[],"sources":["../src/tty.ts"],"sourcesContent":[],"mappings":";;;;;;AAiBA;AAOA;AAWA;AAyBC;;;;;;;iBA3Ce,MAAA;;;;cAOH,UAAA;;;;;;;;cAWA,WAAA;;;;;;;;;;;;cAyBZ"}
|
package/dist/tty.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//#region src/tty.ts
|
|
2
|
+
/**
|
|
3
|
+
* `node:tty` compatible entry point
|
|
4
|
+
*
|
|
5
|
+
* Browser/Worker environments have no TTY. All functions return safe defaults.
|
|
6
|
+
*
|
|
7
|
+
* @module tty
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* @author kazuya kawaguchi (a.k.a. kazupon)
|
|
11
|
+
* @license MIT
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Check if the given file descriptor is associated with a TTY.
|
|
15
|
+
* Always returns `false` in browser/Worker environments.
|
|
16
|
+
*/
|
|
17
|
+
function isatty(_fd) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Stub ReadStream class for browser/Worker environments.
|
|
22
|
+
*/
|
|
23
|
+
var ReadStream = class {
|
|
24
|
+
isTTY = false;
|
|
25
|
+
isRaw = false;
|
|
26
|
+
setRawMode(_mode) {
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Stub WriteStream class for browser/Worker environments.
|
|
32
|
+
*/
|
|
33
|
+
var WriteStream = class {
|
|
34
|
+
isTTY = false;
|
|
35
|
+
columns = 80;
|
|
36
|
+
rows = 24;
|
|
37
|
+
clearLine(_dir, _callback) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
clearScreenDown(_callback) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
cursorTo(_x, _y, _callback) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
moveCursor(_dx, _dy, _callback) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
getColorDepth() {
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
hasColors(_count) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
getWindowSize() {
|
|
56
|
+
return [this.columns, this.rows];
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
var tty_default = {
|
|
60
|
+
isatty,
|
|
61
|
+
ReadStream,
|
|
62
|
+
WriteStream
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { ReadStream, WriteStream, tty_default as default, isatty };
|
|
67
|
+
//# sourceMappingURL=tty.js.map
|
package/dist/tty.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tty.js","names":[],"sources":["../src/tty.ts"],"sourcesContent":["/**\n * `node:tty` compatible entry point\n *\n * Browser/Worker environments have no TTY. All functions return safe defaults.\n *\n * @module tty\n */\n\n/**\n * @author kazuya kawaguchi (a.k.a. kazupon)\n * @license MIT\n */\n\n/**\n * Check if the given file descriptor is associated with a TTY.\n * Always returns `false` in browser/Worker environments.\n */\nexport function isatty(_fd?: number): boolean {\n return false\n}\n\n/**\n * Stub ReadStream class for browser/Worker environments.\n */\nexport class ReadStream {\n readonly isTTY = false as const\n readonly isRaw = false\n setRawMode(_mode: boolean): this {\n return this\n }\n}\n\n/**\n * Stub WriteStream class for browser/Worker environments.\n */\nexport class WriteStream {\n readonly isTTY = false as const\n readonly columns = 80\n readonly rows = 24\n clearLine(_dir: number, _callback?: () => void): boolean {\n return true\n }\n clearScreenDown(_callback?: () => void): boolean {\n return true\n }\n cursorTo(_x: number, _y?: number, _callback?: () => void): boolean {\n return true\n }\n moveCursor(_dx: number, _dy: number, _callback?: () => void): boolean {\n return true\n }\n getColorDepth(): number {\n return 1\n }\n hasColors(_count?: number): boolean {\n return false\n }\n getWindowSize(): [number, number] {\n return [this.columns, this.rows]\n }\n}\n\nexport default {\n isatty,\n ReadStream,\n WriteStream\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,OAAO,KAAuB;AAC5C,QAAO;;;;;AAMT,IAAa,aAAb,MAAwB;CACtB,AAAS,QAAQ;CACjB,AAAS,QAAQ;CACjB,WAAW,OAAsB;AAC/B,SAAO;;;;;;AAOX,IAAa,cAAb,MAAyB;CACvB,AAAS,QAAQ;CACjB,AAAS,UAAU;CACnB,AAAS,OAAO;CAChB,UAAU,MAAc,WAAiC;AACvD,SAAO;;CAET,gBAAgB,WAAiC;AAC/C,SAAO;;CAET,SAAS,IAAY,IAAa,WAAiC;AACjE,SAAO;;CAET,WAAW,KAAa,KAAa,WAAiC;AACpE,SAAO;;CAET,gBAAwB;AACtB,SAAO;;CAET,UAAU,QAA0B;AAClC,SAAO;;CAET,gBAAkC;AAChC,SAAO,CAAC,KAAK,SAAS,KAAK,KAAK;;;AAIpC,kBAAe;CACb;CACA;CACA;CACD"}
|