@enricai/barnacle 1.0.0 → 1.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 (66) hide show
  1. package/README.md +51 -0
  2. package/dist/config.d.ts +10 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +1 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/lib/datadog.d.ts +20 -5
  7. package/dist/lib/datadog.d.ts.map +1 -1
  8. package/dist/lib/datadog.js +65 -19
  9. package/dist/lib/datadog.js.map +1 -1
  10. package/dist/lib/errors.d.ts +8 -0
  11. package/dist/lib/errors.d.ts.map +1 -1
  12. package/dist/lib/errors.js +11 -0
  13. package/dist/lib/errors.js.map +1 -1
  14. package/dist/lib/logging.js +1 -1
  15. package/dist/lib/logging.js.map +1 -1
  16. package/dist/lib/statsd.d.ts +20 -5
  17. package/dist/lib/statsd.d.ts.map +1 -1
  18. package/dist/lib/statsd.js +56 -28
  19. package/dist/lib/statsd.js.map +1 -1
  20. package/dist/scraper/http-client.js +2 -2
  21. package/dist/scraper/http-client.js.map +1 -1
  22. package/dist/scraper/raw-fetch.d.ts +22 -0
  23. package/dist/scraper/raw-fetch.d.ts.map +1 -1
  24. package/dist/scraper/raw-fetch.js +2 -2
  25. package/dist/scraper/raw-fetch.js.map +1 -1
  26. package/dist/scraper/session-browserbase.d.ts +4 -4
  27. package/dist/scraper/session-browserbase.js +4 -4
  28. package/dist/scripts/recon-generate.d.ts.map +1 -1
  29. package/dist/scripts/recon-generate.js +42 -14
  30. package/dist/scripts/recon-generate.js.map +1 -1
  31. package/dist/testing/{contract-parity-suite.d.ts → contract-parity-suite.d.mts} +2 -2
  32. package/dist/testing/contract-parity-suite.d.mts.map +1 -0
  33. package/dist/testing/{contract-parity-suite.js → contract-parity-suite.mjs} +9 -12
  34. package/dist/testing/contract-parity-suite.mjs.map +1 -0
  35. package/dist/testing/{coverage-guard-suite.d.ts → coverage-guard-suite.d.mts} +1 -1
  36. package/dist/testing/coverage-guard-suite.d.mts.map +1 -0
  37. package/dist/testing/{coverage-guard-suite.js → coverage-guard-suite.mjs} +9 -12
  38. package/dist/testing/coverage-guard-suite.mjs.map +1 -0
  39. package/dist/testing/persona-fixture.d.ts +8 -6
  40. package/dist/testing/persona-fixture.d.ts.map +1 -1
  41. package/dist/testing/persona-fixture.js +8 -6
  42. package/dist/testing/persona-fixture.js.map +1 -1
  43. package/dist/testing/{replay-integration-suite.d.ts → replay-integration-suite.d.mts} +3 -3
  44. package/dist/testing/replay-integration-suite.d.mts.map +1 -0
  45. package/dist/testing/{replay-integration-suite.js → replay-integration-suite.mjs} +11 -14
  46. package/dist/testing/replay-integration-suite.mjs.map +1 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/package.json +40 -20
  49. package/dist/lib/application-answers.d.ts +0 -151
  50. package/dist/lib/application-answers.d.ts.map +0 -1
  51. package/dist/lib/application-answers.js +0 -95
  52. package/dist/lib/application-answers.js.map +0 -1
  53. package/dist/scripts/hca-inbox-poll.d.ts +0 -19
  54. package/dist/scripts/hca-inbox-poll.d.ts.map +0 -1
  55. package/dist/scripts/hca-inbox-poll.js +0 -151
  56. package/dist/scripts/hca-inbox-poll.js.map +0 -1
  57. package/dist/testing/answers-fixture.d.ts +0 -13
  58. package/dist/testing/answers-fixture.d.ts.map +0 -1
  59. package/dist/testing/answers-fixture.js +0 -37
  60. package/dist/testing/answers-fixture.js.map +0 -1
  61. package/dist/testing/contract-parity-suite.d.ts.map +0 -1
  62. package/dist/testing/contract-parity-suite.js.map +0 -1
  63. package/dist/testing/coverage-guard-suite.d.ts.map +0 -1
  64. package/dist/testing/coverage-guard-suite.js.map +0 -1
  65. package/dist/testing/replay-integration-suite.d.ts.map +0 -1
  66. package/dist/testing/replay-integration-suite.js.map +0 -1
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Eliminates the duplicated offline schema-parity scaffold that every contract
4
3
  * parity test repeats: build canonical payload → assert safeParse succeeds →
@@ -6,34 +5,32 @@
6
5
  * issue on the expected path. Mirrors the shape of defineReplayIntegrationSuite
7
6
  * so adding a parity guard for a new site is a one-call drop-in.
8
7
  */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.defineContractParitySuite = defineContractParitySuite;
11
- const vitest_1 = require("vitest");
8
+ import { describe, expect, it } from "vitest";
12
9
  /**
13
10
  * Defines an offline schema-parity suite. Runs unconditionally — no
14
11
  * INTEGRATION environment variable needed. The suite has one accept case and
15
12
  * one `it` per rejection case.
16
13
  */
17
- function defineContractParitySuite(opts) {
14
+ export function defineContractParitySuite(opts) {
18
15
  const { suiteName, plugin, buildPayload, rejectionCases } = opts;
19
16
  const schema = plugin.meta.bodySchema;
20
- (0, vitest_1.describe)(suiteName, () => {
21
- (0, vitest_1.it)("accepts the canonical payload", () => {
17
+ describe(suiteName, () => {
18
+ it("accepts the canonical payload", () => {
22
19
  const result = schema.safeParse(buildPayload());
23
- (0, vitest_1.expect)(result.success, result.success ? "" : JSON.stringify(result.error)).toBe(true);
20
+ expect(result.success, result.success ? "" : JSON.stringify(result.error)).toBe(true);
24
21
  });
25
22
  for (const rc of rejectionCases) {
26
- (0, vitest_1.it)(`rejects: ${rc.name}`, () => {
23
+ it(`rejects: ${rc.name}`, () => {
27
24
  const mutated = rc.mutate({ ...buildPayload() });
28
25
  const result = schema.safeParse(mutated);
29
- (0, vitest_1.expect)(result.success).toBe(false);
26
+ expect(result.success).toBe(false);
30
27
  if (!result.success && rc.expectIssuePath !== undefined) {
31
28
  const path = rc.expectIssuePath;
32
29
  const hit = result.error.issues.find((issue) => path.every((segment) => issue.path.includes(segment)));
33
- (0, vitest_1.expect)(hit, `expected an issue whose path includes ${JSON.stringify(path)}, got: ${JSON.stringify(result.error.issues.map((i) => i.path))}`).toBeDefined();
30
+ expect(hit, `expected an issue whose path includes ${JSON.stringify(path)}, got: ${JSON.stringify(result.error.issues.map((i) => i.path))}`).toBeDefined();
34
31
  }
35
32
  });
36
33
  }
37
34
  });
38
35
  }
39
- //# sourceMappingURL=contract-parity-suite.js.map
36
+ //# sourceMappingURL=contract-parity-suite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-parity-suite.mjs","sourceRoot":"","sources":["../../src/testing/contract-parity-suite.mts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AA4C9C;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgC;IACxE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;IAEtC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;YAChD,MAAM,CACJ,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAE,MAA6B,CAAC,KAAK,CAAC,CAC3E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE;gBAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;oBACxD,MAAM,IAAI,GAAG,EAAE,CAAC,eAAe,CAAC;oBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7C,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CACtD,CAAC;oBACF,MAAM,CACJ,GAAG,EACH,yCAAyC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAChI,CAAC,WAAW,EAAE,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -43,4 +43,4 @@ export interface CoverageGuardSuiteOptions {
43
43
  * baking site-specific logic into the engine helper.
44
44
  */
45
45
  export declare function defineCoverageGuardSuite(opts: CoverageGuardSuiteOptions): void;
46
- //# sourceMappingURL=coverage-guard-suite.d.ts.map
46
+ //# sourceMappingURL=coverage-guard-suite.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-guard-suite.d.mts","sourceRoot":"","sources":["../../src/testing/coverage-guard-suite.mts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CAoB9E"}
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Provides a registry-driven structural coverage guard for site plugins.
4
3
  * Mirrors the registry-first design of the loader: iterates SITE_PLUGINS (or a
@@ -7,11 +6,9 @@
7
6
  * where SITE_PLUGINS ships empty (0 iterations → trivially green); branches that
8
7
  * populate the registry gain coverage automatically.
9
8
  */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.defineCoverageGuardSuite = defineCoverageGuardSuite;
12
- const node_fs_1 = require("node:fs");
13
- const node_path_1 = require("node:path");
14
- const vitest_1 = require("vitest");
9
+ import { existsSync } from "node:fs";
10
+ import { resolve } from "node:path";
11
+ import { describe, expect, it } from "vitest";
15
12
  /**
16
13
  * Defines a registry-driven structural coverage guard. For each plugin in
17
14
  * `opts.plugins`, registers an `it` that asserts
@@ -21,19 +18,19 @@ const vitest_1 = require("vitest");
21
18
  * `it` blocks (e.g. integration test file or replay fixture presence) without
22
19
  * baking site-specific logic into the engine helper.
23
20
  */
24
- function defineCoverageGuardSuite(opts) {
21
+ export function defineCoverageGuardSuite(opts) {
25
22
  const { suiteName, plugins, sitesDir, extraAssertions } = opts;
26
23
  if (plugins.length === 0)
27
24
  return;
28
- (0, vitest_1.describe)(suiteName, () => {
25
+ describe(suiteName, () => {
29
26
  for (const plugin of plugins) {
30
27
  const { siteId } = plugin.meta;
31
- const pluginDir = (0, node_path_1.resolve)(sitesDir, siteId);
32
- (0, vitest_1.it)(`${siteId}: contract.parity.test.ts exists`, () => {
33
- (0, vitest_1.expect)((0, node_fs_1.existsSync)((0, node_path_1.resolve)(pluginDir, "contract.parity.test.ts")), `${siteId}/contract.parity.test.ts must exist`).toBe(true);
28
+ const pluginDir = resolve(sitesDir, siteId);
29
+ it(`${siteId}: contract.parity.test.ts exists`, () => {
30
+ expect(existsSync(resolve(pluginDir, "contract.parity.test.ts")), `${siteId}/contract.parity.test.ts must exist`).toBe(true);
34
31
  });
35
32
  extraAssertions?.(pluginDir, siteId);
36
33
  }
37
34
  });
38
35
  }
39
- //# sourceMappingURL=coverage-guard-suite.js.map
36
+ //# sourceMappingURL=coverage-guard-suite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-guard-suite.mjs","sourceRoot":"","sources":["../../src/testing/coverage-guard-suite.mts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AA6B9C;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA+B;IACtE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE5C,EAAE,CAAC,GAAG,MAAM,kCAAkC,EAAE,GAAG,EAAE;gBACnD,MAAM,CACJ,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC,EACzD,GAAG,MAAM,qCAAqC,CAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -13,14 +13,16 @@ export declare const TEST_PERSONA: {
13
13
  readonly FirstName: "Reginald";
14
14
  readonly LastName: "Reconaldo";
15
15
  /**
16
- * Avoid both the 555 fictional range AND famously-fictional numbers like
17
- * 310-867-5309 ("Jenny / 867-5309" pop-song). Some ATS phone-input
18
- * widgets reject both with "Please provide correct phone number."
16
+ * 555-0100..555-0199 is the only NANP range reserved for fiction, so this
17
+ * number reaches no real person unlike a plausible-looking area-code/NXX
18
+ * pair, which is assignable and would send test traffic to a stranger.
19
19
  *
20
- * 208-377-2156: Boise area code, random NXX-XXXX, no known
21
- * pop-culture meaning.
20
+ * Avoid famously-fictional numbers like 310-867-5309 ("Jenny" pop-song):
21
+ * some ATS phone widgets reject those with "Please provide correct phone
22
+ * number." If a widget rejects this 555-01XX form too, prefer a number the
23
+ * project controls over reverting to a real one.
22
24
  */
23
- readonly Phone: "+1 208-377-2156";
25
+ readonly Phone: "+1 208-555-0142";
24
26
  readonly Address: {
25
27
  readonly Line1: "123 Test Lane";
26
28
  readonly City: "Austin";
@@ -1 +1 @@
1
- {"version":3,"file":"persona-fixture.d.ts","sourceRoot":"","sources":["../../src/testing/persona-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY;;;IAGvB;;;;;;;OAOG;;;;;QAKD,gEAAgE;;QAEhE,6EAA6E;;;QAG7E;gEACwD;;QAExD,yDAAyD;;QAEzD,iDAAiD;;;IAGnD;;;;OAIG;;;IAGH,gFAAgF;;;;;;;;;IAUhF,qFAAqF;;;;;;;;;;;;;;;;;IAqBrF,yDAAyD;;CAEjD,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC"}
1
+ {"version":3,"file":"persona-fixture.d.ts","sourceRoot":"","sources":["../../src/testing/persona-fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY;;;IAGvB;;;;;;;;;OASG;;;;;QAKD,gEAAgE;;QAEhE,6EAA6E;;;QAG7E;gEACwD;;QAExD,yDAAyD;;QAEzD,iDAAiD;;;IAGnD;;;;OAIG;;;IAGH,gFAAgF;;;;;;;;;IAUhF,qFAAqF;;;;;;;;;;;;;;;;;IAqBrF,yDAAyD;;CAEjD,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC"}
@@ -16,14 +16,16 @@ exports.TEST_PERSONA = {
16
16
  FirstName: "Reginald",
17
17
  LastName: "Reconaldo",
18
18
  /**
19
- * Avoid both the 555 fictional range AND famously-fictional numbers like
20
- * 310-867-5309 ("Jenny / 867-5309" pop-song). Some ATS phone-input
21
- * widgets reject both with "Please provide correct phone number."
19
+ * 555-0100..555-0199 is the only NANP range reserved for fiction, so this
20
+ * number reaches no real person unlike a plausible-looking area-code/NXX
21
+ * pair, which is assignable and would send test traffic to a stranger.
22
22
  *
23
- * 208-377-2156: Boise area code, random NXX-XXXX, no known
24
- * pop-culture meaning.
23
+ * Avoid famously-fictional numbers like 310-867-5309 ("Jenny" pop-song):
24
+ * some ATS phone widgets reject those with "Please provide correct phone
25
+ * number." If a widget rejects this 555-01XX form too, prefer a number the
26
+ * project controls over reverting to a real one.
25
27
  */
26
- Phone: "+1 208-377-2156",
28
+ Phone: "+1 208-555-0142",
27
29
  Address: {
28
30
  Line1: "123 Test Lane",
29
31
  City: "Austin",
@@ -1 +1 @@
1
- {"version":3,"file":"persona-fixture.js","sourceRoot":"","sources":["../../src/testing/persona-fixture.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACU,QAAA,YAAY,GAAG;IAC1B,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,WAAW;IACrB;;;;;;;OAOG;IACH,KAAK,EAAE,iBAAiB;IACxB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,QAAQ;QACd,gEAAgE;QAChE,iBAAiB,EAAE,IAAI;QACvB,6EAA6E;QAC7E,SAAS,EAAE,OAAO;QAClB,UAAU,EAAE,OAAO;QACnB;gEACwD;QACxD,MAAM,EAAE,eAAe;QACvB,yDAAyD;QACzD,WAAW,EAAE,eAAe;QAC5B,iDAAiD;QACjD,WAAW,EAAE,IAAI;KAClB;IACD;;;;OAIG;IACH,GAAG,EAAE,aAAa;IAClB,WAAW,EAAE,YAAY;IACzB,gFAAgF;IAChF,UAAU,EAAE;QACV,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,iBAAiB;QAC/B,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,YAAY;QACrB,mBAAmB,EACjB,8FAA8F;KACjG;IACD,qFAAqF;IACrF,UAAU,EAAE;QACV;YACE,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,2BAA2B;YAClC,KAAK,EAAE,iBAAiB;SACzB;QACD;YACE,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,+BAA+B;YACtC,KAAK,EAAE,iBAAiB;SACzB;QACD;YACE,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,8BAA8B;YACrC,KAAK,EAAE,iBAAiB;SACzB;KACF;IACD,yDAAyD;IACzD,aAAa,EAAE,oBAAoB;CAC3B,CAAC"}
1
+ {"version":3,"file":"persona-fixture.js","sourceRoot":"","sources":["../../src/testing/persona-fixture.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACU,QAAA,YAAY,GAAG;IAC1B,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,WAAW;IACrB;;;;;;;;;OASG;IACH,KAAK,EAAE,iBAAiB;IACxB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,QAAQ;QACd,gEAAgE;QAChE,iBAAiB,EAAE,IAAI;QACvB,6EAA6E;QAC7E,SAAS,EAAE,OAAO;QAClB,UAAU,EAAE,OAAO;QACnB;gEACwD;QACxD,MAAM,EAAE,eAAe;QACvB,yDAAyD;QACzD,WAAW,EAAE,eAAe;QAC5B,iDAAiD;QACjD,WAAW,EAAE,IAAI;KAClB;IACD;;;;OAIG;IACH,GAAG,EAAE,aAAa;IAClB,WAAW,EAAE,YAAY;IACzB,gFAAgF;IAChF,UAAU,EAAE;QACV,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,iBAAiB;QAC/B,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,YAAY;QACrB,mBAAmB,EACjB,8FAA8F;KACjG;IACD,qFAAqF;IACrF,UAAU,EAAE;QACV;YACE,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,2BAA2B;YAClC,KAAK,EAAE,iBAAiB;SACzB;QACD;YACE,SAAS,EAAE,OAAO;YAClB,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,+BAA+B;YACtC,KAAK,EAAE,iBAAiB;SACzB;QACD;YACE,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,8BAA8B;YACrC,KAAK,EAAE,iBAAiB;SACzB;KACF;IACD,yDAAyD;IACzD,aAAa,EAAE,oBAAoB;CAC3B,CAAC"}
@@ -5,8 +5,8 @@
5
5
  * the generic scaffold (file load, INTEGRATION gate, fan-out, default assertion)
6
6
  * lives here once.
7
7
  */
8
- import type { SitePlugin } from "../site-plugin";
9
- import type { PollTestmailInboxOptions, TestmailInbox, TestmailMessage } from "../testmail/client";
8
+ import type { SitePlugin } from "../site-plugin.js";
9
+ import type { PollTestmailInboxOptions, TestmailInbox, TestmailMessage } from "../testmail/client.js";
10
10
  /** Job source: either a pre-loaded array or a path resolved relative to the caller's directory. */
11
11
  type JobsSource<TJob> = {
12
12
  jobs: TJob[];
@@ -47,4 +47,4 @@ export interface ReplayIntegrationSuiteOptions<TJob> {
47
47
  */
48
48
  export declare function defineReplayIntegrationSuite<TJob extends object>(source: JobsSource<TJob>, opts: ReplayIntegrationSuiteOptions<TJob>): void;
49
49
  export {};
50
- //# sourceMappingURL=replay-integration-suite.d.ts.map
50
+ //# sourceMappingURL=replay-integration-suite.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-integration-suite.d.mts","sourceRoot":"","sources":["../../src/testing/replay-integration-suite.mts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EACV,wBAAwB,EACxB,aAAa,EACb,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAI9B,mGAAmG;AACnG,KAAK,UAAU,CAAC,IAAI,IAAI;IAAE,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF;;;GAGG;AACH,MAAM,WAAW,6BAA6B,CAAC,IAAI;IACjD,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACtE;;;OAGG;IACH,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;IAC3D;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,SAAS,MAAM,EAC9D,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EACxB,IAAI,EAAE,6BAA6B,CAAC,IAAI,CAAC,GACxC,IAAI,CA0BN"}
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  /**
3
2
  * Eliminates the repeated describe.skipIf / it.each / runIntegrationJob /
4
3
  * message.subject assertion that every replay-based integration test duplicates.
@@ -6,28 +5,26 @@
6
5
  * the generic scaffold (file load, INTEGRATION gate, fan-out, default assertion)
7
6
  * lives here once.
8
7
  */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.defineReplayIntegrationSuite = defineReplayIntegrationSuite;
11
- const node_fs_1 = require("node:fs");
12
- const node_path_1 = require("node:path");
13
- const vitest_1 = require("vitest");
14
- const integration_runner_1 = require("../testing/integration-runner");
8
+ import { readFileSync } from "node:fs";
9
+ import { resolve } from "node:path";
10
+ import { describe, expect, it } from "vitest";
11
+ import { runIntegrationJob } from "../testing/integration-runner.js";
15
12
  const DEFAULT_TIMEOUT_MS = 600_000;
16
13
  /**
17
14
  * Defines a replay-driven integration suite. Pass a `jobs` array or a
18
15
  * `jobsPath`+`dirname` pair — the file is read and JSON-parsed at suite
19
16
  * definition time. The suite is skipped unless `INTEGRATION=true`.
20
17
  */
21
- function defineReplayIntegrationSuite(source, opts) {
18
+ export function defineReplayIntegrationSuite(source, opts) {
22
19
  const { suiteName, plugin, buildPayload, assertMessage, pollFn } = opts;
23
20
  const jobs = "jobs" in source
24
21
  ? source.jobs
25
- : JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.resolve)(source.dirname, source.jobsPath), "utf8"));
26
- vitest_1.describe.skipIf(process.env.INTEGRATION !== "true")(suiteName, () => {
27
- vitest_1.it.each(jobs)(`submits job and receives confirmation email`, {
22
+ : JSON.parse(readFileSync(resolve(source.dirname, source.jobsPath), "utf8"));
23
+ describe.skipIf(process.env.INTEGRATION !== "true")(suiteName, () => {
24
+ it.each(jobs)(`submits job and receives confirmation email`, {
28
25
  timeout: DEFAULT_TIMEOUT_MS,
29
26
  }, async (job) => {
30
- const { message } = await (0, integration_runner_1.runIntegrationJob)({
27
+ const { message } = await runIntegrationJob({
31
28
  plugin: plugin,
32
29
  baseUrl: job.baseUrl,
33
30
  buildPayload: (inbox) => buildPayload(job, inbox),
@@ -37,9 +34,9 @@ function defineReplayIntegrationSuite(source, opts) {
37
34
  assertMessage(message, job);
38
35
  }
39
36
  else {
40
- (0, vitest_1.expect)(message.subject).toBeTruthy();
37
+ expect(message.subject).toBeTruthy();
41
38
  }
42
39
  });
43
40
  });
44
41
  }
45
- //# sourceMappingURL=replay-integration-suite.js.map
42
+ //# sourceMappingURL=replay-integration-suite.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-integration-suite.mjs","sourceRoot":"","sources":["../../src/testing/replay-integration-suite.mts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAOpE,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAgCnC;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAAwB,EACxB,IAAyC;IAEzC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExE,MAAM,IAAI,GACR,MAAM,IAAI,MAAM;QACd,CAAC,CAAC,MAAM,CAAC,IAAI;QACb,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC;IAE7F,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,SAAS,EAAE,GAAG,EAAE;QAClE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,6CAA6C,EAAE;YAC3D,OAAO,EAAE,kBAAkB;SAC5B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC;gBAC1C,MAAM,EAAE,MAAiD;gBACzD,OAAO,EAAG,GAA+B,CAAC,OAAiB;gBAC3D,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;gBACjD,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}