nothing-browser 0.0.14 → 0.0.16

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.
@@ -4,3 +4,4 @@ export declare function del(key: string): void;
4
4
  export declare function clear(): void;
5
5
  export declare function size(): number;
6
6
  export declare function keys(): string[];
7
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../piggy/cache/memory.ts"],"names":[],"mappings":"AASA,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAQ3C;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,QAExD;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,QAE9B;AAED,wBAAgB,KAAK,SAEpB;AAED,wBAAgB,IAAI,WAEnB;AAED,wBAAgB,IAAI,aAEnB"}
@@ -76,3 +76,4 @@ export declare class PiggyClient {
76
76
  unexposeFunction(name: string, tabId?: string): Promise<void>;
77
77
  clearExposedFunctions(tabId?: string): Promise<void>;
78
78
  }
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/client/index.ts"],"names":[],"mappings":"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"}
@@ -4,3 +4,4 @@ export declare function randomDelay(min: number, max: number): Promise<void>;
4
4
  * Returns an array of { char, isBackspace } actions to replay.
5
5
  */
6
6
  export declare function humanTypeSequence(text: string): string[];
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/human/index.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0CxD"}
@@ -10,3 +10,4 @@ export declare function buildRespondScript(pattern: string, status: number, cont
10
10
  * or an empty object {} to pass through unchanged.
11
11
  */
12
12
  export declare function buildModifyResponseScript(pattern: string, exposedFnName: string): string;
13
+ //# sourceMappingURL=scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scripts.d.ts","sourceRoot":"","sources":["../../../piggy/intercept/scripts.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,MAAM,CAyER;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CA0DxF"}
@@ -1,2 +1,3 @@
1
1
  export type BinaryMode = 'headless' | 'headful';
2
2
  export declare function detectBinary(mode?: BinaryMode): string | null;
3
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../piggy/launch/detect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAOhD,wBAAgB,YAAY,CAAC,IAAI,GAAE,UAAuB,GAAG,MAAM,GAAG,IAAI,CA+BzE"}
@@ -3,3 +3,4 @@ export declare function killAllBrowsers(): void;
3
3
  export declare function spawnBrowser(mode?: BinaryMode): Promise<string>;
4
4
  export declare function spawnBrowserOnSocket(socketName: string, mode?: BinaryMode): Promise<void>;
5
5
  export declare function killBrowser(): void;
6
+ //# sourceMappingURL=spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../piggy/launch/spawn.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AASzD,wBAAgB,eAAe,IAAI,IAAI,CAiBtC;AAED,wBAAsB,YAAY,CAAC,IAAI,GAAE,UAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqEjF;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,UAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED,wBAAgB,WAAW,IAAI,IAAI,CAmBlC"}
@@ -1,2 +1,3 @@
1
1
  declare const logger: import("ernest-logger").Logger;
2
2
  export default logger;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/logger/index.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,gCAiDV,CAAC;AAKH,eAAe,MAAM,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export default function open(): {
2
2
  name: string;
3
3
  };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/open/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,IAAI;;EAI3B"}
@@ -4,3 +4,4 @@ export declare function setClient(c: PiggyClient | null): void;
4
4
  export declare function setHumanMode(v: boolean): void;
5
5
  export declare function createSiteObject(name: string, registeredUrl: string, client: PiggyClient, tabId: string): any;
6
6
  export declare function createExposedAPI<T extends Record<string, (data: any) => any>>(site: any, apiName: string, handlers: T): Promise<void>;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/register/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAOxC,eAAO,IAAI,SAAS,SAAQ,CAAC;AAE7B,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,QAAuB;AACtE,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,QAAoB;AAgB3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,OAmcvG;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CASrI"}
@@ -18,3 +18,4 @@ export declare const routeRegistry: Map<string, RouteConfig>;
18
18
  export declare const keepAliveSites: Set<string>;
19
19
  export declare function startServer(port: number, hostname?: string): Promise<Elysia>;
20
20
  export declare function stopServer(): void;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../piggy/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,GAAG,EAAE,GAAG,CAAC;CACV,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,GAAG,KACN,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,aAAa,0BAAiC,CAAC;AAC5D,eAAO,MAAM,cAAc,aAAoB,CAAC;AAmBhD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAoFrF;AAED,wBAAgB,UAAU,SAGzB"}
package/dist/piggy.d.ts CHANGED
@@ -1,3 +1,178 @@
1
- declare const piggy: any;
1
+ import { type BinaryMode } from "./piggy/launch/detect";
2
+ import type { Logger } from "ernest-logger";
3
+ import type { Elysia } from "elysia";
4
+ import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server";
5
+ export type TabMode = "tab" | "process";
6
+ /** Full API surface of a registered site. */
7
+ export interface SiteObject {
8
+ readonly _name: string;
9
+ readonly _tabId: string;
10
+ navigate(url?: string, opts?: {
11
+ retries?: number;
12
+ }): Promise<void>;
13
+ reload(): Promise<void>;
14
+ goBack(): Promise<void>;
15
+ goForward(): Promise<void>;
16
+ waitForNavigation(): Promise<void>;
17
+ title(): Promise<string>;
18
+ /** Returns the last known URL (synchronous — does NOT hit the browser). */
19
+ url(): string;
20
+ content(): Promise<string>;
21
+ wait(ms: number): Promise<void>;
22
+ waitForSelector(selector: string, timeout?: number): Promise<void>;
23
+ waitForVisible(selector: string, timeout?: number): Promise<void>;
24
+ waitForResponse(pattern: string, timeout?: number): Promise<void>;
25
+ addInitScript(js: string | (() => void)): Promise<SiteObject>;
26
+ on(event: "navigate", handler: (url: string) => void): () => void;
27
+ on(event: string, handler: (data: unknown) => void): () => void;
28
+ off(event: string, handler: (data: unknown) => void): void;
29
+ click(selector: string, opts?: {
30
+ retries?: number;
31
+ timeout?: number;
32
+ }): Promise<boolean>;
33
+ doubleClick(selector: string): Promise<boolean>;
34
+ hover(selector: string): Promise<boolean>;
35
+ type(selector: string, text: string, opts?: {
36
+ delay?: number;
37
+ retries?: number;
38
+ fact?: boolean;
39
+ wpm?: number;
40
+ }): Promise<boolean>;
41
+ select(selector: string, value: string): Promise<boolean>;
42
+ evaluate<T = unknown>(js: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
43
+ keyboard: {
44
+ press(key: string): Promise<boolean>;
45
+ combo(combo: string): Promise<boolean>;
46
+ };
47
+ mouse: {
48
+ move(x: number, y: number): Promise<boolean>;
49
+ drag(from: {
50
+ x: number;
51
+ y: number;
52
+ }, to: {
53
+ x: number;
54
+ y: number;
55
+ }): Promise<boolean>;
56
+ };
57
+ scroll: {
58
+ to(selector: string): Promise<boolean>;
59
+ by(px: number): Promise<boolean>;
60
+ };
61
+ fetchText(selector: string): Promise<string | null>;
62
+ fetchLinks(selector: string): Promise<string[]>;
63
+ fetchImages(selector: string): Promise<string[]>;
64
+ search: {
65
+ css(query: string): Promise<unknown>;
66
+ id(query: string): Promise<unknown>;
67
+ };
68
+ screenshot(filePath?: string): Promise<string>;
69
+ pdf(filePath?: string): Promise<string>;
70
+ blockImages(): Promise<void>;
71
+ unblockImages(): Promise<void>;
72
+ cookies: {
73
+ set(name: string, value: string, domain: string, path?: string): Promise<void>;
74
+ get(name: string): Promise<unknown>;
75
+ delete(name: string): Promise<void>;
76
+ list(): Promise<unknown[]>;
77
+ };
78
+ intercept: {
79
+ block(pattern: string): Promise<void>;
80
+ redirect(pattern: string, redirectUrl: string): Promise<void>;
81
+ headers(pattern: string, headers: Record<string, string>): Promise<void>;
82
+ respond(pattern: string, handlerOrResponse: {
83
+ status?: number;
84
+ contentType?: string;
85
+ body: string;
86
+ } | ((req: {
87
+ url: string;
88
+ method: string;
89
+ }) => {
90
+ status?: number;
91
+ contentType?: string;
92
+ body: string;
93
+ })): Promise<SiteObject>;
94
+ modifyResponse(pattern: string, handler: (response: {
95
+ body: string;
96
+ status: number;
97
+ headers: Record<string, string>;
98
+ }) => Promise<{
99
+ body?: string;
100
+ status?: number;
101
+ headers?: Record<string, string>;
102
+ } | void> | void): Promise<SiteObject>;
103
+ clear(): Promise<void>;
104
+ };
105
+ capture: {
106
+ start(): Promise<void>;
107
+ stop(): Promise<void>;
108
+ requests(): Promise<unknown[]>;
109
+ ws(): Promise<unknown[]>;
110
+ cookies(): Promise<unknown[]>;
111
+ storage(): Promise<unknown>;
112
+ clear(): Promise<void>;
113
+ };
114
+ session: {
115
+ export(): Promise<unknown>;
116
+ import(data: unknown): Promise<void>;
117
+ };
118
+ exposeFunction(fnName: string, handler: (data: unknown) => Promise<unknown> | unknown): Promise<SiteObject>;
119
+ unexposeFunction(fnName: string): Promise<SiteObject>;
120
+ clearExposedFunctions(): Promise<SiteObject>;
121
+ exposeAndInject(fnName: string, handler: (data: unknown) => Promise<unknown> | unknown, injectionJs: string | ((fnName: string) => string)): Promise<SiteObject>;
122
+ api(path: string, handler: RouteHandler, opts?: {
123
+ ttl?: number;
124
+ before?: BeforeMiddleware[];
125
+ method?: "GET" | "POST" | "PUT" | "DELETE";
126
+ }): SiteObject;
127
+ noclose(): SiteObject;
128
+ close(): Promise<void>;
129
+ }
130
+ export interface RouteSummary {
131
+ site: string;
132
+ method: RouteConfig["method"];
133
+ path: string;
134
+ ttl: number;
135
+ middlewareCount: number;
136
+ }
137
+ export type AllProxy = {
138
+ [K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<R[]> : SiteObject[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<R[]> : never;
139
+ };
140
+ export type DiffProxy = {
141
+ [K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<Record<string, R>> : SiteObject[K] extends (...args: infer A) => infer R ? (...args: A) => Promise<Record<string, R>> : never;
142
+ };
143
+ export interface LaunchOptions {
144
+ mode?: TabMode;
145
+ binary?: BinaryMode;
146
+ }
147
+ export interface RegisterOptions {
148
+ binary?: BinaryMode;
149
+ }
150
+ export interface ServeOptions {
151
+ hostname?: string;
152
+ }
153
+ export interface PiggyBase {
154
+ launch(opts?: LaunchOptions): Promise<PiggyBase>;
155
+ register(name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase>;
156
+ actHuman(enable: boolean): PiggyBase;
157
+ mode(m: TabMode): PiggyBase;
158
+ expose(name: string, handler: (data: unknown) => Promise<unknown> | unknown, tabId?: string): Promise<PiggyBase>;
159
+ unexpose(name: string, tabId?: string): Promise<PiggyBase>;
160
+ serve(port: number, opts?: ServeOptions): Promise<Elysia>;
161
+ stopServer(): void;
162
+ routes(): RouteSummary[];
163
+ all(sites: SiteObject[]): AllProxy;
164
+ diff(sites: SiteObject[]): DiffProxy;
165
+ close(opts?: {
166
+ force?: boolean;
167
+ }): Promise<void>;
168
+ detect(mode?: BinaryMode): string | null;
169
+ logger: Logger;
170
+ }
171
+ export type PiggyWithSites<S extends string> = PiggyBase & {
172
+ [K in S]: SiteObject;
173
+ };
174
+ export declare function usePiggy<S extends string>(): PiggyWithSites<S>;
175
+ declare const piggy: PiggyBase;
2
176
  export default piggy;
3
177
  export { piggy };
178
+ //# sourceMappingURL=piggy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piggy.d.ts","sourceRoot":"","sources":["../piggy.ts"],"names":[],"mappings":"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"}
package/dist/piggy.js CHANGED
@@ -21759,6 +21759,9 @@ function createSiteObject(name, registeredUrl, client, tabId) {
21759
21759
  }
21760
21760
 
21761
21761
  // piggy.ts
21762
+ function usePiggy() {
21763
+ return piggy;
21764
+ }
21762
21765
  var _client = null;
21763
21766
  var _tabMode = "tab";
21764
21767
  var _extraProcs = [];
@@ -21779,14 +21782,12 @@ var piggy = {
21779
21782
  if (!url?.trim())
21780
21783
  throw new Error(`No URL for site "${name}"`);
21781
21784
  const binaryMode = opts?.binary ?? "headless";
21782
- let tabId = "default";
21785
+ let siteObj;
21783
21786
  if (_tabMode === "tab") {
21784
21787
  if (!_client)
21785
21788
  throw new Error("No client. Call piggy.launch() first.");
21786
- tabId = await _client.newTab();
21787
- const siteObj = createSiteObject(name, url, _client, tabId);
21788
- _sites[name] = siteObj;
21789
- piggy[name] = siteObj;
21789
+ const tabId = await _client.newTab();
21790
+ siteObj = createSiteObject(name, url, _client, tabId);
21790
21791
  logger_default.success(`[${name}] registered as tab ${tabId}`);
21791
21792
  } else {
21792
21793
  const socketName = `piggy_${name}`;
@@ -21795,11 +21796,11 @@ var piggy = {
21795
21796
  const c = new PiggyClient(socketName);
21796
21797
  await c.connect();
21797
21798
  _extraProcs.push({ socket: socketName, client: c });
21798
- const siteObj = createSiteObject(name, url, c, "default");
21799
- _sites[name] = siteObj;
21800
- piggy[name] = siteObj;
21799
+ siteObj = createSiteObject(name, url, c, "default");
21801
21800
  logger_default.success(`[${name}] registered as process on "${socketName}"`);
21802
21801
  }
21802
+ _sites[name] = siteObj;
21803
+ piggy[name] = siteObj;
21803
21804
  return piggy;
21804
21805
  },
21805
21806
  actHuman: (enable) => {
@@ -21830,7 +21831,7 @@ var piggy = {
21830
21831
  routes: () => Array.from(routeRegistry.entries()).map(([key, cfg]) => {
21831
21832
  const [site] = key.split(":");
21832
21833
  return {
21833
- site,
21834
+ site: site ?? key,
21834
21835
  method: cfg.method,
21835
21836
  path: `/${site}${cfg.path}`,
21836
21837
  ttl: cfg.ttl,
@@ -21838,10 +21839,10 @@ var piggy = {
21838
21839
  };
21839
21840
  }),
21840
21841
  all: (sites) => new Proxy({}, {
21841
- get: (_, method) => (...args) => Promise.all(sites.map((s) => s[method]?.(...args)))
21842
+ get: (_target, method) => (...args) => Promise.all(sites.map((s) => s[method]?.(...args)))
21842
21843
  }),
21843
21844
  diff: (sites) => new Proxy({}, {
21844
- get: (_, method) => async (...args) => {
21845
+ get: (_target, method) => async (...args) => {
21845
21846
  const results = await Promise.all(sites.map((s) => s[method]?.(...args)));
21846
21847
  return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
21847
21848
  }
@@ -21877,6 +21878,7 @@ var piggy = {
21877
21878
  };
21878
21879
  var piggy_default = piggy;
21879
21880
  export {
21881
+ usePiggy,
21880
21882
  piggy,
21881
21883
  piggy_default as default
21882
21884
  };
package/package.json CHANGED
@@ -1,14 +1,29 @@
1
1
  {
2
2
  "name": "nothing-browser",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "description": "Browser automation library powered by Nothing Browser",
5
- "main": "./dist/index.js",
6
- "types": "./dist/index.d.ts",
5
+ "homepage": "https://github.com/ernest-tech-house-co-operation/nothing-browser#readme",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/ernest-tech-house-co-operation/nothing-browser.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/ernest-tech-house-co-operation/nothing-browser/issues"
12
+ },
13
+ "author": {
14
+ "name": "Pease Ernest",
15
+ "email": "pease@ernest.com",
16
+ "url": "https://github.com/ernest-tech-house-co-operation"
17
+ },
18
+ "license": "MIT",
19
+ "main": "./dist/piggy.js",
20
+ "types": "./dist/piggy.d.ts",
7
21
  "exports": {
8
22
  ".": {
9
23
  "bun": "./piggy.ts",
10
24
  "node": "./dist/piggy.js",
11
- "default": "./dist/piggy.js"
25
+ "default": "./dist/piggy.js",
26
+ "types": "./dist/piggy.d.ts"
12
27
  },
13
28
  "./register": {
14
29
  "bun": "./piggy/register/index.ts",
@@ -26,16 +41,13 @@
26
41
  "types": "./dist/logger/index.d.ts"
27
42
  }
28
43
  },
29
-
30
-
31
44
  "scripts": {
32
- "build:types": "tsc -p tsconfig.types.json",
45
+ "clean": "rm -rf dist",
46
+ "build:types": "tsc --project tsconfig.json --emitDeclarationOnly --outDir dist",
33
47
  "build:js": "bun build ./piggy.ts --outdir ./dist --target node && bun build ./piggy/client/index.ts --outdir ./dist/client --target node && bun build ./piggy/register/index.ts --outdir ./dist/register --target node && bun build ./piggy/server/index.ts --outdir ./dist/server --target node && bun build ./piggy/logger/index.ts --outdir ./dist/logger --target node && bun build ./piggy/launch/detect.ts --outdir ./dist/launch --target node && bun build ./piggy/launch/spawn.ts --outdir ./dist/launch --target node && bun build ./piggy/cache/memory.ts --outdir ./dist/cache --target node && bun build ./piggy/human/index.ts --outdir ./dist/human --target node",
34
- "build": "bun run build:types && bun run build:js",
48
+ "build": "bun run clean && bun run build:types && bun run build:js",
35
49
  "prepublishOnly": "bun run build"
36
50
  },
37
-
38
-
39
51
  "dependencies": {
40
52
  "elysia": "^1.0.0"
41
53
  },
@@ -43,9 +55,9 @@
43
55
  "elysia": "^1.0.0"
44
56
  },
45
57
  "devDependencies": {
46
- "@types/node": "^25.6.0",
58
+ "@types/node": "^20.0.0",
47
59
  "bun-types": "latest",
48
- "typescript": "^6.0.3"
60
+ "typescript": "^5.8.0"
49
61
  },
50
62
  "engines": {
51
63
  "node": ">=18.0.0",
@@ -66,7 +78,5 @@
66
78
  "webdriver",
67
79
  "chromium",
68
80
  "nothing-browser"
69
- ],
70
- "author": "",
71
- "license": "MIT"
81
+ ]
72
82
  }
package/piggy.ts CHANGED
@@ -5,24 +5,284 @@ import { PiggyClient } from "./piggy/client";
5
5
  import { setClient, setHumanMode, createSiteObject } from "./piggy/register";
6
6
  import { routeRegistry, keepAliveSites, startServer, stopServer } from "./piggy/server";
7
7
  import logger from "./piggy/logger";
8
+ import type { Logger } from "ernest-logger";
9
+ import type { Elysia } from "elysia";
10
+ import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server";
8
11
 
9
- type TabMode = "tab" | "process";
10
- type SiteObject = ReturnType<typeof createSiteObject>;
12
+ // ── Core types ───────────────────────────────────────────────────────────────
13
+
14
+ export type TabMode = "tab" | "process";
15
+
16
+ /** Full API surface of a registered site. */
17
+ export interface SiteObject {
18
+ readonly _name: string;
19
+ readonly _tabId: string;
20
+
21
+ // ── Navigation ─────────────────────────────────────────────────────────────
22
+ navigate(url?: string, opts?: { retries?: number }): Promise<void>;
23
+ reload(): Promise<void>;
24
+ goBack(): Promise<void>;
25
+ goForward(): Promise<void>;
26
+ waitForNavigation(): Promise<void>;
27
+ title(): Promise<string>;
28
+ /** Returns the last known URL (synchronous — does NOT hit the browser). */
29
+ url(): string;
30
+ content(): Promise<string>;
31
+
32
+ // ── Timing ────────────────────────────────────────────────────────────────
33
+ wait(ms: number): Promise<void>;
34
+ waitForSelector(selector: string, timeout?: number): Promise<void>;
35
+ waitForVisible(selector: string, timeout?: number): Promise<void>;
36
+ waitForResponse(pattern: string, timeout?: number): Promise<void>;
37
+
38
+ // ── Init script ───────────────────────────────────────────────────────────
39
+ addInitScript(js: string | (() => void)): Promise<SiteObject>;
40
+
41
+ // ── Event emitter ─────────────────────────────────────────────────────────
42
+ on(event: "navigate", handler: (url: string) => void): () => void;
43
+ on(event: string, handler: (data: unknown) => void): () => void;
44
+ off(event: string, handler: (data: unknown) => void): void;
45
+
46
+ // ── Interactions ──────────────────────────────────────────────────────────
47
+ click(selector: string, opts?: { retries?: number; timeout?: number }): Promise<boolean>;
48
+ doubleClick(selector: string): Promise<boolean>;
49
+ hover(selector: string): Promise<boolean>;
50
+ type(
51
+ selector: string,
52
+ text: string,
53
+ opts?: { delay?: number; retries?: number; fact?: boolean; wpm?: number }
54
+ ): Promise<boolean>;
55
+ select(selector: string, value: string): Promise<boolean>;
56
+ evaluate<T = unknown>(js: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
57
+
58
+ keyboard: {
59
+ press(key: string): Promise<boolean>;
60
+ combo(combo: string): Promise<boolean>;
61
+ };
62
+ mouse: {
63
+ move(x: number, y: number): Promise<boolean>;
64
+ drag(from: { x: number; y: number }, to: { x: number; y: number }): Promise<boolean>;
65
+ };
66
+ scroll: {
67
+ to(selector: string): Promise<boolean>;
68
+ by(px: number): Promise<boolean>;
69
+ };
70
+
71
+ // ── Fetch ─────────────────────────────────────────────────────────────────
72
+ fetchText(selector: string): Promise<string | null>;
73
+ fetchLinks(selector: string): Promise<string[]>;
74
+ fetchImages(selector: string): Promise<string[]>;
75
+ search: {
76
+ css(query: string): Promise<unknown>;
77
+ id(query: string): Promise<unknown>;
78
+ };
79
+
80
+ // ── Screenshot / PDF ──────────────────────────────────────────────────────
81
+ screenshot(filePath?: string): Promise<string>;
82
+ pdf(filePath?: string): Promise<string>;
83
+ blockImages(): Promise<void>;
84
+ unblockImages(): Promise<void>;
85
+
86
+ // ── Cookies ───────────────────────────────────────────────────────────────
87
+ cookies: {
88
+ set(name: string, value: string, domain: string, path?: string): Promise<void>;
89
+ get(name: string): Promise<unknown>;
90
+ delete(name: string): Promise<void>;
91
+ list(): Promise<unknown[]>;
92
+ };
93
+
94
+ // ── Interception ──────────────────────────────────────────────────────────
95
+ intercept: {
96
+ block(pattern: string): Promise<void>;
97
+ redirect(pattern: string, redirectUrl: string): Promise<void>;
98
+ headers(pattern: string, headers: Record<string, string>): Promise<void>;
99
+ respond(
100
+ pattern: string,
101
+ handlerOrResponse:
102
+ | { status?: number; contentType?: string; body: string }
103
+ | ((req: { url: string; method: string }) => {
104
+ status?: number;
105
+ contentType?: string;
106
+ body: string;
107
+ })
108
+ ): Promise<SiteObject>;
109
+ modifyResponse(
110
+ pattern: string,
111
+ handler: (response: {
112
+ body: string;
113
+ status: number;
114
+ headers: Record<string, string>;
115
+ }) => Promise<{ body?: string; status?: number; headers?: Record<string, string> } | void> | void
116
+ ): Promise<SiteObject>;
117
+ clear(): Promise<void>;
118
+ };
119
+
120
+ // ── Network capture ───────────────────────────────────────────────────────
121
+ capture: {
122
+ start(): Promise<void>;
123
+ stop(): Promise<void>;
124
+ requests(): Promise<unknown[]>;
125
+ ws(): Promise<unknown[]>;
126
+ cookies(): Promise<unknown[]>;
127
+ storage(): Promise<unknown>;
128
+ clear(): Promise<void>;
129
+ };
130
+
131
+ // ── Session ───────────────────────────────────────────────────────────────
132
+ session: {
133
+ export(): Promise<unknown>;
134
+ import(data: unknown): Promise<void>;
135
+ };
136
+
137
+ // ── Expose / unexpose ─────────────────────────────────────────────────────
138
+ exposeFunction(
139
+ fnName: string,
140
+ handler: (data: unknown) => Promise<unknown> | unknown
141
+ ): Promise<SiteObject>;
142
+ unexposeFunction(fnName: string): Promise<SiteObject>;
143
+ clearExposedFunctions(): Promise<SiteObject>;
144
+ exposeAndInject(
145
+ fnName: string,
146
+ handler: (data: unknown) => Promise<unknown> | unknown,
147
+ injectionJs: string | ((fnName: string) => string)
148
+ ): Promise<SiteObject>;
149
+
150
+ // ── Elysia route registration ─────────────────────────────────────────────
151
+ api(
152
+ path: string,
153
+ handler: RouteHandler,
154
+ opts?: {
155
+ ttl?: number;
156
+ before?: BeforeMiddleware[];
157
+ method?: "GET" | "POST" | "PUT" | "DELETE";
158
+ }
159
+ ): SiteObject;
160
+
161
+ noclose(): SiteObject;
162
+ close(): Promise<void>;
163
+ }
164
+
165
+ // ── Route summary ─────────────────────────────────────────────────────────────
166
+
167
+ export interface RouteSummary {
168
+ site: string;
169
+ method: RouteConfig["method"];
170
+ path: string;
171
+ ttl: number;
172
+ middlewareCount: number;
173
+ }
174
+
175
+ // ── Multi-site proxy helpers ──────────────────────────────────────────────────
176
+
177
+ export type AllProxy = {
178
+ [K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
179
+ ? (...args: A) => Promise<R[]>
180
+ : SiteObject[K] extends (...args: infer A) => infer R
181
+ ? (...args: A) => Promise<R[]>
182
+ : never;
183
+ };
184
+
185
+ export type DiffProxy = {
186
+ [K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
187
+ ? (...args: A) => Promise<Record<string, R>>
188
+ : SiteObject[K] extends (...args: infer A) => infer R
189
+ ? (...args: A) => Promise<Record<string, R>>
190
+ : never;
191
+ };
192
+
193
+ // ── Option bags ───────────────────────────────────────────────────────────────
194
+
195
+ export interface LaunchOptions {
196
+ mode?: TabMode;
197
+ binary?: BinaryMode;
198
+ }
199
+
200
+ export interface RegisterOptions {
201
+ binary?: BinaryMode;
202
+ }
203
+
204
+ export interface ServeOptions {
205
+ hostname?: string;
206
+ }
207
+
208
+ // ── PiggyBase — named methods, no index signature ─────────────────────────────
209
+
210
+ export interface PiggyBase {
211
+ launch(opts?: LaunchOptions): Promise<PiggyBase>;
212
+ register(name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase>;
213
+ actHuman(enable: boolean): PiggyBase;
214
+ mode(m: TabMode): PiggyBase;
215
+ expose(
216
+ name: string,
217
+ handler: (data: unknown) => Promise<unknown> | unknown,
218
+ tabId?: string
219
+ ): Promise<PiggyBase>;
220
+ unexpose(name: string, tabId?: string): Promise<PiggyBase>;
221
+ serve(port: number, opts?: ServeOptions): Promise<Elysia>;
222
+ stopServer(): void;
223
+ routes(): RouteSummary[];
224
+ all(sites: SiteObject[]): AllProxy;
225
+ diff(sites: SiteObject[]): DiffProxy;
226
+ close(opts?: { force?: boolean }): Promise<void>;
227
+ detect(mode?: BinaryMode): string | null;
228
+ logger: Logger;
229
+ }
230
+
231
+ // ── PiggyWithSites<S> — PiggyBase + typed site keys ──────────────────────────
232
+
233
+ export type PiggyWithSites<S extends string> = PiggyBase & {
234
+ [K in S]: SiteObject;
235
+ };
236
+
237
+ // ── usePiggy — takes the piggy import, returns it typed ──────────────────────
238
+ //
239
+ // The variable is ALWAYS called `piggy`. No rename. No new variable.
240
+ // Just pass the import in, get it back fully typed.
241
+ //
242
+ // import piggy, { usePiggy } from 'nothing-browser';
243
+ // usePiggy<"amazon" | "walmart" | "ebay">(piggy);
244
+ //
245
+ // await piggy.launch({ mode: "tab" });
246
+ // await piggy.register("amazon", "https://www.amazon.com/");
247
+ // await piggy.register("walmart", "https://www.walmart.com/");
248
+ // await piggy.register("ebay", "https://www.ebay.com/");
249
+ //
250
+ // await piggy.amazon.navigate(); // ✅ full autocomplete
251
+ // await piggy.walmart.click("..."); // ✅
252
+ // await piggy.ebay.screenshot(); // ✅
253
+ //
254
+ // How it works: TypeScript narrows the type of `piggy` at the call site
255
+ // via the returned typed reference. Assign back to `piggy` with `let`:
256
+ //
257
+ // import piggyRaw, { usePiggy } from 'nothing-browser';
258
+ // const piggy = usePiggy<"amazon" | "walmart" | "ebay">(piggyRaw);
259
+ //
260
+ // OR use the reassignment pattern with `let` for maximum cleanliness:
261
+ //
262
+ // import { piggy as _piggy, usePiggy } from 'nothing-browser';
263
+ // const piggy = usePiggy<"amazon" | "walmart" | "ebay">(_piggy);
264
+ //
265
+ // Either way: `piggy` is the word in your code, always.
266
+
267
+ export function usePiggy<S extends string>(): PiggyWithSites<S> {
268
+ return piggy as unknown as PiggyWithSites<S>;
269
+ }
270
+
271
+ // ── Module-private state ──────────────────────────────────────────────────────
11
272
 
12
273
  let _client: PiggyClient | null = null;
13
274
  let _tabMode: TabMode = "tab";
14
275
  const _extraProcs: { socket: string; client: PiggyClient }[] = [];
15
276
  const _sites: Record<string, SiteObject> = {};
16
277
 
17
- // CREATE THE PIGGY OBJECT AS A PLAIN OBJECT - NOT A PROXY
18
- const piggy: any = {
19
- // ── Lifecycle ───────────────────────────────────────────────────────────────
278
+ // ── The piggy singleton ───────────────────────────────────────────────────────
20
279
 
21
- launch: async (opts?: { mode?: TabMode; binary?: BinaryMode }) => {
280
+ const piggy: PiggyBase = {
281
+ launch: async (opts?: LaunchOptions): Promise<PiggyBase> => {
22
282
  _tabMode = opts?.mode ?? "tab";
23
283
  const binaryMode: BinaryMode = opts?.binary ?? "headless";
24
284
  await spawnBrowser(binaryMode);
25
- await new Promise(r => setTimeout(r, 500));
285
+ await new Promise<void>((r) => setTimeout(r, 500));
26
286
  _client = new PiggyClient();
27
287
  await _client.connect();
28
288
  setClient(_client);
@@ -30,75 +290,72 @@ const piggy: any = {
30
290
  return piggy;
31
291
  },
32
292
 
33
- register: async (name: string, url: string, opts?: { binary?: BinaryMode }) => {
293
+ register: async (name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase> => {
34
294
  if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
35
295
  const binaryMode: BinaryMode = opts?.binary ?? "headless";
36
296
 
37
- let tabId = "default";
297
+ let siteObj: SiteObject;
298
+
38
299
  if (_tabMode === "tab") {
39
300
  if (!_client) throw new Error("No client. Call piggy.launch() first.");
40
- tabId = await _client.newTab();
41
- // HERE IT IS - CREATE SITE OBJECT AND ASSIGN DIRECTLY
42
- const siteObj = createSiteObject(name, url, _client, tabId);
43
- _sites[name] = siteObj;
44
- piggy[name] = siteObj; // DIRECT ASSIGNMENT - NO PROXY
301
+ const tabId = await _client.newTab();
302
+ siteObj = createSiteObject(name, url, _client, tabId) as SiteObject;
45
303
  logger.success(`[${name}] registered as tab ${tabId}`);
46
304
  } else {
47
305
  const socketName = `piggy_${name}`;
48
306
  await spawnBrowserOnSocket(socketName, binaryMode);
49
- await new Promise(r => setTimeout(r, 500));
307
+ await new Promise<void>((r) => setTimeout(r, 500));
50
308
  const c = new PiggyClient(socketName);
51
309
  await c.connect();
52
310
  _extraProcs.push({ socket: socketName, client: c });
53
- const siteObj = createSiteObject(name, url, c, "default");
54
- _sites[name] = siteObj;
55
- piggy[name] = siteObj; // DIRECT ASSIGNMENT - NO PROXY
311
+ siteObj = createSiteObject(name, url, c, "default") as SiteObject;
56
312
  logger.success(`[${name}] registered as process on "${socketName}"`);
57
313
  }
58
314
 
315
+ _sites[name] = siteObj;
316
+ (piggy as unknown as Record<string, unknown>)[name] = siteObj;
59
317
  return piggy;
60
318
  },
61
319
 
62
- // ── Global controls ─────────────────────────────────────────────────────────
63
-
64
- actHuman: (enable: boolean) => {
320
+ actHuman: (enable: boolean): PiggyBase => {
65
321
  setHumanMode(enable);
66
322
  logger.info(`[piggy] actHuman: ${enable}`);
67
323
  return piggy;
68
324
  },
69
325
 
70
- mode: (m: TabMode) => { _tabMode = m; return piggy; },
71
-
72
- // ── Expose Function (global) ─────────────────────────────────────────────────
326
+ mode: (m: TabMode): PiggyBase => {
327
+ _tabMode = m;
328
+ return piggy;
329
+ },
73
330
 
74
- expose: async (name: string, handler: (data: any) => Promise<any> | any, tabId = "default") => {
331
+ expose: async (
332
+ name: string,
333
+ handler: (data: unknown) => Promise<unknown> | unknown,
334
+ tabId = "default"
335
+ ): Promise<PiggyBase> => {
75
336
  if (!_client) throw new Error("No client. Call piggy.launch() first.");
76
337
  await _client.exposeFunction(name, handler, tabId);
77
338
  logger.success(`[piggy] exposed global function: ${name}`);
78
339
  return piggy;
79
340
  },
80
341
 
81
- unexpose: async (name: string, tabId = "default") => {
342
+ unexpose: async (name: string, tabId = "default"): Promise<PiggyBase> => {
82
343
  if (!_client) throw new Error("No client. Call piggy.launch() first.");
83
344
  await _client.unexposeFunction(name, tabId);
84
345
  logger.info(`[piggy] unexposed function: ${name}`);
85
346
  return piggy;
86
347
  },
87
348
 
88
- // ── Elysia server ────────────────────────────────────────────────────────────
89
-
90
- serve: (port: number, opts?: { hostname?: string }) =>
349
+ serve: (port: number, opts?: ServeOptions): Promise<Elysia> =>
91
350
  startServer(port, opts?.hostname),
92
351
 
93
352
  stopServer,
94
353
 
95
- // ── Route listing ────────────────────────────────────────────────────────────
96
-
97
- routes: () =>
98
- Array.from(routeRegistry.entries()).map(([key, cfg]) => {
354
+ routes: (): RouteSummary[] =>
355
+ Array.from(routeRegistry.entries()).map(([key, cfg]): RouteSummary => {
99
356
  const [site] = key.split(":");
100
357
  return {
101
- site,
358
+ site: site ?? key,
102
359
  method: cfg.method,
103
360
  path: `/${site}${cfg.path}`,
104
361
  ttl: cfg.ttl,
@@ -106,26 +363,31 @@ const piggy: any = {
106
363
  };
107
364
  }),
108
365
 
109
- // ── Multi-site ───────────────────────────────────────────────────────────────
110
-
111
- all: (sites: SiteObject[]) =>
112
- new Proxy({} as any, {
113
- get: (_, method: string) =>
114
- (...args: any[]) => Promise.all(sites.map((s: any) => s[method]?.(...args))),
366
+ all: (sites: SiteObject[]): AllProxy =>
367
+ new Proxy({} as AllProxy, {
368
+ get: (_target, method: string) =>
369
+ (...args: unknown[]) =>
370
+ Promise.all(
371
+ sites.map((s) =>
372
+ (s as unknown as Record<string, (...a: unknown[]) => unknown>)[method]?.(...args)
373
+ )
374
+ ),
115
375
  }),
116
376
 
117
- diff: (sites: SiteObject[]) =>
118
- new Proxy({} as any, {
119
- get: (_, method: string) =>
120
- async (...args: any[]) => {
121
- const results = await Promise.all(sites.map((s: any) => s[method]?.(...args)));
122
- return Object.fromEntries(sites.map((s: any, i) => [s._name ?? i, results[i]]));
377
+ diff: (sites: SiteObject[]): DiffProxy =>
378
+ new Proxy({} as DiffProxy, {
379
+ get: (_target, method: string) =>
380
+ async (...args: unknown[]) => {
381
+ const results = await Promise.all(
382
+ sites.map((s) =>
383
+ (s as unknown as Record<string, (...a: unknown[]) => unknown>)[method]?.(...args)
384
+ )
385
+ );
386
+ return Object.fromEntries(sites.map((s, i) => [s._name ?? i, results[i]]));
123
387
  },
124
388
  }),
125
389
 
126
- // ── Shutdown ─────────────────────────────────────────────────────────────────
127
-
128
- close: async (opts?: { force?: boolean }) => {
390
+ close: async (opts?: { force?: boolean }): Promise<void> => {
129
391
  stopServer();
130
392
  if (opts?.force) {
131
393
  for (const { client: c } of _extraProcs) c.disconnect();
@@ -153,6 +415,5 @@ const piggy: any = {
153
415
  logger,
154
416
  };
155
417
 
156
- // NO PROXY WRAPPER - EXPORT THE PLAIN OBJECT DIRECTLY
157
418
  export default piggy;
158
419
  export { piggy };