camou 0.1.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.
Files changed (89) hide show
  1. package/README.md +229 -0
  2. package/dist/browser/actions.d.ts +4 -0
  3. package/dist/browser/actions.js +15 -0
  4. package/dist/browser/actions.js.map +1 -0
  5. package/dist/browser/manager.d.ts +85 -0
  6. package/dist/browser/manager.js +300 -0
  7. package/dist/browser/manager.js.map +1 -0
  8. package/dist/browser/snapshot.d.ts +17 -0
  9. package/dist/browser/snapshot.js +93 -0
  10. package/dist/browser/snapshot.js.map +1 -0
  11. package/dist/browser/tabs.d.ts +24 -0
  12. package/dist/browser/tabs.js +8 -0
  13. package/dist/browser/tabs.js.map +1 -0
  14. package/dist/camoufox/config.d.ts +67 -0
  15. package/dist/camoufox/config.js +121 -0
  16. package/dist/camoufox/config.js.map +1 -0
  17. package/dist/camoufox/env.d.ts +3 -0
  18. package/dist/camoufox/env.js +27 -0
  19. package/dist/camoufox/env.js.map +1 -0
  20. package/dist/camoufox/installer.d.ts +24 -0
  21. package/dist/camoufox/installer.js +291 -0
  22. package/dist/camoufox/installer.js.map +1 -0
  23. package/dist/camoufox/launcher.d.ts +22 -0
  24. package/dist/camoufox/launcher.js +105 -0
  25. package/dist/camoufox/launcher.js.map +1 -0
  26. package/dist/camoufox/prefs.d.ts +5 -0
  27. package/dist/camoufox/prefs.js +27 -0
  28. package/dist/camoufox/prefs.js.map +1 -0
  29. package/dist/camoufox/presets.d.ts +14 -0
  30. package/dist/camoufox/presets.js +73 -0
  31. package/dist/camoufox/presets.js.map +1 -0
  32. package/dist/camoufox/registry.d.ts +30 -0
  33. package/dist/camoufox/registry.js +195 -0
  34. package/dist/camoufox/registry.js.map +1 -0
  35. package/dist/camoufox/validation.d.ts +4 -0
  36. package/dist/camoufox/validation.js +103 -0
  37. package/dist/camoufox/validation.js.map +1 -0
  38. package/dist/cli/daemon.d.ts +2 -0
  39. package/dist/cli/daemon.js +59 -0
  40. package/dist/cli/daemon.js.map +1 -0
  41. package/dist/cli/main.d.ts +2 -0
  42. package/dist/cli/main.js +147 -0
  43. package/dist/cli/main.js.map +1 -0
  44. package/dist/cli/output.d.ts +1 -0
  45. package/dist/cli/output.js +108 -0
  46. package/dist/cli/output.js.map +1 -0
  47. package/dist/cli/program.d.ts +42 -0
  48. package/dist/cli/program.js +214 -0
  49. package/dist/cli/program.js.map +1 -0
  50. package/dist/daemon/daemon.d.ts +12 -0
  51. package/dist/daemon/daemon.js +36 -0
  52. package/dist/daemon/daemon.js.map +1 -0
  53. package/dist/daemon/main.d.ts +2 -0
  54. package/dist/daemon/main.js +28 -0
  55. package/dist/daemon/main.js.map +1 -0
  56. package/dist/daemon/router.d.ts +7 -0
  57. package/dist/daemon/router.js +43 -0
  58. package/dist/daemon/router.js.map +1 -0
  59. package/dist/daemon/runtime.d.ts +11 -0
  60. package/dist/daemon/runtime.js +54 -0
  61. package/dist/daemon/runtime.js.map +1 -0
  62. package/dist/doctor/diagnostics.d.ts +38 -0
  63. package/dist/doctor/diagnostics.js +152 -0
  64. package/dist/doctor/diagnostics.js.map +1 -0
  65. package/dist/ipc/client.d.ts +6 -0
  66. package/dist/ipc/client.js +63 -0
  67. package/dist/ipc/client.js.map +1 -0
  68. package/dist/ipc/protocol.d.ts +775 -0
  69. package/dist/ipc/protocol.js +128 -0
  70. package/dist/ipc/protocol.js.map +1 -0
  71. package/dist/ipc/server.d.ts +10 -0
  72. package/dist/ipc/server.js +99 -0
  73. package/dist/ipc/server.js.map +1 -0
  74. package/dist/state/paths.d.ts +32 -0
  75. package/dist/state/paths.js +121 -0
  76. package/dist/state/paths.js.map +1 -0
  77. package/dist/state/store.d.ts +4 -0
  78. package/dist/state/store.js +30 -0
  79. package/dist/state/store.js.map +1 -0
  80. package/dist/util/errors.d.ts +45 -0
  81. package/dist/util/errors.js +82 -0
  82. package/dist/util/errors.js.map +1 -0
  83. package/dist/util/log.d.ts +19 -0
  84. package/dist/util/log.js +71 -0
  85. package/dist/util/log.js.map +1 -0
  86. package/dist/util/platform.d.ts +12 -0
  87. package/dist/util/platform.js +44 -0
  88. package/dist/util/platform.js.map +1 -0
  89. package/package.json +58 -0
@@ -0,0 +1,71 @@
1
+ import { createWriteStream, mkdirSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ function stringifyDetail(value) {
4
+ if (value === undefined) {
5
+ return '';
6
+ }
7
+ if (typeof value === 'string') {
8
+ return value;
9
+ }
10
+ try {
11
+ return JSON.stringify(value);
12
+ }
13
+ catch {
14
+ return String(value);
15
+ }
16
+ }
17
+ export class Logger {
18
+ name;
19
+ verbose;
20
+ mirrorToStderr;
21
+ stream;
22
+ constructor(options) {
23
+ this.name = options.name;
24
+ this.verbose = options.verbose ?? false;
25
+ this.mirrorToStderr = options.mirrorToStderr ?? false;
26
+ if (options.filePath) {
27
+ mkdirSync(dirname(options.filePath), { recursive: true, mode: 0o700 });
28
+ this.stream = createWriteStream(options.filePath, { flags: 'a' });
29
+ }
30
+ }
31
+ debug(message, details) {
32
+ if (this.verbose) {
33
+ this.write('debug', message, details);
34
+ }
35
+ }
36
+ info(message, details) {
37
+ this.write('info', message, details);
38
+ }
39
+ warn(message, details) {
40
+ this.write('warn', message, details);
41
+ }
42
+ error(message, details) {
43
+ this.write('error', message, details);
44
+ }
45
+ async close() {
46
+ if (!this.stream) {
47
+ return;
48
+ }
49
+ await new Promise((resolve, reject) => {
50
+ this.stream.end((error) => {
51
+ if (error) {
52
+ reject(error);
53
+ return;
54
+ }
55
+ resolve();
56
+ });
57
+ });
58
+ }
59
+ write(level, message, details) {
60
+ const timestamp = new Date().toISOString();
61
+ const suffix = stringifyDetail(details);
62
+ const line = `[${timestamp}] [${this.name}] [${level}] ${message}${suffix ? ` ${suffix}` : ''}`;
63
+ if (this.stream) {
64
+ this.stream.write(`${line}\n`);
65
+ }
66
+ if (this.mirrorToStderr || (level === 'error' && !this.stream)) {
67
+ process.stderr.write(`${line}\n`);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/util/log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type PlatformOs = 'lin' | 'mac' | 'win';
2
+ export type PlatformArch = 'x86_64' | 'arm64' | 'i686';
3
+ export interface PlatformTarget {
4
+ os: PlatformOs;
5
+ arch: PlatformArch;
6
+ assetSuffix: `${PlatformOs}.${PlatformArch}`;
7
+ executableRelativePath: string;
8
+ }
9
+ export declare function getPlatformTarget(platform?: NodeJS.Platform, architecture?: string): PlatformTarget;
10
+ export declare function isWindows(platform?: NodeJS.Platform): boolean;
11
+ export declare function normalizeReleaseVersion(version: string): string;
12
+ export declare function buildExpectedAssetName(version: string, target?: PlatformTarget): string;
@@ -0,0 +1,44 @@
1
+ import { UnsupportedPlatformError } from './errors.js';
2
+ const OS_MAP = {
3
+ linux: 'lin',
4
+ darwin: 'mac',
5
+ win32: 'win',
6
+ };
7
+ const ARCH_MAP = {
8
+ x64: 'x86_64',
9
+ x86: 'x86_64',
10
+ ia32: 'i686',
11
+ arm64: 'arm64',
12
+ arm: 'arm64',
13
+ };
14
+ const EXECUTABLE_RELATIVE_PATHS = {
15
+ lin: 'camoufox-bin',
16
+ mac: 'Camoufox.app/Contents/MacOS/camoufox',
17
+ win: 'camoufox.exe',
18
+ };
19
+ export function getPlatformTarget(platform = process.platform, architecture = process.arch) {
20
+ const os = OS_MAP[platform];
21
+ if (!os) {
22
+ throw new UnsupportedPlatformError(`Unsupported platform: ${platform}`);
23
+ }
24
+ const arch = ARCH_MAP[architecture];
25
+ if (!arch) {
26
+ throw new UnsupportedPlatformError(`Unsupported architecture: ${architecture}`);
27
+ }
28
+ return {
29
+ os,
30
+ arch,
31
+ assetSuffix: `${os}.${arch}`,
32
+ executableRelativePath: EXECUTABLE_RELATIVE_PATHS[os],
33
+ };
34
+ }
35
+ export function isWindows(platform = process.platform) {
36
+ return platform === 'win32';
37
+ }
38
+ export function normalizeReleaseVersion(version) {
39
+ return version.startsWith('v') ? version.slice(1) : version;
40
+ }
41
+ export function buildExpectedAssetName(version, target = getPlatformTarget()) {
42
+ return `camoufox-${normalizeReleaseVersion(version)}-${target.assetSuffix}.zip`;
43
+ }
44
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/util/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAYvD,MAAM,MAAM,GAA2C;IACrD,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,QAAQ,GAA6C;IACzD,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;CACb,CAAC;AAEF,MAAM,yBAAyB,GAA+B;IAC5D,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,sCAAsC;IAC3C,GAAG,EAAE,cAAc;CACpB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAC/B,WAA4B,OAAO,CAAC,QAAQ,EAC5C,eAAuB,OAAO,CAAC,IAAI;IAEnC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,wBAAwB,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,wBAAwB,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO;QACL,EAAE;QACF,IAAI;QACJ,WAAW,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE;QAC5B,sBAAsB,EAAE,yBAAyB,CAAC,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAA4B,OAAO,CAAC,QAAQ;IACpE,OAAO,QAAQ,KAAK,OAAO,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAClF,OAAO,YAAY,uBAAuB,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,MAAM,CAAC;AAClF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "camou",
3
+ "version": "0.1.0",
4
+ "description": "CLI and local daemon for driving Camoufox through Playwright",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/txchen/camoucli.git"
8
+ },
9
+ "homepage": "https://github.com/txchen/camoucli#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/txchen/camoucli/issues"
12
+ },
13
+ "type": "module",
14
+ "bin": {
15
+ "camou": "dist/cli/main.js",
16
+ "camou-daemon": "dist/daemon/main.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE*"
22
+ ],
23
+ "engines": {
24
+ "node": ">=20"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.json",
28
+ "clean": "rm -rf dist",
29
+ "dev": "tsx src/cli/main.ts",
30
+ "dev:daemon": "tsx src/daemon/main.ts",
31
+ "prepack": "npm run build",
32
+ "test": "vitest run",
33
+ "test:integration": "vitest run tests/*.integration.test.ts",
34
+ "test:watch": "vitest"
35
+ },
36
+ "keywords": [
37
+ "camoufox",
38
+ "playwright",
39
+ "firefox",
40
+ "cli",
41
+ "browser-automation"
42
+ ],
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "dependencies": {
47
+ "commander": "^14.0.0",
48
+ "extract-zip": "^2.0.1",
49
+ "playwright-core": "1.51.1",
50
+ "zod": "^3.25.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^24.0.0",
54
+ "tsx": "^4.19.0",
55
+ "typescript": "^5.8.0",
56
+ "vitest": "^3.1.0"
57
+ }
58
+ }