nothing-browser 0.0.15 → 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.
package/dist/piggy.d.ts CHANGED
@@ -3,12 +3,10 @@ import type { Logger } from "ernest-logger";
3
3
  import type { Elysia } from "elysia";
4
4
  import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server";
5
5
  export type TabMode = "tab" | "process";
6
- /** Returned by createSiteObject — full API surface of a registered site. */
6
+ /** Full API surface of a registered site. */
7
7
  export interface SiteObject {
8
- /** Internal name used when registering. */
9
- _name: string;
10
- /** Internal CDP / socket tab ID. */
11
- _tabId: string;
8
+ readonly _name: string;
9
+ readonly _tabId: string;
12
10
  navigate(url?: string, opts?: {
13
11
  retries?: number;
14
12
  }): Promise<void>;
@@ -136,87 +134,45 @@ export interface RouteSummary {
136
134
  ttl: number;
137
135
  middlewareCount: number;
138
136
  }
139
- /**
140
- * Proxy that runs the same method on every site in parallel (Promise.all).
141
- * The return type mirrors the SiteObject API but every method returns
142
- * `Promise<ReturnType[]>` instead of a single value.
143
- */
144
137
  export type AllProxy = {
145
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;
146
139
  };
147
- /**
148
- * Proxy that runs the same method on every site in parallel and returns a
149
- * Record keyed by site `_name`.
150
- */
151
140
  export type DiffProxy = {
152
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;
153
142
  };
154
143
  export interface LaunchOptions {
155
- /** Whether to open a separate browser process per registered site or share a single one via tabs. Default: `"tab"`. */
156
144
  mode?: TabMode;
157
- /** Whether to run the browser binary in headed or headless mode. Default: `"headless"`. */
158
145
  binary?: BinaryMode;
159
146
  }
160
147
  export interface RegisterOptions {
161
- /** Override the binary mode for this site's dedicated process (only used when `mode === "process"`). */
162
148
  binary?: BinaryMode;
163
149
  }
164
150
  export interface ServeOptions {
165
151
  hostname?: string;
166
152
  }
167
- export interface Piggy {
168
- /**
169
- * Spawns the Nothing Browser binary and connects the internal socket client.
170
- * Must be called before any other method.
171
- */
172
- launch(opts?: LaunchOptions): Promise<Piggy>;
173
- /**
174
- * Registers a named site at the given URL.
175
- * After registration `piggy[name]` is available as a `SiteObject`.
176
- */
177
- register(name: string, url: string, opts?: RegisterOptions): Promise<Piggy>;
178
- /** Enables or disables human-simulation mode (random delays, typos, smooth scrolling). */
179
- actHuman(enable: boolean): Piggy;
180
- /** Changes the tab/process mode *before* the next `register()` call. */
181
- mode(m: TabMode): Piggy;
182
- /** Exposes a Node.js function to the browser's global scope on the default (or specified) tab. */
183
- expose(name: string, handler: (data: unknown) => Promise<unknown> | unknown, tabId?: string): Promise<Piggy>;
184
- /** Removes a previously exposed function from the browser. */
185
- unexpose(name: string, tabId?: string): Promise<Piggy>;
186
- /** Starts an Elysia HTTP server that exposes all registered `.api()` routes. */
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>;
187
160
  serve(port: number, opts?: ServeOptions): Promise<Elysia>;
188
- /** Stops the running Elysia server. */
189
161
  stopServer(): void;
190
- /** Returns a summary of every mounted HTTP route. */
191
162
  routes(): RouteSummary[];
192
- /**
193
- * Returns a proxy that calls the same method on **all** given sites in
194
- * parallel (via `Promise.all`) and returns an array of results.
195
- */
196
163
  all(sites: SiteObject[]): AllProxy;
197
- /**
198
- * Returns a proxy that calls the same method on **all** given sites in
199
- * parallel and returns a `Record<siteName, result>` object.
200
- */
201
164
  diff(sites: SiteObject[]): DiffProxy;
202
- /**
203
- * Gracefully shuts down all tabs and the browser process.
204
- * Pass `{ force: true }` to skip graceful close and kill immediately.
205
- */
206
165
  close(opts?: {
207
166
  force?: boolean;
208
167
  }): Promise<void>;
209
- /** Detects the Nothing Browser binary path for the given mode. */
210
168
  detect(mode?: BinaryMode): string | null;
211
- /** The ernest-logger instance used internally. */
212
169
  logger: Logger;
213
- /**
214
- * After `piggy.register("mysite", url)` you can access the site as
215
- * `piggy.mysite`. The index signature covers those dynamic properties.
216
- */
217
- [site: string]: SiteObject | unknown;
218
170
  }
219
- declare const piggy: Piggy;
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;
220
176
  export default piggy;
221
177
  export { piggy };
222
178
  //# sourceMappingURL=piggy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"piggy.d.ts","sourceRoot":"","sources":["../piggy.ts"],"names":[],"mappings":"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"}
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) => {
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "nothing-browser",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
4
4
  "description": "Browser automation library powered by Nothing Browser",
5
5
  "homepage": "https://github.com/ernest-tech-house-co-operation/nothing-browser#readme",
6
6
  "repository": {
package/piggy.ts CHANGED
@@ -13,12 +13,10 @@ import type { RouteHandler, BeforeMiddleware, RouteConfig } from "./piggy/server
13
13
 
14
14
  export type TabMode = "tab" | "process";
15
15
 
16
- /** Returned by createSiteObject — full API surface of a registered site. */
16
+ /** Full API surface of a registered site. */
17
17
  export interface SiteObject {
18
- /** Internal name used when registering. */
19
- _name: string;
20
- /** Internal CDP / socket tab ID. */
21
- _tabId: string;
18
+ readonly _name: string;
19
+ readonly _tabId: string;
22
20
 
23
21
  // ── Navigation ─────────────────────────────────────────────────────────────
24
22
  navigate(url?: string, opts?: { retries?: number }): Promise<void>;
@@ -26,7 +24,6 @@ export interface SiteObject {
26
24
  goBack(): Promise<void>;
27
25
  goForward(): Promise<void>;
28
26
  waitForNavigation(): Promise<void>;
29
-
30
27
  title(): Promise<string>;
31
28
  /** Returns the last known URL (synchronous — does NOT hit the browser). */
32
29
  url(): string;
@@ -62,12 +59,10 @@ export interface SiteObject {
62
59
  press(key: string): Promise<boolean>;
63
60
  combo(combo: string): Promise<boolean>;
64
61
  };
65
-
66
62
  mouse: {
67
63
  move(x: number, y: number): Promise<boolean>;
68
64
  drag(from: { x: number; y: number }, to: { x: number; y: number }): Promise<boolean>;
69
65
  };
70
-
71
66
  scroll: {
72
67
  to(selector: string): Promise<boolean>;
73
68
  by(px: number): Promise<boolean>;
@@ -77,7 +72,6 @@ export interface SiteObject {
77
72
  fetchText(selector: string): Promise<string | null>;
78
73
  fetchLinks(selector: string): Promise<string[]>;
79
74
  fetchImages(selector: string): Promise<string[]>;
80
-
81
75
  search: {
82
76
  css(query: string): Promise<unknown>;
83
77
  id(query: string): Promise<unknown>;
@@ -140,7 +134,7 @@ export interface SiteObject {
140
134
  import(data: unknown): Promise<void>;
141
135
  };
142
136
 
143
- // ── Expose / unexpose functions ───────────────────────────────────────────
137
+ // ── Expose / unexpose ─────────────────────────────────────────────────────
144
138
  exposeFunction(
145
139
  fnName: string,
146
140
  handler: (data: unknown) => Promise<unknown> | unknown
@@ -168,7 +162,7 @@ export interface SiteObject {
168
162
  close(): Promise<void>;
169
163
  }
170
164
 
171
- // ── Route summary returned by piggy.routes() ─────────────────────────────────
165
+ // ── Route summary ─────────────────────────────────────────────────────────────
172
166
 
173
167
  export interface RouteSummary {
174
168
  site: string;
@@ -180,11 +174,6 @@ export interface RouteSummary {
180
174
 
181
175
  // ── Multi-site proxy helpers ──────────────────────────────────────────────────
182
176
 
183
- /**
184
- * Proxy that runs the same method on every site in parallel (Promise.all).
185
- * The return type mirrors the SiteObject API but every method returns
186
- * `Promise<ReturnType[]>` instead of a single value.
187
- */
188
177
  export type AllProxy = {
189
178
  [K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
190
179
  ? (...args: A) => Promise<R[]>
@@ -193,10 +182,6 @@ export type AllProxy = {
193
182
  : never;
194
183
  };
195
184
 
196
- /**
197
- * Proxy that runs the same method on every site in parallel and returns a
198
- * Record keyed by site `_name`.
199
- */
200
185
  export type DiffProxy = {
201
186
  [K in keyof SiteObject]: SiteObject[K] extends (...args: infer A) => Promise<infer R>
202
187
  ? (...args: A) => Promise<Record<string, R>>
@@ -205,17 +190,14 @@ export type DiffProxy = {
205
190
  : never;
206
191
  };
207
192
 
208
- // ── Launch / register option bags ────────────────────────────────────────────
193
+ // ── Option bags ───────────────────────────────────────────────────────────────
209
194
 
210
195
  export interface LaunchOptions {
211
- /** Whether to open a separate browser process per registered site or share a single one via tabs. Default: `"tab"`. */
212
196
  mode?: TabMode;
213
- /** Whether to run the browser binary in headed or headless mode. Default: `"headless"`. */
214
197
  binary?: BinaryMode;
215
198
  }
216
199
 
217
200
  export interface RegisterOptions {
218
- /** Override the binary mode for this site's dedicated process (only used when `mode === "process"`). */
219
201
  binary?: BinaryMode;
220
202
  }
221
203
 
@@ -223,84 +205,67 @@ export interface ServeOptions {
223
205
  hostname?: string;
224
206
  }
225
207
 
226
- // ── The Piggy object type ─────────────────────────────────────────────────────
227
-
228
- export interface Piggy {
229
- // ── Lifecycle ──────────────────────────────────────────────────────────────
230
- /**
231
- * Spawns the Nothing Browser binary and connects the internal socket client.
232
- * Must be called before any other method.
233
- */
234
- launch(opts?: LaunchOptions): Promise<Piggy>;
235
-
236
- /**
237
- * Registers a named site at the given URL.
238
- * After registration `piggy[name]` is available as a `SiteObject`.
239
- */
240
- register(name: string, url: string, opts?: RegisterOptions): Promise<Piggy>;
241
-
242
- // ── Global controls ────────────────────────────────────────────────────────
243
- /** Enables or disables human-simulation mode (random delays, typos, smooth scrolling). */
244
- actHuman(enable: boolean): Piggy;
245
-
246
- /** Changes the tab/process mode *before* the next `register()` call. */
247
- mode(m: TabMode): Piggy;
208
+ // ── PiggyBase named methods, no index signature ─────────────────────────────
248
209
 
249
- // ── Global function exposure ───────────────────────────────────────────────
250
- /** Exposes a Node.js function to the browser's global scope on the default (or specified) tab. */
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;
251
215
  expose(
252
216
  name: string,
253
217
  handler: (data: unknown) => Promise<unknown> | unknown,
254
218
  tabId?: string
255
- ): Promise<Piggy>;
256
-
257
- /** Removes a previously exposed function from the browser. */
258
- unexpose(name: string, tabId?: string): Promise<Piggy>;
259
-
260
- // ── Elysia server ─────────────────────────────────────────────────────────
261
- /** Starts an Elysia HTTP server that exposes all registered `.api()` routes. */
219
+ ): Promise<PiggyBase>;
220
+ unexpose(name: string, tabId?: string): Promise<PiggyBase>;
262
221
  serve(port: number, opts?: ServeOptions): Promise<Elysia>;
263
-
264
- /** Stops the running Elysia server. */
265
222
  stopServer(): void;
266
-
267
- // ── Introspection ─────────────────────────────────────────────────────────
268
- /** Returns a summary of every mounted HTTP route. */
269
223
  routes(): RouteSummary[];
270
-
271
- // ── Multi-site helpers ────────────────────────────────────────────────────
272
- /**
273
- * Returns a proxy that calls the same method on **all** given sites in
274
- * parallel (via `Promise.all`) and returns an array of results.
275
- */
276
224
  all(sites: SiteObject[]): AllProxy;
277
-
278
- /**
279
- * Returns a proxy that calls the same method on **all** given sites in
280
- * parallel and returns a `Record<siteName, result>` object.
281
- */
282
225
  diff(sites: SiteObject[]): DiffProxy;
283
-
284
- // ── Shutdown ──────────────────────────────────────────────────────────────
285
- /**
286
- * Gracefully shuts down all tabs and the browser process.
287
- * Pass `{ force: true }` to skip graceful close and kill immediately.
288
- */
289
226
  close(opts?: { force?: boolean }): Promise<void>;
290
-
291
- // ── Utilities ─────────────────────────────────────────────────────────────
292
- /** Detects the Nothing Browser binary path for the given mode. */
293
227
  detect(mode?: BinaryMode): string | null;
294
-
295
- /** The ernest-logger instance used internally. */
296
228
  logger: Logger;
229
+ }
230
+
231
+ // ── PiggyWithSites<S> — PiggyBase + typed site keys ──────────────────────────
297
232
 
298
- // ── Dynamic site keys ─────────────────────────────────────────────────────
299
- /**
300
- * After `piggy.register("mysite", url)` you can access the site as
301
- * `piggy.mysite`. The index signature covers those dynamic properties.
302
- */
303
- [site: string]: SiteObject | unknown;
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>;
304
269
  }
305
270
 
306
271
  // ── Module-private state ──────────────────────────────────────────────────────
@@ -312,10 +277,8 @@ const _sites: Record<string, SiteObject> = {};
312
277
 
313
278
  // ── The piggy singleton ───────────────────────────────────────────────────────
314
279
 
315
- const piggy: Piggy = {
316
- // ── Lifecycle ───────────────────────────────────────────────────────────────
317
-
318
- launch: async (opts?: LaunchOptions): Promise<Piggy> => {
280
+ const piggy: PiggyBase = {
281
+ launch: async (opts?: LaunchOptions): Promise<PiggyBase> => {
319
282
  _tabMode = opts?.mode ?? "tab";
320
283
  const binaryMode: BinaryMode = opts?.binary ?? "headless";
321
284
  await spawnBrowser(binaryMode);
@@ -327,17 +290,16 @@ const piggy: Piggy = {
327
290
  return piggy;
328
291
  },
329
292
 
330
- register: async (name: string, url: string, opts?: RegisterOptions): Promise<Piggy> => {
293
+ register: async (name: string, url: string, opts?: RegisterOptions): Promise<PiggyBase> => {
331
294
  if (!url?.trim()) throw new Error(`No URL for site "${name}"`);
332
295
  const binaryMode: BinaryMode = opts?.binary ?? "headless";
333
296
 
334
- let tabId = "default";
297
+ let siteObj: SiteObject;
298
+
335
299
  if (_tabMode === "tab") {
336
300
  if (!_client) throw new Error("No client. Call piggy.launch() first.");
337
- tabId = await _client.newTab();
338
- const siteObj: SiteObject = createSiteObject(name, url, _client, tabId);
339
- _sites[name] = siteObj;
340
- (piggy as Record<string, unknown>)[name] = siteObj;
301
+ const tabId = await _client.newTab();
302
+ siteObj = createSiteObject(name, url, _client, tabId) as SiteObject;
341
303
  logger.success(`[${name}] registered as tab ${tabId}`);
342
304
  } else {
343
305
  const socketName = `piggy_${name}`;
@@ -346,57 +308,49 @@ const piggy: Piggy = {
346
308
  const c = new PiggyClient(socketName);
347
309
  await c.connect();
348
310
  _extraProcs.push({ socket: socketName, client: c });
349
- const siteObj: SiteObject = createSiteObject(name, url, c, "default");
350
- _sites[name] = siteObj;
351
- (piggy as Record<string, unknown>)[name] = siteObj;
311
+ siteObj = createSiteObject(name, url, c, "default") as SiteObject;
352
312
  logger.success(`[${name}] registered as process on "${socketName}"`);
353
313
  }
354
314
 
315
+ _sites[name] = siteObj;
316
+ (piggy as unknown as Record<string, unknown>)[name] = siteObj;
355
317
  return piggy;
356
318
  },
357
319
 
358
- // ── Global controls ─────────────────────────────────────────────────────────
359
-
360
- actHuman: (enable: boolean): Piggy => {
320
+ actHuman: (enable: boolean): PiggyBase => {
361
321
  setHumanMode(enable);
362
322
  logger.info(`[piggy] actHuman: ${enable}`);
363
323
  return piggy;
364
324
  },
365
325
 
366
- mode: (m: TabMode): Piggy => {
326
+ mode: (m: TabMode): PiggyBase => {
367
327
  _tabMode = m;
368
328
  return piggy;
369
329
  },
370
330
 
371
- // ── Expose Function (global) ─────────────────────────────────────────────────
372
-
373
331
  expose: async (
374
332
  name: string,
375
333
  handler: (data: unknown) => Promise<unknown> | unknown,
376
334
  tabId = "default"
377
- ): Promise<Piggy> => {
335
+ ): Promise<PiggyBase> => {
378
336
  if (!_client) throw new Error("No client. Call piggy.launch() first.");
379
337
  await _client.exposeFunction(name, handler, tabId);
380
338
  logger.success(`[piggy] exposed global function: ${name}`);
381
339
  return piggy;
382
340
  },
383
341
 
384
- unexpose: async (name: string, tabId = "default"): Promise<Piggy> => {
342
+ unexpose: async (name: string, tabId = "default"): Promise<PiggyBase> => {
385
343
  if (!_client) throw new Error("No client. Call piggy.launch() first.");
386
344
  await _client.unexposeFunction(name, tabId);
387
345
  logger.info(`[piggy] unexposed function: ${name}`);
388
346
  return piggy;
389
347
  },
390
348
 
391
- // ── Elysia server ────────────────────────────────────────────────────────────
392
-
393
349
  serve: (port: number, opts?: ServeOptions): Promise<Elysia> =>
394
350
  startServer(port, opts?.hostname),
395
351
 
396
352
  stopServer,
397
353
 
398
- // ── Route listing ────────────────────────────────────────────────────────────
399
-
400
354
  routes: (): RouteSummary[] =>
401
355
  Array.from(routeRegistry.entries()).map(([key, cfg]): RouteSummary => {
402
356
  const [site] = key.split(":");
@@ -409,8 +363,6 @@ const piggy: Piggy = {
409
363
  };
410
364
  }),
411
365
 
412
- // ── Multi-site ───────────────────────────────────────────────────────────────
413
-
414
366
  all: (sites: SiteObject[]): AllProxy =>
415
367
  new Proxy({} as AllProxy, {
416
368
  get: (_target, method: string) =>
@@ -435,8 +387,6 @@ const piggy: Piggy = {
435
387
  },
436
388
  }),
437
389
 
438
- // ── Shutdown ─────────────────────────────────────────────────────────────────
439
-
440
390
  close: async (opts?: { force?: boolean }): Promise<void> => {
441
391
  stopServer();
442
392
  if (opts?.force) {