@flyingrobots/bijou-node 7.1.0 → 8.0.0-rc.1
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/dist/chalk-token-styler.d.ts +4 -0
- package/dist/chalk-token-styler.d.ts.map +1 -0
- package/dist/chalk-token-styler.js +79 -0
- package/dist/chalk-token-styler.js.map +1 -0
- package/dist/gifenc-runtime.d.ts +5 -0
- package/dist/gifenc-runtime.d.ts.map +1 -0
- package/dist/gifenc-runtime.js +30 -0
- package/dist/gifenc-runtime.js.map +1 -0
- package/dist/index.d.ts +7 -56
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -117
- package/dist/index.js.map +1 -1
- package/dist/index.test-support.d.ts +11 -0
- package/dist/index.test-support.d.ts.map +1 -0
- package/dist/index.test-support.js +9 -0
- package/dist/index.test-support.js.map +1 -0
- package/dist/index.test-support.part01.d.ts +28 -0
- package/dist/index.test-support.part01.d.ts.map +1 -0
- package/dist/index.test-support.part01.js +89 -0
- package/dist/index.test-support.part01.js.map +1 -0
- package/dist/index.test-support.part02.d.ts +5 -0
- package/dist/index.test-support.part02.d.ts.map +1 -0
- package/dist/index.test-support.part02.js +63 -0
- package/dist/index.test-support.part02.js.map +1 -0
- package/dist/io-types.d.ts +26 -0
- package/dist/io-types.d.ts.map +1 -0
- package/dist/io-types.js +2 -0
- package/dist/io-types.js.map +1 -0
- package/dist/io.d.ts +3 -18
- package/dist/io.d.ts.map +1 -1
- package/dist/io.js +10 -17
- package/dist/io.js.map +1 -1
- package/dist/io.test-support.d.ts +5 -0
- package/dist/io.test-support.d.ts.map +1 -0
- package/dist/io.test-support.js +13 -0
- package/dist/io.test-support.js.map +1 -0
- package/dist/node-context-selection.d.ts +11 -0
- package/dist/node-context-selection.d.ts.map +1 -0
- package/dist/node-context-selection.js +77 -0
- package/dist/node-context-selection.js.map +1 -0
- package/dist/node-context.d.ts +14 -0
- package/dist/node-context.d.ts.map +1 -0
- package/dist/node-context.js +30 -0
- package/dist/node-context.js.map +1 -0
- package/dist/oled-font.d.ts +8 -0
- package/dist/oled-font.d.ts.map +1 -0
- package/dist/oled-font.js +28 -0
- package/dist/oled-font.js.map +1 -0
- package/dist/options.d.ts +48 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +2 -0
- package/dist/options.js.map +1 -0
- package/dist/readline-output.d.ts +3 -0
- package/dist/readline-output.d.ts.map +1 -0
- package/dist/readline-output.js +20 -0
- package/dist/readline-output.js.map +1 -0
- package/dist/recorder.d.ts +2 -40
- package/dist/recorder.d.ts.map +1 -1
- package/dist/recorder.js +1 -240
- package/dist/recorder.js.map +1 -1
- package/dist/recorder.part01.d.ts +56 -0
- package/dist/recorder.part01.d.ts.map +1 -0
- package/dist/recorder.part01.js +76 -0
- package/dist/recorder.part01.js.map +1 -0
- package/dist/recorder.part02.d.ts +5 -0
- package/dist/recorder.part02.d.ts.map +1 -0
- package/dist/recorder.part02.js +54 -0
- package/dist/recorder.part02.js.map +1 -0
- package/dist/recorder.part03.d.ts +6 -0
- package/dist/recorder.part03.d.ts.map +1 -0
- package/dist/recorder.part03.js +118 -0
- package/dist/recorder.part03.js.map +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +10 -4
- package/dist/runtime.js.map +1 -1
- package/dist/style.d.ts +1 -8
- package/dist/style.d.ts.map +1 -1
- package/dist/style.js +10 -98
- package/dist/style.js.map +1 -1
- package/dist/worker/fixtures/echo-worker.js +7 -6
- package/dist/worker/fixtures/echo-worker.js.map +1 -1
- package/dist/worker/worker-data.d.ts +25 -0
- package/dist/worker/worker-data.d.ts.map +1 -0
- package/dist/worker/worker-data.js +44 -0
- package/dist/worker/worker-data.js.map +1 -0
- package/dist/worker/worker-mouse-mode.d.ts +10 -0
- package/dist/worker/worker-mouse-mode.d.ts.map +1 -0
- package/dist/worker/worker-mouse-mode.js +14 -0
- package/dist/worker/worker-mouse-mode.js.map +1 -0
- package/dist/worker/worker-options.d.ts +33 -0
- package/dist/worker/worker-options.d.ts.map +1 -0
- package/dist/worker/worker-options.js +2 -0
- package/dist/worker/worker-options.js.map +1 -0
- package/dist/worker/worker.d.ts +5 -106
- package/dist/worker/worker.d.ts.map +1 -1
- package/dist/worker/worker.js +3 -228
- package/dist/worker/worker.js.map +1 -1
- package/dist/worker/worker.part01.d.ts +59 -0
- package/dist/worker/worker.part01.d.ts.map +1 -0
- package/dist/worker/worker.part01.js +40 -0
- package/dist/worker/worker.part01.js.map +1 -0
- package/dist/worker/worker.part02.d.ts +12 -0
- package/dist/worker/worker.part02.d.ts.map +1 -0
- package/dist/worker/worker.part02.js +121 -0
- package/dist/worker/worker.part02.js.map +1 -0
- package/dist/worker/worker.part03.d.ts +13 -0
- package/dist/worker/worker.part03.d.ts.map +1 -0
- package/dist/worker/worker.part03.js +106 -0
- package/dist/worker/worker.part03.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { sanitizePositiveInt } from '@flyingrobots/bijou';
|
|
4
|
+
import { runScript } from '@flyingrobots/bijou-tui';
|
|
5
|
+
import { applyGifPalette, createGifEncoder, quantizeColors } from './gifenc-runtime.js';
|
|
6
|
+
import { DEFAULT_BACKGROUND, DEFAULT_FOREGROUND, fillRect, mixRgb, normalizeRgb, normalizeSurfaceFrame, parseHex, resolvedColorHex, resolvedColorRgb } from './recorder.part01.js';
|
|
7
|
+
import { drawBitmapGlyph, drawSpecialGlyph } from './recorder.part02.js';
|
|
8
|
+
function drawCell(rgba, width, height, cellX, cellY, cellWidth, cellHeight, cell, fallbackForeground, fallbackBackground) {
|
|
9
|
+
const modifiers = new Set(cell.modifiers ?? []);
|
|
10
|
+
const fgHex = resolvedColorHex(cell.fg);
|
|
11
|
+
const bgHex = resolvedColorHex(cell.bg);
|
|
12
|
+
let fg = normalizeRgb(cell.fgRGB ?? resolvedColorRgb(cell.fg) ?? parseHex(fgHex ?? fallbackForeground));
|
|
13
|
+
let bg = normalizeRgb(cell.bgRGB ?? resolvedColorRgb(cell.bg) ?? parseHex(bgHex ?? fallbackBackground));
|
|
14
|
+
if (modifiers.has('inverse')) {
|
|
15
|
+
[fg, bg] = [bg, fg];
|
|
16
|
+
}
|
|
17
|
+
if (modifiers.has('dim')) {
|
|
18
|
+
fg = mixRgb(fg, bg, 0.45);
|
|
19
|
+
}
|
|
20
|
+
const pixelX = cellX * cellWidth;
|
|
21
|
+
const pixelY = cellY * cellHeight;
|
|
22
|
+
fillRect(rgba, width, height, pixelX, pixelY, cellWidth, cellHeight, bg);
|
|
23
|
+
if (cell.empty || cell.char === ' ') {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const drawn = drawSpecialGlyph(rgba, width, height, pixelX, pixelY, cellWidth, cellHeight, cell.char, fg);
|
|
27
|
+
if (!drawn) {
|
|
28
|
+
drawBitmapGlyph(rgba, width, height, pixelX + 1, pixelY + 1, cell.char, fg);
|
|
29
|
+
}
|
|
30
|
+
if (modifiers.has('bold')) {
|
|
31
|
+
const boldDrawn = drawSpecialGlyph(rgba, width, height, pixelX + 1, pixelY, cellWidth, cellHeight, cell.char, fg);
|
|
32
|
+
if (!boldDrawn) {
|
|
33
|
+
drawBitmapGlyph(rgba, width, height, pixelX + 2, pixelY + 1, cell.char, fg);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (modifiers.has('underline')) {
|
|
37
|
+
fillRect(rgba, width, height, pixelX + 1, pixelY + cellHeight - 2, cellWidth - 2, 1, fg);
|
|
38
|
+
}
|
|
39
|
+
if (modifiers.has('strike')) {
|
|
40
|
+
fillRect(rgba, width, height, pixelX + 1, pixelY + Math.floor(cellHeight / 2), cellWidth - 2, 1, fg);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function rasterizeSurface(surface, options) {
|
|
44
|
+
const cellWidth = sanitizePositiveInt(options?.cellWidth, 8);
|
|
45
|
+
const cellHeight = sanitizePositiveInt(options?.cellHeight, 10);
|
|
46
|
+
const foreground = options?.foreground ?? DEFAULT_FOREGROUND;
|
|
47
|
+
const background = options?.background ?? DEFAULT_BACKGROUND;
|
|
48
|
+
const width = surface.width * cellWidth;
|
|
49
|
+
const height = surface.height * cellHeight;
|
|
50
|
+
const rgba = new Uint8Array(width * height * 4);
|
|
51
|
+
for (let y = 0; y < surface.height; y++) {
|
|
52
|
+
for (let x = 0; x < surface.width; x++) {
|
|
53
|
+
drawCell(rgba, width, height, x, y, cellWidth, cellHeight, surface.get(x, y), foreground, background);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return rgba;
|
|
57
|
+
}
|
|
58
|
+
function joinFrames(frames) {
|
|
59
|
+
const total = frames.reduce((sum, frame) => sum + frame.length, 0);
|
|
60
|
+
const joined = new Uint8Array(total);
|
|
61
|
+
let offset = 0;
|
|
62
|
+
for (const frame of frames) {
|
|
63
|
+
joined.set(frame, offset);
|
|
64
|
+
offset += frame.length;
|
|
65
|
+
}
|
|
66
|
+
return joined;
|
|
67
|
+
}
|
|
68
|
+
export function writeSurfaceGif(options) {
|
|
69
|
+
if (options.frames.length === 0) {
|
|
70
|
+
throw new Error('writeSurfaceGif() requires at least one frame');
|
|
71
|
+
}
|
|
72
|
+
const rasterOptions = {
|
|
73
|
+
cellWidth: sanitizePositiveInt(options.cellWidth, 8),
|
|
74
|
+
cellHeight: sanitizePositiveInt(options.cellHeight, 10),
|
|
75
|
+
foreground: options.foreground ?? DEFAULT_FOREGROUND,
|
|
76
|
+
background: options.background ?? DEFAULT_BACKGROUND,
|
|
77
|
+
};
|
|
78
|
+
const width = Math.max(...options.frames.map((frame) => frame.width));
|
|
79
|
+
const height = Math.max(...options.frames.map((frame) => frame.height));
|
|
80
|
+
const frames = options.frames
|
|
81
|
+
.map((frame) => normalizeSurfaceFrame(frame, width, height))
|
|
82
|
+
.map((frame) => rasterizeSurface(frame, rasterOptions));
|
|
83
|
+
const palette = quantizeColors(joinFrames(frames), 256, { format: 'rgb565' });
|
|
84
|
+
const gif = createGifEncoder();
|
|
85
|
+
const delay = Math.max(2, Math.round(sanitizePositiveInt(options.frameDelayMs, 90) / 10));
|
|
86
|
+
for (const frame of frames) {
|
|
87
|
+
const indexed = applyGifPalette(frame, palette);
|
|
88
|
+
gif.writeFrame(indexed, width * rasterOptions.cellWidth, height * rasterOptions.cellHeight, {
|
|
89
|
+
palette,
|
|
90
|
+
delay,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
gif.finish();
|
|
94
|
+
mkdirSync(dirname(options.outputPath), { recursive: true });
|
|
95
|
+
writeFileSync(options.outputPath, Buffer.from(gif.bytes()));
|
|
96
|
+
return {
|
|
97
|
+
outputPath: options.outputPath,
|
|
98
|
+
frames: frames.length,
|
|
99
|
+
width: width * rasterOptions.cellWidth,
|
|
100
|
+
height: height * rasterOptions.cellHeight,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export async function recordDemoGif(spec) {
|
|
104
|
+
const result = await runScript(spec.app, spec.steps, {
|
|
105
|
+
ctx: spec.ctx,
|
|
106
|
+
css: spec.css,
|
|
107
|
+
});
|
|
108
|
+
return writeSurfaceGif({
|
|
109
|
+
outputPath: spec.outputPath,
|
|
110
|
+
frames: result.frames,
|
|
111
|
+
frameDelayMs: spec.frameDelayMs,
|
|
112
|
+
cellWidth: spec.cellWidth,
|
|
113
|
+
cellHeight: spec.cellHeight,
|
|
114
|
+
foreground: spec.foreground,
|
|
115
|
+
background: spec.background,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=recorder.part03.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.part03.js","sourceRoot":"","sources":["../src/recorder.part03.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;AAUD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,WAAW,CA8BzC"}
|
package/dist/runtime.js
CHANGED
|
@@ -16,6 +16,12 @@ export function detectRefreshRate() {
|
|
|
16
16
|
// Future: add platform-specific detection logic here
|
|
17
17
|
return 60;
|
|
18
18
|
}
|
|
19
|
+
function streamIsTTY(stream) {
|
|
20
|
+
return stream.isTTY ?? false;
|
|
21
|
+
}
|
|
22
|
+
function streamDimension(value, fallback) {
|
|
23
|
+
return value ?? fallback;
|
|
24
|
+
}
|
|
19
25
|
/**
|
|
20
26
|
* Create a {@link RuntimePort} backed by Node.js `process` globals.
|
|
21
27
|
*
|
|
@@ -37,19 +43,19 @@ export function nodeRuntime() {
|
|
|
37
43
|
},
|
|
38
44
|
/** Whether `process.stdout` is attached to a TTY. Falls back to `false`. */
|
|
39
45
|
get stdoutIsTTY() {
|
|
40
|
-
return process.stdout
|
|
46
|
+
return streamIsTTY(process.stdout);
|
|
41
47
|
},
|
|
42
48
|
/** Whether `process.stdin` is attached to a TTY. Falls back to `false`. */
|
|
43
49
|
get stdinIsTTY() {
|
|
44
|
-
return process.stdin
|
|
50
|
+
return streamIsTTY(process.stdin);
|
|
45
51
|
},
|
|
46
52
|
/** Terminal width in columns from `process.stdout`. Falls back to `80`. */
|
|
47
53
|
get columns() {
|
|
48
|
-
return process.stdout.columns
|
|
54
|
+
return streamDimension(process.stdout.columns, 80);
|
|
49
55
|
},
|
|
50
56
|
/** Terminal height in rows from `process.stdout`. Falls back to `24`. */
|
|
51
57
|
get rows() {
|
|
52
|
-
return process.stdout.rows
|
|
58
|
+
return streamDimension(process.stdout.rows, 24);
|
|
53
59
|
},
|
|
54
60
|
/** Refresh rate in FPS. Defaults to 60, or BIJOU_FPS if set. */
|
|
55
61
|
get refreshRate() {
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IAClD,CAAC;IAED,qDAAqD;IAErD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL;;;WAGG;QACH,GAAG,CAAC,GAAW;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,4EAA4E;QAC5E,IAAI,WAAW;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IAClD,CAAC;IAED,qDAAqD;IAErD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,MAA2B;IAC9C,OAAO,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB,EAAE,QAAgB;IAClE,OAAO,KAAK,IAAI,QAAQ,CAAC;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL;;;WAGG;QACH,GAAG,CAAC,GAAW;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,4EAA4E;QAC5E,IAAI,WAAW;YACb,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,2EAA2E;QAC3E,IAAI,UAAU;YACZ,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;QACD,2EAA2E;QAC3E,IAAI,OAAO;YACT,OAAO,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,yEAAyE;QACzE,IAAI,IAAI;YACN,OAAO,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,gEAAgE;QAChE,IAAI,WAAW;YACb,OAAO,iBAAiB,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/style.d.ts
CHANGED
|
@@ -14,12 +14,5 @@ export interface ChalkStyleOptions {
|
|
|
14
14
|
* @param noColor - Pass `true` to suppress all ANSI styling.
|
|
15
15
|
* @returns A {@link StylePort} implemented via chalk.
|
|
16
16
|
*/
|
|
17
|
-
export declare function chalkStyle(
|
|
18
|
-
/**
|
|
19
|
-
* Create a chalk-backed {@link StylePort} with detailed options.
|
|
20
|
-
*
|
|
21
|
-
* @param options - Configuration including `noColor` flag and explicit chalk `level`.
|
|
22
|
-
* @returns A {@link StylePort} implemented via chalk.
|
|
23
|
-
*/
|
|
24
|
-
export declare function chalkStyle(options?: ChalkStyleOptions): StylePort;
|
|
17
|
+
export declare function chalkStyle(arg?: boolean | ChalkStyleOptions): StylePort;
|
|
25
18
|
//# sourceMappingURL=style.d.ts.map
|
package/dist/style.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAC;AAGjE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qFAAqF;IACrF,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAmFvE"}
|
package/dist/style.js
CHANGED
|
@@ -1,98 +1,18 @@
|
|
|
1
1
|
import chalk, { Chalk } from 'chalk';
|
|
2
|
-
|
|
2
|
+
import { createChalkTokenStyler } from './chalk-token-styler.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a chalk-backed {@link StylePort} with optional color suppression.
|
|
5
|
+
*
|
|
6
|
+
* @param noColor - Pass `true` to suppress all ANSI styling.
|
|
7
|
+
* @returns A {@link StylePort} implemented via chalk.
|
|
8
|
+
*/
|
|
3
9
|
export function chalkStyle(arg) {
|
|
4
10
|
const opts = typeof arg === 'boolean' ? { noColor: arg } : (arg ?? {});
|
|
5
11
|
const isNoColor = opts.noColor ?? false;
|
|
6
|
-
const instance = opts.level !== undefined
|
|
7
|
-
? new Chalk({ level: opts.level })
|
|
8
|
-
: chalk;
|
|
12
|
+
const instance = opts.level !== undefined ? new Chalk({ level: opts.level }) : chalk;
|
|
9
13
|
/** Whether ANSI styling is active (respects both noColor flag and chalk level). */
|
|
10
14
|
const ansiEnabled = !isNoColor && instance.level > 0;
|
|
11
|
-
const
|
|
12
|
-
/** SGR codes for underline variants (not supported by chalk natively). */
|
|
13
|
-
const UNDERLINE_VARIANT_SGR = {
|
|
14
|
-
'curly-underline': '\x1b[4:3m',
|
|
15
|
-
'dotted-underline': '\x1b[4:4m',
|
|
16
|
-
'dashed-underline': '\x1b[4:5m',
|
|
17
|
-
};
|
|
18
|
-
/** SGR 24 resets underline. */
|
|
19
|
-
const UNDERLINE_RESET = '\x1b[24m';
|
|
20
|
-
/**
|
|
21
|
-
* Chain text-decoration modifiers onto a chalk instance.
|
|
22
|
-
*
|
|
23
|
-
* @param c - Base chalk instance (already color-configured).
|
|
24
|
-
* @param modifiers - Optional array of modifier names from a {@link TokenValue}.
|
|
25
|
-
* @returns The chalk instance with all modifiers applied.
|
|
26
|
-
*/
|
|
27
|
-
function applyModifiers(c, modifiers) {
|
|
28
|
-
if (modifiers === undefined)
|
|
29
|
-
return c;
|
|
30
|
-
let result = c;
|
|
31
|
-
for (const mod of modifiers) {
|
|
32
|
-
switch (mod) {
|
|
33
|
-
case 'bold':
|
|
34
|
-
result = result.bold;
|
|
35
|
-
break;
|
|
36
|
-
case 'dim':
|
|
37
|
-
result = result.dim;
|
|
38
|
-
break;
|
|
39
|
-
case 'strikethrough':
|
|
40
|
-
result = result.strikethrough;
|
|
41
|
-
break;
|
|
42
|
-
case 'inverse':
|
|
43
|
-
result = result.inverse;
|
|
44
|
-
break;
|
|
45
|
-
case 'underline':
|
|
46
|
-
result = result.underline;
|
|
47
|
-
break;
|
|
48
|
-
// Underline variants are handled after chalk styling via raw SGR wrapping
|
|
49
|
-
case 'curly-underline':
|
|
50
|
-
case 'dotted-underline':
|
|
51
|
-
case 'dashed-underline': break;
|
|
52
|
-
default: {
|
|
53
|
-
const _exhaustive = mod;
|
|
54
|
-
void _exhaustive;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Wrap text with raw SGR sequences for underline variants that chalk
|
|
62
|
-
* doesn't support natively. Called after chalk styling is applied.
|
|
63
|
-
*/
|
|
64
|
-
function applyUnderlineVariants(text, modifiers) {
|
|
65
|
-
if (!ansiEnabled || modifiers === undefined)
|
|
66
|
-
return text;
|
|
67
|
-
let result = text;
|
|
68
|
-
for (const mod of modifiers) {
|
|
69
|
-
const sgr = UNDERLINE_VARIANT_SGR[mod];
|
|
70
|
-
if (sgr) {
|
|
71
|
-
result = sgr + result + UNDERLINE_RESET;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
function styleCacheKey(token) {
|
|
77
|
-
return [
|
|
78
|
-
token.hex ?? '',
|
|
79
|
-
token.bg ?? '',
|
|
80
|
-
token.modifiers?.join(',') ?? '',
|
|
81
|
-
].join('|');
|
|
82
|
-
}
|
|
83
|
-
function compileStyled(token) {
|
|
84
|
-
const base = applyModifiers(token.hex ? instance.hex(token.hex) : instance, token.modifiers);
|
|
85
|
-
const background = token.bg ? instance.bgHex(token.bg) : null;
|
|
86
|
-
const modifiers = token.modifiers;
|
|
87
|
-
return (text) => {
|
|
88
|
-
let result = base(text);
|
|
89
|
-
result = applyUnderlineVariants(result, modifiers);
|
|
90
|
-
if (background) {
|
|
91
|
-
result = background(result);
|
|
92
|
-
}
|
|
93
|
-
return result;
|
|
94
|
-
};
|
|
95
|
-
}
|
|
15
|
+
const styleToken = createChalkTokenStyler(instance, ansiEnabled);
|
|
96
16
|
return {
|
|
97
17
|
/**
|
|
98
18
|
* Apply a resolved design-token's hex color and modifiers to text.
|
|
@@ -102,15 +22,7 @@ export function chalkStyle(arg) {
|
|
|
102
22
|
* @returns Styled text, or unmodified text when ANSI output is disabled via `noColor` or `level: 0`.
|
|
103
23
|
*/
|
|
104
24
|
styled(token, text) {
|
|
105
|
-
|
|
106
|
-
return text;
|
|
107
|
-
const key = styleCacheKey(token);
|
|
108
|
-
let styler = styledCache.get(key);
|
|
109
|
-
if (styler == null) {
|
|
110
|
-
styler = compileStyled(token);
|
|
111
|
-
styledCache.set(key, styler);
|
|
112
|
-
}
|
|
113
|
-
return styler(text);
|
|
25
|
+
return styleToken(token, text);
|
|
114
26
|
},
|
|
115
27
|
/**
|
|
116
28
|
* Apply a 24-bit RGB foreground color to text.
|
package/dist/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAsB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,EAAsB,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAYjE;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAiC;IAC1D,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACxC,MAAM,QAAQ,GACZ,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtE,mFAAmF;IACnF,MAAM,WAAW,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEjE,OAAO;QACL;;;;;;WAMG;QACH,MAAM,CAAC,KAAiB,EAAE,IAAY;YACpC,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC;QACD;;;;;;;;WAQG;QACH,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY;YAC/C,IAAI,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED;;;;;;WAMG;QACH,GAAG,CAAC,KAAa,EAAE,IAAY;YAC7B,IAAI,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED;;;;;;;;WAQG;QACH,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY;YACjD,IAAI,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAED;;;;;;WAMG;QACH,KAAK,CAAC,KAAa,EAAE,IAAY;YAC/B,IAAI,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QAED;;;;;WAKG;QACH,IAAI,CAAC,IAAY;YACf,IAAI,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { isMainThread, parentPort } from 'node:worker_threads';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
const port = parentPort;
|
|
3
|
+
if (!isMainThread && port) {
|
|
4
|
+
port.postMessage({ type: 'render:frame', output: 'worker:booting' });
|
|
5
|
+
port.on('message', (msg) => {
|
|
5
6
|
if (msg.type === 'data') {
|
|
6
7
|
const text = msg.payload?.text ?? 'unknown';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
port.postMessage({ type: 'data', payload: { type: 'ack', text } });
|
|
9
|
+
port.postMessage({ type: 'render:frame', output: `worker:${text}` });
|
|
10
|
+
port.postMessage({ type: 'quit' });
|
|
10
11
|
}
|
|
11
12
|
});
|
|
12
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"echo-worker.js","sourceRoot":"","sources":["../../../src/worker/fixtures/echo-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,IAAI,CAAC,YAAY,IAAI,
|
|
1
|
+
{"version":3,"file":"echo-worker.js","sourceRoot":"","sources":["../../../src/worker/fixtures/echo-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,IAAI,GAAG,UAAU,CAAC;AAExB,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;IAC1B,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAErE,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAkD,EAAE,EAAE;QACxE,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;YACrE,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface WorkerSerializableOptions {
|
|
2
|
+
altScreen?: boolean;
|
|
3
|
+
hideCursor?: boolean;
|
|
4
|
+
mouse?: boolean;
|
|
5
|
+
mouseMode?: 'press' | 'drag' | 'any';
|
|
6
|
+
css?: string;
|
|
7
|
+
}
|
|
8
|
+
interface BijouWorkerFlag {
|
|
9
|
+
readonly isBijouWorker: true;
|
|
10
|
+
readonly options?: unknown;
|
|
11
|
+
readonly runtime?: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface BijouWorkerData {
|
|
14
|
+
isBijouWorker: true;
|
|
15
|
+
options: WorkerSerializableOptions;
|
|
16
|
+
runtime: {
|
|
17
|
+
columns: number;
|
|
18
|
+
rows: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare function hasBijouWorkerFlag(value: unknown): value is BijouWorkerFlag;
|
|
22
|
+
export declare function readBijouWorkerData(value: unknown): BijouWorkerData;
|
|
23
|
+
export declare function isObjectRecord(value: unknown): value is Record<string, unknown>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=worker-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-data.d.ts","sourceRoot":"","sources":["../../src/worker/worker-data.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,IAAI,CAAC;IACpB,OAAO,EAAE,yBAAyB,CAAC;IACnC,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAgBnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function hasBijouWorkerFlag(value) {
|
|
2
|
+
return isObjectRecord(value) && value['isBijouWorker'] === true;
|
|
3
|
+
}
|
|
4
|
+
export function readBijouWorkerData(value) {
|
|
5
|
+
if (!hasBijouWorkerFlag(value)) {
|
|
6
|
+
throw new Error('startWorkerApp requires Bijou worker data');
|
|
7
|
+
}
|
|
8
|
+
const options = value.options;
|
|
9
|
+
const runtime = value.runtime;
|
|
10
|
+
if (!isWorkerSerializableOptions(options) || !isRuntimeViewportData(runtime)) {
|
|
11
|
+
throw new Error('startWorkerApp received malformed Bijou worker data');
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
isBijouWorker: true,
|
|
15
|
+
options,
|
|
16
|
+
runtime,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function isObjectRecord(value) {
|
|
20
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
21
|
+
}
|
|
22
|
+
function isWorkerSerializableOptions(value) {
|
|
23
|
+
return isObjectRecord(value)
|
|
24
|
+
&& optionalBoolean(value['altScreen'])
|
|
25
|
+
&& optionalBoolean(value['hideCursor'])
|
|
26
|
+
&& optionalBoolean(value['mouse'])
|
|
27
|
+
&& optionalMouseMode(value['mouseMode'])
|
|
28
|
+
&& optionalString(value['css']);
|
|
29
|
+
}
|
|
30
|
+
function isRuntimeViewportData(value) {
|
|
31
|
+
return isObjectRecord(value)
|
|
32
|
+
&& typeof value['columns'] === 'number'
|
|
33
|
+
&& typeof value['rows'] === 'number';
|
|
34
|
+
}
|
|
35
|
+
function optionalBoolean(value) {
|
|
36
|
+
return value === undefined || typeof value === 'boolean';
|
|
37
|
+
}
|
|
38
|
+
function optionalMouseMode(value) {
|
|
39
|
+
return value === undefined || value === 'press' || value === 'drag' || value === 'any';
|
|
40
|
+
}
|
|
41
|
+
function optionalString(value) {
|
|
42
|
+
return value === undefined || typeof value === 'string';
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=worker-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-data.js","sourceRoot":"","sources":["../../src/worker/worker-data.ts"],"names":[],"mappings":"AAuBA,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAc;IACjD,OAAO,cAAc,CAAC,KAAK,CAAC;WACvB,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;WACnC,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;WACpC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;WAC/B,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;WACrC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,cAAc,CAAC,KAAK,CAAC;WACvB,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ;WACpC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AACzF,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type WorkerMouseTrackingMode = 'press' | 'drag' | 'any';
|
|
2
|
+
export declare const DISABLE_MOUSE = "\u001B[?1000l\u001B[?1002l\u001B[?1003l\u001B[?1006l";
|
|
3
|
+
interface WorkerMouseModeOptions {
|
|
4
|
+
readonly mouse?: boolean;
|
|
5
|
+
readonly mouseMode?: WorkerMouseTrackingMode;
|
|
6
|
+
}
|
|
7
|
+
export declare function resolveWorkerMouseMode(options: WorkerMouseModeOptions): WorkerMouseTrackingMode | undefined;
|
|
8
|
+
export declare function mouseModeEnableSequence(mode: WorkerMouseTrackingMode): string;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=worker-mouse-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-mouse-mode.d.ts","sourceRoot":"","sources":["../../src/worker/worker-mouse-mode.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAE/D,eAAO,MAAM,aAAa,yDAAiD,CAAC;AAE5E,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,uBAAuB,CAAC;CAC9C;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,sBAAsB,GAC9B,uBAAuB,GAAG,SAAS,CAGrC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAI7E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const DISABLE_MOUSE = '\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1006l';
|
|
2
|
+
export function resolveWorkerMouseMode(options) {
|
|
3
|
+
if (options.mouseMode !== undefined)
|
|
4
|
+
return options.mouseMode;
|
|
5
|
+
return options.mouse === true ? 'drag' : undefined;
|
|
6
|
+
}
|
|
7
|
+
export function mouseModeEnableSequence(mode) {
|
|
8
|
+
if (mode === 'press')
|
|
9
|
+
return '\x1b[?1000h\x1b[?1002l\x1b[?1003l\x1b[?1006h';
|
|
10
|
+
if (mode === 'any')
|
|
11
|
+
return '\x1b[?1000h\x1b[?1002l\x1b[?1003h\x1b[?1006h';
|
|
12
|
+
return '\x1b[?1000h\x1b[?1002h\x1b[?1003l\x1b[?1006h';
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=worker-mouse-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-mouse-mode.js","sourceRoot":"","sources":["../../src/worker/worker-mouse-mode.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,8CAA8C,CAAC;AAO5E,MAAM,UAAU,sBAAsB,CACpC,OAA+B;IAE/B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,SAAS,CAAC;IAC9D,OAAO,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAA6B;IACnE,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,8CAA8C,CAAC;IAC5E,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,8CAA8C,CAAC;IAC1E,OAAO,8CAA8C,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { BijouContext } from '@flyingrobots/bijou';
|
|
2
|
+
import type { WorkerMouseTrackingMode } from './worker-mouse-mode.js';
|
|
3
|
+
/** Options for starting an app in a background worker. */
|
|
4
|
+
export interface RunWorkerOptions {
|
|
5
|
+
/** The absolute path to the worker entry file. */
|
|
6
|
+
entry: string;
|
|
7
|
+
/** Optional Bijou context for the host thread. */
|
|
8
|
+
ctx?: BijouContext;
|
|
9
|
+
/** Enter the alternate screen buffer on startup. */
|
|
10
|
+
altScreen?: boolean;
|
|
11
|
+
/** Hide the cursor on startup. */
|
|
12
|
+
hideCursor?: boolean;
|
|
13
|
+
/** Enable mouse input. */
|
|
14
|
+
mouse?: boolean;
|
|
15
|
+
/** Mouse tracking mode. Supplying this implies `mouse: true`. */
|
|
16
|
+
mouseMode?: WorkerMouseTrackingMode;
|
|
17
|
+
/** Optional BCSS stylesheet string. */
|
|
18
|
+
css?: string;
|
|
19
|
+
/** Callback for custom data messages sent from the worker. */
|
|
20
|
+
onMessage?: (payload: unknown) => void;
|
|
21
|
+
/** Optional arguments passed to the Node.js worker process. */
|
|
22
|
+
execArgv?: string[];
|
|
23
|
+
}
|
|
24
|
+
/** Handle for a running background worker. */
|
|
25
|
+
export interface WorkerHandle {
|
|
26
|
+
/** Sends a custom data message to the worker thread. */
|
|
27
|
+
send(payload: unknown): void;
|
|
28
|
+
/** Forcefully terminate the worker thread. */
|
|
29
|
+
terminate(): Promise<void>;
|
|
30
|
+
/** Resolves when the worker exits cleanly. */
|
|
31
|
+
onExit: Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=worker-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-options.d.ts","sourceRoot":"","sources":["../../src/worker/worker-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,8CAA8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,8CAA8C;IAC9C,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-options.js","sourceRoot":"","sources":["../../src/worker/worker-options.ts"],"names":[],"mappings":""}
|