clearcote 0.5.0 → 0.7.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
@@ -81,6 +81,35 @@ const context = await launchPersistentContext("./profile-7423", {
81
81
  });
82
82
  ```
83
83
 
84
+ ### Capture or import a profile
85
+
86
+ Make Clearcote present a **real machine's** identity instead of the synthetic seed-derived one. Pass
87
+ a captured fingerprint as `fingerprintProfile` — a file path, a plain object, or a JSON string (the
88
+ SDK gzip+base64-encodes it for the engine):
89
+
90
+ ```ts
91
+ const browser = await launch({
92
+ fingerprint: "seed-1", // still the farbling root / fallback for absent fields
93
+ fingerprintProfile: "profile.json", // a real machine's captured identity
94
+ });
95
+ ```
96
+
97
+ Get a profile two ways:
98
+
99
+ - **Capture** from a donor Chrome — open
100
+ [`tools/fingerprint-collect/collect.html`](../../tools/fingerprint-collect/README.md) and click
101
+ Capture, or paste `collect.js` + `snippet.js` in DevTools. Either downloads the JSON.
102
+ - **Convert** the open-source [chrome-fingerprints](https://github.com/Vinyzu/chrome-fingerprints)
103
+ dataset: `pip install chrome-fingerprints && python tools/fingerprint-collect/convert_dataset.py
104
+ --out ./profiles --count 100`.
105
+
106
+ **Override / fallback semantics:** fields present in the profile **override** the `fingerprint`
107
+ seed-derived persona; **absent** fields **fall back** to the seed, so partial profiles stay
108
+ coherent. The SDK also derives `acceptLanguage` from the profile's `navigator.languages` when you
109
+ don't set `acceptLanguage` explicitly. See the
110
+ [collector README](../../tools/fingerprint-collect/README.md) for the full schema and what each
111
+ field drives.
112
+
84
113
  ## Fingerprint options
85
114
 
86
115
  All optional. Anything not listed here is passed straight through to Playwright
@@ -102,6 +131,7 @@ All optional. Anything not listed here is passed straight through to Playwright
102
131
  | `webrtcIp` | `--webrtc-ip` | WebRTC IP to report. The engine **fabricates** the `srflx` candidate at this IP and sends **no real STUN** from the host, so the real IP never leaks (not merely relabeled). |
103
132
  | `disableGpuFingerprint` | `--disable-gpu-fingerprint` | Turn off GPU/WebGL spoofing. |
104
133
  | `geoip` | _(directive)_ | `true` → resolve the proxy's exit-IP geo and auto-fill timezone/acceptLanguage/location/**webrtcIp**. |
134
+ | `fingerprintProfile` | `--fingerprint-profile` | A real machine's captured fingerprint (file path / object / JSON string; the SDK gzip+base64-encodes it). Fields present override the seed-derived persona; absent fields fall back to `fingerprint`. |
105
135
 
106
136
  ## API
107
137
 
@@ -33,6 +33,21 @@ export interface FingerprintOptions {
33
33
  webrtcIp?: string;
34
34
  /** Turn OFF GPU/WebGL fingerprint spoofing (advertise the real backend). */
35
35
  disableGpuFingerprint?: boolean;
36
+ /**
37
+ * Set `false` to turn OFF the per-eTLD+1 farbling NOISE (canvas/WebGL/audio/client-rects), so
38
+ * those surfaces return their natural, unperturbed values. Use when a site's anti-bot ML scores
39
+ * the noise pattern as "tampered". Identity spoofs (UA/screen/GPU/persona)
40
+ * stay on. Default (unset/`true`) keeps the noise.
41
+ */
42
+ fingerprintNoise?: boolean;
43
+ /**
44
+ * Import a real captured fingerprint so the browser presents *that machine's* identity instead
45
+ * of the synthetic seed-derived one. Accepts a path to a `.json` profile, a profile object, or a
46
+ * JSON string (capture one with `tools/fingerprint-collect`). Fields present in the profile
47
+ * override the seed-derived persona; absent fields fall back to the seed, so partial profiles
48
+ * stay coherent.
49
+ */
50
+ fingerprintProfile?: string | Record<string, unknown>;
36
51
  }
37
52
  /** Split an options object into its fingerprint half and the remaining (Playwright) half. */
38
53
  export declare function splitFingerprintOptions<T extends FingerprintOptions>(options: T): {
@@ -43,6 +58,13 @@ export declare function splitFingerprintOptions<T extends FingerprintOptions>(op
43
58
  * tag list with NO `;q=` weights or spaces (Chromium adds the q-weights to the header itself; a
44
59
  * `;` in the switch value trips a DCHECK and crashes the renderer). */
45
60
  export declare function cleanAcceptLanguage(v: string): string;
61
+ /** Encode a captured clearcote-profile for the `--fingerprint-profile` switch. `value` may be a
62
+ * path to a `.json` file, a profile object, or a JSON string. gzip+base64 keeps the full capture
63
+ * (~40 KB) within Chromium's command-line length limit (gzip ~6x); the engine gunzips + parses it. */
64
+ export declare function encodeProfile(value: string | Record<string, unknown>): string;
65
+ /** Best-effort: derive an Accept-Language from an imported profile's navigator.languages
66
+ * (path / object / JSON string), so an imported identity keeps the donor's language order. */
67
+ export declare function profileAcceptLanguage(value: string | Record<string, unknown>): string | undefined;
46
68
  /** Build the Chromium switches for a set of fingerprint options. */
47
69
  export declare function fingerprintArgs(o: FingerprintOptions): string[];
48
70
  //# sourceMappingURL=fingerprint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACzC,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChE,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAkBD,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,kBAAkB,EAClE,OAAO,EAAE,CAAC,GACT;IAAE,WAAW,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,kBAAkB,CAAC,CAAA;CAAE,CAW9E;AAED;;uEAEuE;AACvE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAqB/D"}
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACzC,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChE,qBAAqB;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvD;AAoBD,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,kBAAkB,EAClE,OAAO,EAAE,CAAC,GACT;IAAE,WAAW,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,kBAAkB,CAAC,CAAA;CAAE,CAW9E;AAED;;uEAEuE;AACvE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;sGAEsG;AACtG,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAU7E;AAED;8FAC8F;AAC9F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAajG;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAyC/D"}
@@ -1,5 +1,7 @@
1
1
  // Maps the SDK's fingerprint options to the Clearcote Chromium command-line switches.
2
2
  // Switch names mirror components/ungoogled/ungoogled_switches.cc (see patches/000-fingerprint-switches.patch).
3
+ import { gzipSync } from "node:zlib";
4
+ import { existsSync, readFileSync } from "node:fs";
3
5
  const FINGERPRINT_KEYS = [
4
6
  "fingerprint",
5
7
  "platform",
@@ -14,6 +16,8 @@ const FINGERPRINT_KEYS = [
14
16
  "acceptLanguage",
15
17
  "webrtcIp",
16
18
  "disableGpuFingerprint",
19
+ "fingerprintNoise",
20
+ "fingerprintProfile",
17
21
  ];
18
22
  /** Split an options object into its fingerprint half and the remaining (Playwright) half. */
19
23
  export function splitFingerprintOptions(options) {
@@ -39,6 +43,43 @@ export function cleanAcceptLanguage(v) {
39
43
  .filter(Boolean)
40
44
  .join(",");
41
45
  }
46
+ /** Encode a captured clearcote-profile for the `--fingerprint-profile` switch. `value` may be a
47
+ * path to a `.json` file, a profile object, or a JSON string. gzip+base64 keeps the full capture
48
+ * (~40 KB) within Chromium's command-line length limit (gzip ~6x); the engine gunzips + parses it. */
49
+ export function encodeProfile(value) {
50
+ let raw;
51
+ if (typeof value === "object") {
52
+ raw = Buffer.from(JSON.stringify(value));
53
+ }
54
+ else if (existsSync(value)) {
55
+ raw = readFileSync(value);
56
+ }
57
+ else {
58
+ raw = Buffer.from(value); // assume a JSON string
59
+ }
60
+ return gzipSync(raw, { level: 9 }).toString("base64");
61
+ }
62
+ /** Best-effort: derive an Accept-Language from an imported profile's navigator.languages
63
+ * (path / object / JSON string), so an imported identity keeps the donor's language order. */
64
+ export function profileAcceptLanguage(value) {
65
+ let obj;
66
+ try {
67
+ if (typeof value === "object")
68
+ obj = value;
69
+ else if (existsSync(value))
70
+ obj = JSON.parse(readFileSync(value, "utf8"));
71
+ else
72
+ obj = JSON.parse(value);
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ const nav = obj?.navigator;
78
+ const langs = nav?.languages;
79
+ if (Array.isArray(langs) && langs.length)
80
+ return langs.map(String).join(",");
81
+ return undefined;
82
+ }
42
83
  /** Build the Chromium switches for a set of fingerprint options. */
43
84
  export function fingerprintArgs(o) {
44
85
  const args = [];
@@ -50,18 +91,38 @@ export function fingerprintArgs(o) {
50
91
  set("fingerprint", o.fingerprint);
51
92
  set("fingerprint-platform", o.platform);
52
93
  set("fingerprint-platform-version", o.platformVersion);
53
- set("fingerprint-brand", o.brand);
94
+ // clearcote presents as Google Chrome (its UA says "Chrome/<v>"); default the UA-CH brand to
95
+ // "chrome" so navigator.userAgentData advertises "Google Chrome", not bare "Chromium" (a
96
+ // UA/UA-CH mismatch some bot detectors flag). Override via brand: "Edge" etc.
97
+ set("fingerprint-brand", o.brand ?? "chrome");
54
98
  set("fingerprint-brand-version", o.brandVersion);
55
99
  set("fingerprint-gpu-vendor", o.gpuVendor);
56
100
  set("fingerprint-gpu-renderer", o.gpuRenderer);
57
101
  set("fingerprint-hardware-concurrency", o.hardwareConcurrency);
58
102
  set("fingerprint-location", o.location);
59
103
  set("timezone", o.timezone);
60
- if (o.acceptLanguage)
61
- args.push(`--accept-lang=${cleanAcceptLanguage(String(o.acceptLanguage))}`);
104
+ // Always send a coherent Accept-Language. Without --accept-lang Chromium falls back to the
105
+ // build/OS locale, which can leak a language that mismatches the proxy's country/timezone
106
+ // (e.g. en-GB on a US IP) — a geo-inconsistency tell. Prefer an explicit value, then an imported
107
+ // profile's languages, then en-US,en (the common Chrome default; set acceptLanguage or geoip to
108
+ // match the proxy region).
109
+ const acceptLanguage = o.acceptLanguage ||
110
+ (o.fingerprintProfile ? profileAcceptLanguage(o.fingerprintProfile) : undefined) ||
111
+ "en-US,en";
112
+ args.push(`--accept-lang=${cleanAcceptLanguage(String(acceptLanguage))}`);
62
113
  set("webrtc-ip", o.webrtcIp);
63
114
  if (o.disableGpuFingerprint)
64
115
  args.push("--disable-gpu-fingerprint");
116
+ // fingerprintNoise=false turns OFF the per-eTLD+1 farbling noise (canvas/WebGL/audio/client-rects)
117
+ // so those surfaces return natural values — for sites whose ML flags the noise as "tampered".
118
+ // Identity spoofs (UA/screen/GPU/persona) stay on. Default keeps the noise.
119
+ if (o.fingerprintNoise === false)
120
+ args.push("--disable-fingerprint-noise");
121
+ // fingerprintProfile imports a real captured fingerprint (path/object/JSON) — see
122
+ // tools/fingerprint-collect. Its fields override the seed-derived persona; absent fields fall
123
+ // back to the seed, so partial profiles stay coherent.
124
+ if (o.fingerprintProfile)
125
+ args.push(`--fingerprint-profile=${encodeProfile(o.fingerprintProfile)}`);
65
126
  return args;
66
127
  }
67
128
  //# sourceMappingURL=fingerprint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,+GAA+G;AAuC/G,MAAM,gBAAgB,GAAiC;IACrD,aAAa;IACb,UAAU;IACV,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,WAAW;IACX,aAAa;IACb,qBAAqB;IACrB,UAAU;IACV,UAAU;IACV,gBAAgB;IAChB,UAAU;IACV,uBAAuB;CACxB,CAAC;AAEF,6FAA6F;AAC7F,MAAM,UAAU,uBAAuB,CACrC,OAAU;IAEV,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAK,gBAA6B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,WAAuC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAyC,EAAE,CAAC;AAC1E,CAAC;AAED;;uEAEuE;AACvE,MAAM,UAAU,mBAAmB,CAAC,CAAS;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,CAAqB;IACnD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,EAAE;QAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;IACF,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAClC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;IACvD,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAClC,GAAG,CAAC,2BAA2B,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IACjD,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3C,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;IAC/C,GAAG,CAAC,kCAAkC,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC/D,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,cAAc;QAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAClG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,qBAAqB;QAAE,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
package/dist/release.js CHANGED
@@ -4,13 +4,13 @@
4
4
  // this package, the hash check guarantees you run exactly the published, signed binary.
5
5
  // Published checksums + GPG signatures live on the release page.
6
6
  export const RELEASE = {
7
- tag: "v0.1.0-pre.6",
7
+ tag: "v0.1.0-pre.8",
8
8
  version: "149.0.7827.114",
9
9
  asset: "clearcote-149.0.7827.114-windows-x64.zip",
10
- url: "https://github.com/clearcotelabs/clearcote-browser/releases/download/v0.1.0-pre.6/clearcote-149.0.7827.114-windows-x64.zip",
11
- sha256: "526a486a055f585796e6ac6c18476d1c721aaad2e848363d7be811311627dfe8",
10
+ url: "https://github.com/clearcotelabs/clearcote-browser/releases/download/v0.1.0-pre.8/clearcote-149.0.7827.114-windows-x64.zip",
11
+ sha256: "3a232583dee201ac3a2a2cf6f49351bd444bebc205cc6112d01fef75be9b66f4",
12
12
  exeSha256: "5743595256c89c6874804bf3315acce592fc7f1883760c8d380c010151a73b23",
13
- size: 242553703,
13
+ size: 242559694,
14
14
  os: "win32",
15
15
  };
16
16
  /** GitHub repo (owner/name) the releases come from — used by the opt-in auto-update resolver. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clearcote",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Playwright drop-in for the Clearcote anti-fingerprint Chromium build. launch() returns a standard Playwright Browser backed by the verified Clearcote binary, which is auto-downloaded and SHA-256 checked.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -21,6 +21,9 @@
21
21
  "scripts": {
22
22
  "build": "tsc -p tsconfig.json",
23
23
  "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
24
+ "typecheck": "tsc -p tsconfig.json --noEmit",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
24
27
  "prepublishOnly": "npm run clean && npm run build"
25
28
  },
26
29
  "dependencies": {
@@ -30,7 +33,8 @@
30
33
  },
31
34
  "devDependencies": {
32
35
  "@types/node": "^22.0.0",
33
- "typescript": "^5.6.0"
36
+ "typescript": "^5.6.0",
37
+ "vitest": "^2.1.9"
34
38
  },
35
39
  "keywords": [
36
40
  "clearcote",