@hasna/testers 0.0.17 → 0.0.19

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/cli/index.js CHANGED
@@ -12414,7 +12414,7 @@ var init_browser_bun = __esm(() => {
12414
12414
  this._emit("navigationfailed", error);
12415
12415
  };
12416
12416
  }
12417
- async goto(url, opts) {
12417
+ async goto(url, _opts) {
12418
12418
  await this.view.navigate(url);
12419
12419
  await new Promise((r) => setTimeout(r, 200));
12420
12420
  }
@@ -12437,14 +12437,14 @@ var init_browser_bun = __esm(() => {
12437
12437
  }
12438
12438
  return this.view.evaluate(expr);
12439
12439
  }
12440
- async screenshot(opts) {
12440
+ async screenshot(_opts) {
12441
12441
  const uint8 = await this.view.screenshot();
12442
12442
  return Buffer.from(uint8);
12443
12443
  }
12444
12444
  async click(selector, opts) {
12445
12445
  await this.view.click(selector, opts ? { button: opts.button } : undefined);
12446
12446
  }
12447
- async type(selector, text, opts) {
12447
+ async type(selector, text, _opts) {
12448
12448
  try {
12449
12449
  await this.view.click(selector);
12450
12450
  } catch {}
@@ -12539,7 +12539,7 @@ var init_browser_bun = __esm(() => {
12539
12539
  })()
12540
12540
  `);
12541
12541
  }
12542
- async setInputFiles(selector, files) {
12542
+ async setInputFiles(_selector, _files) {
12543
12543
  throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
12544
12544
  }
12545
12545
  getByRole(role, opts) {
@@ -12589,11 +12589,10 @@ var init_browser_bun = __esm(() => {
12589
12589
  })
12590
12590
  };
12591
12591
  }
12592
- getByText(text, opts) {
12593
- const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
12592
+ getByText(text, _opts) {
12594
12593
  return {
12595
12594
  first: () => ({
12596
- click: async (clickOpts) => {
12595
+ click: async (_clickOpts) => {
12597
12596
  await this.view.evaluate(`
12598
12597
  (() => {
12599
12598
  const text = ${JSON.stringify(text)};
@@ -12660,7 +12659,7 @@ var init_browser_bun = __esm(() => {
12660
12659
  viewportSize() {
12661
12660
  return { width: 1280, height: 720 };
12662
12661
  }
12663
- async waitForLoadState(state, opts) {
12662
+ async waitForLoadState(_state, _opts) {
12664
12663
  await new Promise((r) => setTimeout(r, 200));
12665
12664
  }
12666
12665
  async waitForURL(pattern, opts) {
@@ -19820,7 +19819,7 @@ import chalk6 from "chalk";
19820
19819
  // package.json
19821
19820
  var package_default = {
19822
19821
  name: "@hasna/testers",
19823
- version: "0.0.17",
19822
+ version: "0.0.19",
19824
19823
  description: "AI-powered QA testing CLI \u2014 spawns cheap AI agents to test web apps with headless browsers",
19825
19824
  type: "module",
19826
19825
  main: "dist/index.js",
@@ -19855,7 +19854,8 @@ var package_default = {
19855
19854
  "dev:cli": "bun run src/cli/index.tsx",
19856
19855
  "dev:mcp": "bun run src/mcp/index.ts",
19857
19856
  "dev:serve": "bun run src/server/index.ts",
19858
- prepublishOnly: "bun run build"
19857
+ prepublishOnly: "bun run build",
19858
+ postinstall: "mkdir -p $HOME/.hasna/testers/screenshots $HOME/.hasna/testers/browser/profiles 2>/dev/null || true"
19859
19859
  },
19860
19860
  dependencies: {
19861
19861
  "@anthropic-ai/sdk": "^0.52.0",
@@ -0,0 +1,7 @@
1
+ /**
2
+ * PostgreSQL migrations for open-testers cloud sync.
3
+ *
4
+ * Equivalent to the SQLite schema in database.ts, translated for PostgreSQL.
5
+ */
6
+ export declare const PG_MIGRATIONS: string[];
7
+ //# sourceMappingURL=pg-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-migrations.d.ts","sourceRoot":"","sources":["../../src/db/pg-migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,aAAa,EAAE,MAAM,EAgXjC,CAAC"}
package/dist/index.js CHANGED
@@ -10183,7 +10183,7 @@ var init_browser_bun = __esm(() => {
10183
10183
  this._emit("navigationfailed", error);
10184
10184
  };
10185
10185
  }
10186
- async goto(url, opts) {
10186
+ async goto(url, _opts) {
10187
10187
  await this.view.navigate(url);
10188
10188
  await new Promise((r) => setTimeout(r, 200));
10189
10189
  }
@@ -10206,14 +10206,14 @@ var init_browser_bun = __esm(() => {
10206
10206
  }
10207
10207
  return this.view.evaluate(expr);
10208
10208
  }
10209
- async screenshot(opts) {
10209
+ async screenshot(_opts) {
10210
10210
  const uint8 = await this.view.screenshot();
10211
10211
  return Buffer.from(uint8);
10212
10212
  }
10213
10213
  async click(selector, opts) {
10214
10214
  await this.view.click(selector, opts ? { button: opts.button } : undefined);
10215
10215
  }
10216
- async type(selector, text, opts) {
10216
+ async type(selector, text, _opts) {
10217
10217
  try {
10218
10218
  await this.view.click(selector);
10219
10219
  } catch {}
@@ -10308,7 +10308,7 @@ var init_browser_bun = __esm(() => {
10308
10308
  })()
10309
10309
  `);
10310
10310
  }
10311
- async setInputFiles(selector, files) {
10311
+ async setInputFiles(_selector, _files) {
10312
10312
  throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
10313
10313
  }
10314
10314
  getByRole(role, opts) {
@@ -10358,11 +10358,10 @@ var init_browser_bun = __esm(() => {
10358
10358
  })
10359
10359
  };
10360
10360
  }
10361
- getByText(text, opts) {
10362
- const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
10361
+ getByText(text, _opts) {
10363
10362
  return {
10364
10363
  first: () => ({
10365
- click: async (clickOpts) => {
10364
+ click: async (_clickOpts) => {
10366
10365
  await this.view.evaluate(`
10367
10366
  (() => {
10368
10367
  const text = ${JSON.stringify(text)};
@@ -10429,7 +10428,7 @@ var init_browser_bun = __esm(() => {
10429
10428
  viewportSize() {
10430
10429
  return { width: 1280, height: 720 };
10431
10430
  }
10432
- async waitForLoadState(state, opts) {
10431
+ async waitForLoadState(_state, _opts) {
10433
10432
  await new Promise((r) => setTimeout(r, 200));
10434
10433
  }
10435
10434
  async waitForURL(pattern, opts) {
@@ -49,7 +49,7 @@ export declare class BunWebViewSession {
49
49
  private _sessionId?;
50
50
  private _eventListeners;
51
51
  constructor(opts?: BunWebViewOptions);
52
- goto(url: string, opts?: {
52
+ goto(url: string, _opts?: {
53
53
  waitUntil?: string;
54
54
  timeout?: number;
55
55
  }): Promise<void>;
@@ -57,7 +57,7 @@ export declare class BunWebViewSession {
57
57
  goForward(): Promise<void>;
58
58
  reload(): Promise<void>;
59
59
  evaluate<T = unknown>(fnOrExpr: string | ((...args: unknown[]) => unknown), ...args: unknown[]): Promise<T>;
60
- screenshot(opts?: {
60
+ screenshot(_opts?: {
61
61
  path?: string;
62
62
  type?: string;
63
63
  fullPage?: boolean;
@@ -67,7 +67,7 @@ export declare class BunWebViewSession {
67
67
  button?: "left" | "right" | "middle";
68
68
  timeout?: number;
69
69
  }): Promise<void>;
70
- type(selector: string, text: string, opts?: {
70
+ type(selector: string, text: string, _opts?: {
71
71
  delay?: number;
72
72
  }): Promise<void>;
73
73
  fill(selector: string, value: string): Promise<void>;
@@ -91,11 +91,11 @@ export declare class BunWebViewSession {
91
91
  selectOption(selector: string, value: string): Promise<string[]>;
92
92
  check(selector: string): Promise<void>;
93
93
  uncheck(selector: string): Promise<void>;
94
- setInputFiles(selector: string, files: string | string[]): Promise<void>;
94
+ setInputFiles(_selector: string, _files: string | string[]): Promise<void>;
95
95
  getByRole(role: string, opts?: {
96
96
  name?: string | RegExp;
97
97
  }): any;
98
- getByText(text: string, opts?: {
98
+ getByText(text: string, _opts?: {
99
99
  exact?: boolean;
100
100
  }): any;
101
101
  locator(selector: string): any;
@@ -105,7 +105,7 @@ export declare class BunWebViewSession {
105
105
  width: number;
106
106
  height: number;
107
107
  } | null;
108
- waitForLoadState(state?: string, opts?: {
108
+ waitForLoadState(_state?: string, _opts?: {
109
109
  timeout?: number;
110
110
  }): Promise<void>;
111
111
  waitForURL(pattern: string | RegExp, opts?: {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-bun.d.ts","sourceRoot":"","sources":["../../src/lib/browser-bun.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser-bun.d.ts","sourceRoot":"","sources":["../../src/lib/browser-bun.ts"],"names":[],"mappings":"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"}
package/dist/mcp/index.js CHANGED
@@ -10760,7 +10760,7 @@ var init_browser_bun = __esm(() => {
10760
10760
  this._emit("navigationfailed", error);
10761
10761
  };
10762
10762
  }
10763
- async goto(url, opts) {
10763
+ async goto(url, _opts) {
10764
10764
  await this.view.navigate(url);
10765
10765
  await new Promise((r) => setTimeout(r, 200));
10766
10766
  }
@@ -10783,14 +10783,14 @@ var init_browser_bun = __esm(() => {
10783
10783
  }
10784
10784
  return this.view.evaluate(expr);
10785
10785
  }
10786
- async screenshot(opts) {
10786
+ async screenshot(_opts) {
10787
10787
  const uint8 = await this.view.screenshot();
10788
10788
  return Buffer.from(uint8);
10789
10789
  }
10790
10790
  async click(selector, opts) {
10791
10791
  await this.view.click(selector, opts ? { button: opts.button } : undefined);
10792
10792
  }
10793
- async type(selector, text, opts) {
10793
+ async type(selector, text, _opts) {
10794
10794
  try {
10795
10795
  await this.view.click(selector);
10796
10796
  } catch {}
@@ -10885,7 +10885,7 @@ var init_browser_bun = __esm(() => {
10885
10885
  })()
10886
10886
  `);
10887
10887
  }
10888
- async setInputFiles(selector, files) {
10888
+ async setInputFiles(_selector, _files) {
10889
10889
  throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
10890
10890
  }
10891
10891
  getByRole(role, opts) {
@@ -10935,11 +10935,10 @@ var init_browser_bun = __esm(() => {
10935
10935
  })
10936
10936
  };
10937
10937
  }
10938
- getByText(text, opts) {
10939
- const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
10938
+ getByText(text, _opts) {
10940
10939
  return {
10941
10940
  first: () => ({
10942
- click: async (clickOpts) => {
10941
+ click: async (_clickOpts) => {
10943
10942
  await this.view.evaluate(`
10944
10943
  (() => {
10945
10944
  const text = ${JSON.stringify(text)};
@@ -11006,7 +11005,7 @@ var init_browser_bun = __esm(() => {
11006
11005
  viewportSize() {
11007
11006
  return { width: 1280, height: 720 };
11008
11007
  }
11009
- async waitForLoadState(state, opts) {
11008
+ async waitForLoadState(_state, _opts) {
11010
11009
  await new Promise((r) => setTimeout(r, 200));
11011
11010
  }
11012
11011
  async waitForURL(pattern, opts) {
@@ -9894,7 +9894,7 @@ var init_browser_bun = __esm(() => {
9894
9894
  this._emit("navigationfailed", error);
9895
9895
  };
9896
9896
  }
9897
- async goto(url, opts) {
9897
+ async goto(url, _opts) {
9898
9898
  await this.view.navigate(url);
9899
9899
  await new Promise((r) => setTimeout(r, 200));
9900
9900
  }
@@ -9917,14 +9917,14 @@ var init_browser_bun = __esm(() => {
9917
9917
  }
9918
9918
  return this.view.evaluate(expr);
9919
9919
  }
9920
- async screenshot(opts) {
9920
+ async screenshot(_opts) {
9921
9921
  const uint8 = await this.view.screenshot();
9922
9922
  return Buffer.from(uint8);
9923
9923
  }
9924
9924
  async click(selector, opts) {
9925
9925
  await this.view.click(selector, opts ? { button: opts.button } : undefined);
9926
9926
  }
9927
- async type(selector, text, opts) {
9927
+ async type(selector, text, _opts) {
9928
9928
  try {
9929
9929
  await this.view.click(selector);
9930
9930
  } catch {}
@@ -10019,7 +10019,7 @@ var init_browser_bun = __esm(() => {
10019
10019
  })()
10020
10020
  `);
10021
10021
  }
10022
- async setInputFiles(selector, files) {
10022
+ async setInputFiles(_selector, _files) {
10023
10023
  throw new Error("File upload not supported in Bun.WebView engine. Use engine: 'playwright' instead.");
10024
10024
  }
10025
10025
  getByRole(role, opts) {
@@ -10069,11 +10069,10 @@ var init_browser_bun = __esm(() => {
10069
10069
  })
10070
10070
  };
10071
10071
  }
10072
- getByText(text, opts) {
10073
- const selector = opts?.exact ? `*:is(button, a, span, div, p, h1, h2, h3, h4, label)` : "*";
10072
+ getByText(text, _opts) {
10074
10073
  return {
10075
10074
  first: () => ({
10076
- click: async (clickOpts) => {
10075
+ click: async (_clickOpts) => {
10077
10076
  await this.view.evaluate(`
10078
10077
  (() => {
10079
10078
  const text = ${JSON.stringify(text)};
@@ -10140,7 +10139,7 @@ var init_browser_bun = __esm(() => {
10140
10139
  viewportSize() {
10141
10140
  return { width: 1280, height: 720 };
10142
10141
  }
10143
- async waitForLoadState(state, opts) {
10142
+ async waitForLoadState(_state, _opts) {
10144
10143
  await new Promise((r) => setTimeout(r, 200));
10145
10144
  }
10146
10145
  async waitForURL(pattern, opts) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hasna/testers",
3
- "version": "0.0.17",
4
- "description": "AI-powered QA testing CLI spawns cheap AI agents to test web apps with headless browsers",
3
+ "version": "0.0.19",
4
+ "description": "AI-powered QA testing CLI \u2014 spawns cheap AI agents to test web apps with headless browsers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -35,7 +35,8 @@
35
35
  "dev:cli": "bun run src/cli/index.tsx",
36
36
  "dev:mcp": "bun run src/mcp/index.ts",
37
37
  "dev:serve": "bun run src/server/index.ts",
38
- "prepublishOnly": "bun run build"
38
+ "prepublishOnly": "bun run build",
39
+ "postinstall": "mkdir -p $HOME/.hasna/testers/screenshots $HOME/.hasna/testers/browser/profiles 2>/dev/null || true"
39
40
  },
40
41
  "dependencies": {
41
42
  "@anthropic-ai/sdk": "^0.52.0",
@@ -76,4 +77,4 @@
76
77
  "cli",
77
78
  "mcp"
78
79
  ]
79
- }
80
+ }