colorino 0.4.0 → 0.6.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/README.md CHANGED
@@ -288,7 +288,7 @@ We welcome contributions! Here's exactly how to get started:
288
288
  # Run only Node.js tests
289
289
  npm run test:node
290
290
 
291
- # Run only Browser tests (JSDOM)
291
+ # Run only Browser tests
292
292
  npm run test:browser
293
293
 
294
294
  # Watch mode with UI (great for dev!)
package/dist/browser.cjs CHANGED
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const determineBaseTheme = require('./shared/colorino.BUBv72sF.cjs');
4
- require('neverthrow');
3
+ const determineBaseTheme = require('./shared/colorino.B9WUj1qg.cjs');
5
4
 
6
5
  class BrowserColorSupportDetector {
7
6
  constructor(_window, _navigator, _overrideTheme) {
@@ -69,5 +68,6 @@ function createColorino(palette = {}, options = {}) {
69
68
  }
70
69
  const colorino = createColorino();
71
70
 
71
+ exports.themePalettes = determineBaseTheme.themePalettes;
72
72
  exports.colorino = colorino;
73
73
  exports.createColorino = createColorino;
@@ -1,6 +1,5 @@
1
- import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.ODiKA7Gy.cjs';
2
- export { L as LogLevel, T as ThemeName } from './shared/colorino.ODiKA7Gy.cjs';
3
- import 'neverthrow';
1
+ import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.DBw7jOfy.cjs';
2
+ export { L as LogLevel, T as ThemeName, t as themePalettes } from './shared/colorino.DBw7jOfy.cjs';
4
3
 
5
4
  declare function createColorino(palette?: Partial<Palette>, options?: ColorinoOptions): Colorino;
6
5
 
@@ -1,6 +1,5 @@
1
- import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.ODiKA7Gy.mjs';
2
- export { L as LogLevel, T as ThemeName } from './shared/colorino.ODiKA7Gy.mjs';
3
- import 'neverthrow';
1
+ import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.DBw7jOfy.mjs';
2
+ export { L as LogLevel, T as ThemeName, t as themePalettes } from './shared/colorino.DBw7jOfy.mjs';
4
3
 
5
4
  declare function createColorino(palette?: Partial<Palette>, options?: ColorinoOptions): Colorino;
6
5
 
package/dist/browser.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.ODiKA7Gy.js';
2
- export { L as LogLevel, T as ThemeName } from './shared/colorino.ODiKA7Gy.js';
3
- import 'neverthrow';
1
+ import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.DBw7jOfy.js';
2
+ export { L as LogLevel, T as ThemeName, t as themePalettes } from './shared/colorino.DBw7jOfy.js';
4
3
 
5
4
  declare function createColorino(palette?: Partial<Palette>, options?: ColorinoOptions): Colorino;
6
5
 
package/dist/browser.mjs CHANGED
@@ -1,5 +1,4 @@
1
- import { C as ColorLevel, t as themePalettes, a as Colorino, I as InputValidator, d as determineBaseTheme } from './shared/colorino.B16XJPJ-.mjs';
2
- import 'neverthrow';
1
+ import { C as ColorLevel, t as themePalettes, a as Colorino, I as InputValidator, d as determineBaseTheme } from './shared/colorino.CsFoITs1.mjs';
3
2
 
4
3
  class BrowserColorSupportDetector {
5
4
  constructor(_window, _navigator, _overrideTheme) {
@@ -67,4 +66,4 @@ function createColorino(palette = {}, options = {}) {
67
66
  }
68
67
  const colorino = createColorino();
69
68
 
70
- export { colorino, createColorino };
69
+ export { colorino, createColorino, themePalettes };
package/dist/node.cjs CHANGED
@@ -1,16 +1,92 @@
1
1
  'use strict';
2
2
 
3
- const determineBaseTheme = require('./shared/colorino.BUBv72sF.cjs');
4
- const node_url = require('node:url');
5
- const node_child_process = require('node:child_process');
6
- const node_path = require('node:path');
7
- const neverthrow = require('neverthrow');
3
+ const determineBaseTheme = require('./shared/colorino.B9WUj1qg.cjs');
4
+
5
+ class OscThemeQuerier {
6
+ constructor(_stdin, _stdout, _timeout = 300, _cacheTtl = 36e5) {
7
+ this._stdin = _stdin;
8
+ this._stdout = _stdout;
9
+ this._timeout = _timeout;
10
+ this._cacheTtl = _cacheTtl;
11
+ }
12
+ _cachedResult;
13
+ _cacheTimestamp;
14
+ query() {
15
+ if (!this._stdout.isTTY || typeof this._stdin.setRawMode !== "function") {
16
+ return determineBaseTheme.err(new determineBaseTheme.OscQueryError("Not a TTY environment"));
17
+ }
18
+ const now = Date.now();
19
+ if (this._cachedResult !== void 0 && this._cacheTimestamp !== void 0 && now - this._cacheTimestamp < this._cacheTtl) {
20
+ return this._cachedResult;
21
+ }
22
+ const result = this._performQuery();
23
+ this._cachedResult = result;
24
+ this._cacheTimestamp = now;
25
+ return result;
26
+ }
27
+ _performQuery() {
28
+ const originalRawMode = this._stdin.isRaw;
29
+ let buffer = "";
30
+ this._stdin.setRawMode(true);
31
+ this._stdin.resume();
32
+ this._stdout.write("\x1B]11;?\x1B\\");
33
+ const startTime = Date.now();
34
+ const pollInterval = 10;
35
+ while (Date.now() - startTime < this._timeout) {
36
+ const chunk = this._stdin.read();
37
+ if (chunk !== null) {
38
+ buffer += chunk.toString();
39
+ const parseResult = this._parseResponse(buffer);
40
+ if (parseResult.isOk()) {
41
+ this._cleanup(originalRawMode);
42
+ return parseResult;
43
+ }
44
+ }
45
+ this._sleepSync(pollInterval);
46
+ }
47
+ this._cleanup(originalRawMode);
48
+ return determineBaseTheme.err(
49
+ new determineBaseTheme.OscQueryError("OSC query timeout - terminal did not respond")
50
+ );
51
+ }
52
+ _cleanup(originalRawMode) {
53
+ this._stdin.setRawMode(originalRawMode);
54
+ this._stdin.pause();
55
+ }
56
+ _sleepSync(ms) {
57
+ const buffer = new SharedArrayBuffer(4);
58
+ const view = new Int32Array(buffer);
59
+ Atomics.wait(view, 0, 0, ms);
60
+ }
61
+ _parseResponse(response) {
62
+ const rgbMatch = response.match(
63
+ /rgb:([0-9a-f]{2,4})\/([0-9a-f]{2,4})\/([0-9a-f]{2,4})/i
64
+ );
65
+ if (!rgbMatch) {
66
+ return determineBaseTheme.err(new determineBaseTheme.OscQueryError("No valid OSC response found in buffer"));
67
+ }
68
+ const red = this._normalizeHex(rgbMatch[1]);
69
+ const green = this._normalizeHex(rgbMatch[2]);
70
+ const blue = this._normalizeHex(rgbMatch[3]);
71
+ const luminance = this._calculateLuminance(red, green, blue);
72
+ return determineBaseTheme.ok(luminance < 0.5 ? "dark" : "light");
73
+ }
74
+ _normalizeHex(hexValue) {
75
+ const normalized = hexValue.padEnd(4, "0").slice(0, 2);
76
+ return parseInt(normalized, 16);
77
+ }
78
+ _calculateLuminance(red, green, blue) {
79
+ return (0.299 * red + 0.587 * green + 0.114 * blue) / 255;
80
+ }
81
+ }
8
82
 
9
- var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
10
83
  class NodeColorSupportDetector {
11
84
  constructor(_process, overrideTheme) {
12
85
  this._process = _process;
13
- if (!this.isNodeEnv()) return;
86
+ if (!this.isNodeEnv()) {
87
+ this._theme = "unknown";
88
+ return;
89
+ }
14
90
  const processEnv = _process.env;
15
91
  this._envForceColor = processEnv["FORCE_COLOR"];
16
92
  this._envNoColor = processEnv["NO_COLOR"];
@@ -20,7 +96,20 @@ class NodeColorSupportDetector {
20
96
  this._envCliColorForce = processEnv["CLICOLOR_FORCE"];
21
97
  this._envWtSession = processEnv["WT_SESSION"];
22
98
  this._isTTY = !!_process.stdout.isTTY;
23
- this._overrideTheme = overrideTheme;
99
+ if (overrideTheme !== void 0) {
100
+ this._theme = overrideTheme;
101
+ return;
102
+ }
103
+ if (!this._isTTY) {
104
+ this._theme = "unknown";
105
+ return;
106
+ }
107
+ const querier = new OscThemeQuerier(
108
+ _process.stdin,
109
+ _process.stdout
110
+ );
111
+ const result = querier.query();
112
+ this._theme = result.isOk() ? result.value : "unknown";
24
113
  }
25
114
  _envForceColor;
26
115
  _envTerm;
@@ -30,10 +119,13 @@ class NodeColorSupportDetector {
30
119
  _envCliColorForce;
31
120
  _envWtSession;
32
121
  _isTTY;
33
- _overrideTheme;
122
+ _theme;
34
123
  isNodeEnv() {
35
124
  return typeof this._process !== "undefined";
36
125
  }
126
+ getTheme() {
127
+ return this._theme;
128
+ }
37
129
  getColorLevel() {
38
130
  if (this._envNoColor !== void 0) {
39
131
  return determineBaseTheme.ColorLevel.NO_COLOR;
@@ -85,31 +177,6 @@ class NodeColorSupportDetector {
85
177
  }
86
178
  return this._isTTY || isForced ? determineBaseTheme.ColorLevel.ANSI : determineBaseTheme.ColorLevel.NO_COLOR;
87
179
  }
88
- getTheme() {
89
- if (this._overrideTheme) return this._overrideTheme;
90
- if (!this.isNodeEnv() || !this._isTTY) return "unknown";
91
- const __dirname = node_path.dirname(node_url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('node.cjs', document.baseURI).href))));
92
- const scriptPath = node_path.join(__dirname, "./run-osc-querier.js");
93
- const spawnResult = neverthrow.Result.fromThrowable(
94
- () => node_child_process.spawnSync(process.execPath, [scriptPath], {
95
- stdio: ["inherit", "pipe", "pipe"],
96
- timeout: 1e3,
97
- encoding: "utf-8"
98
- }),
99
- (error) => error
100
- )();
101
- if (spawnResult.isErr()) {
102
- return "unknown";
103
- }
104
- const processOutput = spawnResult.value;
105
- if (processOutput.status !== 0 || processOutput.error) {
106
- return "unknown";
107
- }
108
- const output = processOutput.stdout?.trim();
109
- if (output === "dark") return "dark";
110
- if (output === "light") return "light";
111
- return "unknown";
112
- }
113
180
  }
114
181
 
115
182
  function createColorino(palette = {}, options = {}) {
@@ -139,5 +206,6 @@ function createColorino(palette = {}, options = {}) {
139
206
  }
140
207
  const colorino = createColorino();
141
208
 
209
+ exports.themePalettes = determineBaseTheme.themePalettes;
142
210
  exports.colorino = colorino;
143
211
  exports.createColorino = createColorino;
package/dist/node.d.cts CHANGED
@@ -1,6 +1,5 @@
1
- import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.ODiKA7Gy.cjs';
2
- export { L as LogLevel, T as ThemeName } from './shared/colorino.ODiKA7Gy.cjs';
3
- import 'neverthrow';
1
+ import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.DBw7jOfy.cjs';
2
+ export { L as LogLevel, T as ThemeName, t as themePalettes } from './shared/colorino.DBw7jOfy.cjs';
4
3
 
5
4
  declare function createColorino(palette?: Partial<Palette>, options?: ColorinoOptions): Colorino;
6
5
 
package/dist/node.d.mts CHANGED
@@ -1,6 +1,5 @@
1
- import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.ODiKA7Gy.mjs';
2
- export { L as LogLevel, T as ThemeName } from './shared/colorino.ODiKA7Gy.mjs';
3
- import 'neverthrow';
1
+ import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.DBw7jOfy.mjs';
2
+ export { L as LogLevel, T as ThemeName, t as themePalettes } from './shared/colorino.DBw7jOfy.mjs';
4
3
 
5
4
  declare function createColorino(palette?: Partial<Palette>, options?: ColorinoOptions): Colorino;
6
5
 
package/dist/node.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.ODiKA7Gy.js';
2
- export { L as LogLevel, T as ThemeName } from './shared/colorino.ODiKA7Gy.js';
3
- import 'neverthrow';
1
+ import { P as Palette, C as ColorinoOptions, a as Colorino } from './shared/colorino.DBw7jOfy.js';
2
+ export { L as LogLevel, T as ThemeName, t as themePalettes } from './shared/colorino.DBw7jOfy.js';
4
3
 
5
4
  declare function createColorino(palette?: Partial<Palette>, options?: ColorinoOptions): Colorino;
6
5
 
package/dist/node.mjs CHANGED
@@ -1,13 +1,90 @@
1
- import { C as ColorLevel, d as determineBaseTheme, t as themePalettes, a as Colorino, I as InputValidator } from './shared/colorino.B16XJPJ-.mjs';
2
- import { fileURLToPath } from 'node:url';
3
- import { spawnSync } from 'node:child_process';
4
- import { dirname, join } from 'node:path';
5
- import { Result } from 'neverthrow';
1
+ import { e as err, O as OscQueryError, o as ok, C as ColorLevel, d as determineBaseTheme, t as themePalettes, a as Colorino, I as InputValidator } from './shared/colorino.CsFoITs1.mjs';
2
+
3
+ class OscThemeQuerier {
4
+ constructor(_stdin, _stdout, _timeout = 300, _cacheTtl = 36e5) {
5
+ this._stdin = _stdin;
6
+ this._stdout = _stdout;
7
+ this._timeout = _timeout;
8
+ this._cacheTtl = _cacheTtl;
9
+ }
10
+ _cachedResult;
11
+ _cacheTimestamp;
12
+ query() {
13
+ if (!this._stdout.isTTY || typeof this._stdin.setRawMode !== "function") {
14
+ return err(new OscQueryError("Not a TTY environment"));
15
+ }
16
+ const now = Date.now();
17
+ if (this._cachedResult !== void 0 && this._cacheTimestamp !== void 0 && now - this._cacheTimestamp < this._cacheTtl) {
18
+ return this._cachedResult;
19
+ }
20
+ const result = this._performQuery();
21
+ this._cachedResult = result;
22
+ this._cacheTimestamp = now;
23
+ return result;
24
+ }
25
+ _performQuery() {
26
+ const originalRawMode = this._stdin.isRaw;
27
+ let buffer = "";
28
+ this._stdin.setRawMode(true);
29
+ this._stdin.resume();
30
+ this._stdout.write("\x1B]11;?\x1B\\");
31
+ const startTime = Date.now();
32
+ const pollInterval = 10;
33
+ while (Date.now() - startTime < this._timeout) {
34
+ const chunk = this._stdin.read();
35
+ if (chunk !== null) {
36
+ buffer += chunk.toString();
37
+ const parseResult = this._parseResponse(buffer);
38
+ if (parseResult.isOk()) {
39
+ this._cleanup(originalRawMode);
40
+ return parseResult;
41
+ }
42
+ }
43
+ this._sleepSync(pollInterval);
44
+ }
45
+ this._cleanup(originalRawMode);
46
+ return err(
47
+ new OscQueryError("OSC query timeout - terminal did not respond")
48
+ );
49
+ }
50
+ _cleanup(originalRawMode) {
51
+ this._stdin.setRawMode(originalRawMode);
52
+ this._stdin.pause();
53
+ }
54
+ _sleepSync(ms) {
55
+ const buffer = new SharedArrayBuffer(4);
56
+ const view = new Int32Array(buffer);
57
+ Atomics.wait(view, 0, 0, ms);
58
+ }
59
+ _parseResponse(response) {
60
+ const rgbMatch = response.match(
61
+ /rgb:([0-9a-f]{2,4})\/([0-9a-f]{2,4})\/([0-9a-f]{2,4})/i
62
+ );
63
+ if (!rgbMatch) {
64
+ return err(new OscQueryError("No valid OSC response found in buffer"));
65
+ }
66
+ const red = this._normalizeHex(rgbMatch[1]);
67
+ const green = this._normalizeHex(rgbMatch[2]);
68
+ const blue = this._normalizeHex(rgbMatch[3]);
69
+ const luminance = this._calculateLuminance(red, green, blue);
70
+ return ok(luminance < 0.5 ? "dark" : "light");
71
+ }
72
+ _normalizeHex(hexValue) {
73
+ const normalized = hexValue.padEnd(4, "0").slice(0, 2);
74
+ return parseInt(normalized, 16);
75
+ }
76
+ _calculateLuminance(red, green, blue) {
77
+ return (0.299 * red + 0.587 * green + 0.114 * blue) / 255;
78
+ }
79
+ }
6
80
 
7
81
  class NodeColorSupportDetector {
8
82
  constructor(_process, overrideTheme) {
9
83
  this._process = _process;
10
- if (!this.isNodeEnv()) return;
84
+ if (!this.isNodeEnv()) {
85
+ this._theme = "unknown";
86
+ return;
87
+ }
11
88
  const processEnv = _process.env;
12
89
  this._envForceColor = processEnv["FORCE_COLOR"];
13
90
  this._envNoColor = processEnv["NO_COLOR"];
@@ -17,7 +94,20 @@ class NodeColorSupportDetector {
17
94
  this._envCliColorForce = processEnv["CLICOLOR_FORCE"];
18
95
  this._envWtSession = processEnv["WT_SESSION"];
19
96
  this._isTTY = !!_process.stdout.isTTY;
20
- this._overrideTheme = overrideTheme;
97
+ if (overrideTheme !== void 0) {
98
+ this._theme = overrideTheme;
99
+ return;
100
+ }
101
+ if (!this._isTTY) {
102
+ this._theme = "unknown";
103
+ return;
104
+ }
105
+ const querier = new OscThemeQuerier(
106
+ _process.stdin,
107
+ _process.stdout
108
+ );
109
+ const result = querier.query();
110
+ this._theme = result.isOk() ? result.value : "unknown";
21
111
  }
22
112
  _envForceColor;
23
113
  _envTerm;
@@ -27,10 +117,13 @@ class NodeColorSupportDetector {
27
117
  _envCliColorForce;
28
118
  _envWtSession;
29
119
  _isTTY;
30
- _overrideTheme;
120
+ _theme;
31
121
  isNodeEnv() {
32
122
  return typeof this._process !== "undefined";
33
123
  }
124
+ getTheme() {
125
+ return this._theme;
126
+ }
34
127
  getColorLevel() {
35
128
  if (this._envNoColor !== void 0) {
36
129
  return ColorLevel.NO_COLOR;
@@ -82,31 +175,6 @@ class NodeColorSupportDetector {
82
175
  }
83
176
  return this._isTTY || isForced ? ColorLevel.ANSI : ColorLevel.NO_COLOR;
84
177
  }
85
- getTheme() {
86
- if (this._overrideTheme) return this._overrideTheme;
87
- if (!this.isNodeEnv() || !this._isTTY) return "unknown";
88
- const __dirname = dirname(fileURLToPath(import.meta.url));
89
- const scriptPath = join(__dirname, "./run-osc-querier.js");
90
- const spawnResult = Result.fromThrowable(
91
- () => spawnSync(process.execPath, [scriptPath], {
92
- stdio: ["inherit", "pipe", "pipe"],
93
- timeout: 1e3,
94
- encoding: "utf-8"
95
- }),
96
- (error) => error
97
- )();
98
- if (spawnResult.isErr()) {
99
- return "unknown";
100
- }
101
- const processOutput = spawnResult.value;
102
- if (processOutput.status !== 0 || processOutput.error) {
103
- return "unknown";
104
- }
105
- const output = processOutput.stdout?.trim();
106
- if (output === "dark") return "dark";
107
- if (output === "light") return "light";
108
- return "unknown";
109
- }
110
178
  }
111
179
 
112
180
  function createColorino(palette = {}, options = {}) {
@@ -136,4 +204,4 @@ function createColorino(palette = {}, options = {}) {
136
204
  }
137
205
  const colorino = createColorino();
138
206
 
139
- export { colorino, createColorino };
207
+ export { colorino, createColorino, themePalettes };