@testsmith/api-spector 0.6.3 → 0.6.5

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 (29) hide show
  1. package/out/main/agents.js +5 -5
  2. package/out/main/chunks/{broker-client-WEymdqAK.js → broker-client-CvRuiX3o.js} +26 -23
  3. package/out/main/chunks/{cli-common-vASoDfQH.js → cli-common-Cq_cphpZ.js} +4 -4
  4. package/out/main/chunks/{coverage-C54mZEh_.js → coverage-C0U4QM83.js} +8 -10
  5. package/out/main/chunks/{data-files-Br2h3Dt2.js → data-files-BYqhsoPe.js} +4 -4
  6. package/out/main/chunks/escape-DDVAlOvZ.js +9 -0
  7. package/out/main/chunks/{import-DdXhO56X.js → import-DYssQzex.js} +4 -4
  8. package/out/main/chunks/{mock-server-BxiXhP1m.js → mock-server-C4kTFkod.js} +9 -11
  9. package/out/main/chunks/{recorder-0Ij921El.js → recorder-BkO8G_mB.js} +2 -2
  10. package/out/main/chunks/{request-collection-GzK4QgvT.js → request-collection-KGPuvN7o.js} +2 -2
  11. package/out/main/chunks/{request-exec-DAFA6Fap.js → request-exec-BRmVweue.js} +41 -41
  12. package/out/main/chunks/{soap-handler-BAPCALkN.js → soap-handler-BznuMFIP.js} +7 -9
  13. package/out/main/compare.js +10 -10
  14. package/out/main/contract.js +18 -20
  15. package/out/main/coverage.js +7 -7
  16. package/out/main/generate-tests.js +9 -9
  17. package/out/main/index.js +163 -263
  18. package/out/main/lib.js +6 -7
  19. package/out/main/mock.js +8 -8
  20. package/out/main/record.js +9 -9
  21. package/out/main/runner.js +14 -15
  22. package/out/main/wsdl.js +9 -9
  23. package/out/preload/index.js +1 -1
  24. package/out/renderer/assets/{GraphQLEditor-MImdgXb4.js → GraphQLEditor-u5atf7vH.js} +6 -6
  25. package/out/renderer/assets/{SoapEditor-rxb3heue.js → SoapEditor-D8MpL0vd.js} +3 -3
  26. package/out/renderer/assets/{index-ByGIqJ2H.js → index-C0kKFo3R.js} +380 -269
  27. package/out/renderer/index.html +1 -1
  28. package/package.json +1 -1
  29. package/out/main/chunks/escape-BwPM4Tf6.js +0 -9
package/out/main/lib.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const mockServer = require("./chunks/mock-server-BxiXhP1m.js");
4
- const requestExec = require("./chunks/request-exec-DAFA6Fap.js");
5
- require("http");
6
- require("crypto");
7
- require("vm");
3
+ const mockServer = require("./chunks/mock-server-C4kTFkod.js");
4
+ const requestExec = require("./chunks/request-exec-BRmVweue.js");
5
+ require("node:http");
6
+ require("node:crypto");
7
+ require("node:vm");
8
8
  require("dayjs");
9
9
  require("@xmldom/xmldom");
10
10
  require("undici");
@@ -14,8 +14,7 @@ require("./chunks/handle-CL-nWtYA.js");
14
14
  require("node:fs");
15
15
  require("node:os");
16
16
  require("node:path");
17
- require("node:crypto");
18
- require("path");
17
+ require("node:fs/promises");
19
18
  require("tv4");
20
19
  require("jsonpath-plus");
21
20
  require("ajv");
package/out/main/mock.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- const mockServer = require("./chunks/mock-server-BxiXhP1m.js");
4
- const cliCommon = require("./chunks/cli-common-vASoDfQH.js");
5
- require("http");
6
- require("crypto");
7
- require("vm");
3
+ const mockServer = require("./chunks/mock-server-C4kTFkod.js");
4
+ const cliCommon = require("./chunks/cli-common-Cq_cphpZ.js");
5
+ require("node:http");
6
+ require("node:crypto");
7
+ require("node:vm");
8
8
  require("dayjs");
9
9
  require("@xmldom/xmldom");
10
- require("fs/promises");
11
- require("path");
12
- require("./chunks/data-files-Br2h3Dt2.js");
10
+ require("node:fs/promises");
11
+ require("node:path");
12
+ require("./chunks/data-files-BYqhsoPe.js");
13
13
  async function main() {
14
14
  const args = cliCommon.parseArgs(process.argv.slice(2), ["name"]);
15
15
  if (args.help) {
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- const promises = require("fs/promises");
4
- const path = require("path");
5
- const recorder = require("./chunks/recorder-0Ij921El.js");
6
- const cliCommon = require("./chunks/cli-common-vASoDfQH.js");
7
- require("http");
8
- require("crypto");
3
+ const promises = require("node:fs/promises");
4
+ const path = require("node:path");
5
+ const recorder = require("./chunks/recorder-BkO8G_mB.js");
6
+ const cliCommon = require("./chunks/cli-common-Cq_cphpZ.js");
7
+ require("node:http");
8
+ require("node:crypto");
9
9
  require("undici");
10
- require("./chunks/data-files-Br2h3Dt2.js");
10
+ require("./chunks/data-files-BYqhsoPe.js");
11
11
  function methodBadge(method) {
12
12
  const m = method.toUpperCase();
13
13
  const c = m === "GET" ? cliCommon.C.green : m === "POST" ? cliCommon.C.cyan : m === "PUT" || m === "PATCH" ? cliCommon.C.yellow : m === "DELETE" ? cliCommon.C.red : cliCommon.C.white;
@@ -26,7 +26,7 @@ async function main() {
26
26
  console.error(cliCommon.color("Error: --upstream <url> is required", cliCommon.C.red));
27
27
  process.exit(1);
28
28
  }
29
- const port = parseInt(args.port ?? "4001", 10);
29
+ const port = Number.parseInt(args.port ?? "4001", 10);
30
30
  const outputDir = path.resolve(args.output ?? "./recordings");
31
31
  const extraMask = Array.isArray(args.mask) ? args.mask : args.mask ? [args.mask] : [];
32
32
  const extraIgnore = Array.isArray(args.ignore) ? args.ignore : args.ignore ? [args.ignore] : [];
@@ -54,7 +54,7 @@ async function main() {
54
54
  process.exit(0);
55
55
  }
56
56
  await promises.mkdir(outputDir, { recursive: true });
57
- const slug = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
57
+ const slug = (/* @__PURE__ */ new Date()).toISOString().replaceAll(/[:.]/g, "-").slice(0, 19);
58
58
  const sessionPath = path.join(outputDir, `session-${slug}.recording.json`);
59
59
  await promises.writeFile(sessionPath, JSON.stringify(session, null, 2), "utf8");
60
60
  const mockName = `Recorded - ${new URL(upstream).hostname} ${slug}`;
@@ -1,29 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- const promises = require("fs/promises");
4
- const path = require("path");
5
- const requestExec = require("./chunks/request-exec-DAFA6Fap.js");
6
- const escape = require("./chunks/escape-BwPM4Tf6.js");
7
- const requestCollection = require("./chunks/request-collection-GzK4QgvT.js");
3
+ const promises = require("node:fs/promises");
4
+ const path = require("node:path");
5
+ const requestExec = require("./chunks/request-exec-BRmVweue.js");
6
+ const escape = require("./chunks/escape-DDVAlOvZ.js");
7
+ const requestCollection = require("./chunks/request-collection-KGPuvN7o.js");
8
8
  const environments = require("./chunks/environments-iM3SUM-4.js");
9
- const cliCommon = require("./chunks/cli-common-vASoDfQH.js");
9
+ const cliCommon = require("./chunks/cli-common-Cq_cphpZ.js");
10
10
  require("undici");
11
+ require("fs/promises");
11
12
  require("tls");
12
13
  require("./chunks/handle-CL-nWtYA.js");
13
14
  require("node:fs");
14
15
  require("node:os");
15
- require("node:path");
16
16
  require("node:crypto");
17
- require("crypto");
18
17
  require("dayjs");
19
- require("vm");
18
+ require("node:vm");
20
19
  require("tv4");
21
20
  require("jsonpath-plus");
22
21
  require("@xmldom/xmldom");
23
- require("http");
22
+ require("node:http");
24
23
  require("ajv");
25
24
  require("uuid");
26
- require("./chunks/data-files-Br2h3Dt2.js");
25
+ require("./chunks/data-files-BYqhsoPe.js");
27
26
  function buildJsonReport(results, summary, meta = {}) {
28
27
  return JSON.stringify({
29
28
  timestamp: meta.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(),
@@ -338,7 +337,7 @@ function buildJUnitReport(results, summary, meta = {}) {
338
337
  const label = r.iterationLabel ? ` #${r.iterationLabel}` : "";
339
338
  const hookPrefix = r.isHook && r.hookType ? `[${HOOK_JUNIT_LABELS[r.hookType] ?? "Hook"}] ` : "";
340
339
  const name = esc(hookPrefix + r.name + label);
341
- const classname = esc([r.collection ?? meta.collection, ...r.scopePath ?? []].filter(Boolean).map((s) => String(s).replace(/\./g, "_")).join(".") || "API Tests");
340
+ const classname = esc([r.collection ?? meta.collection, ...r.scopePath ?? []].filter(Boolean).map((s) => String(s).replaceAll(".", "_")).join(".") || "API Tests");
342
341
  const timeSec = ((r.durationMs ?? 0) / 1e3).toFixed(3);
343
342
  const failures = [];
344
343
  if (r.status === "error") {
@@ -496,7 +495,7 @@ async function main() {
496
495
  } else if (!envName && workspace.settings?.defaultEnvironment && !env) {
497
496
  console.warn(cliCommon.color(`Warning: default environment "${workspace.settings.defaultEnvironment}" not found. Running without environment.`, cliCommon.C.yellow));
498
497
  }
499
- const version = `v${"0.6.3"}`;
498
+ const version = `v${"0.6.5"}`;
500
499
  console.log("");
501
500
  console.log(cliCommon.color(" API Test Runner" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
502
501
  console.log(cliCommon.color(` Workspace: ${wsPath}`, cliCommon.C.gray));
@@ -555,7 +554,7 @@ async function main() {
555
554
  if (!firstColName) firstColName = col.name;
556
555
  let runEnvVars = await requestExec.buildEnvVars(env);
557
556
  let runGlobals = requestExec.getGlobals();
558
- let runCollectionVars = { ...col.collectionVariables ?? {} };
557
+ let runCollectionVars = { ...col.collectionVariables };
559
558
  let runLocalVars = {};
560
559
  console.log(cliCommon.color(` ┌ ${col.name}`, cliCommon.C.bold, cliCommon.C.white));
561
560
  const workspaceTls = workspace.settings?.tls;
@@ -606,7 +605,7 @@ async function main() {
606
605
  collectionVars: { ...item.collectionVars, ...runCollectionVars },
607
606
  envVars: runEnvVars,
608
607
  globals: runGlobals,
609
- localVars: { ...runLocalVars, ...item.dataRow ?? {} },
608
+ localVars: { ...runLocalVars, ...item.dataRow },
610
609
  dispatcher,
611
610
  piiMaskPatterns: piiPatterns,
612
611
  tls: effectiveTls,
package/out/main/wsdl.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- const promises = require("fs/promises");
4
- const path = require("path");
5
- const https = require("https");
6
- const http = require("http");
7
- const soapHandler = require("./chunks/soap-handler-BAPCALkN.js");
8
- const _import = require("./chunks/import-DdXhO56X.js");
9
- const cliCommon = require("./chunks/cli-common-vASoDfQH.js");
3
+ const promises = require("node:fs/promises");
4
+ const path = require("node:path");
5
+ const https = require("node:https");
6
+ const http = require("node:http");
7
+ const soapHandler = require("./chunks/soap-handler-BznuMFIP.js");
8
+ const _import = require("./chunks/import-DYssQzex.js");
9
+ const cliCommon = require("./chunks/cli-common-Cq_cphpZ.js");
10
10
  require("./chunks/handle-CL-nWtYA.js");
11
11
  require("@xmldom/xmldom");
12
12
  require("uuid");
13
- require("./chunks/data-files-Br2h3Dt2.js");
14
- require("crypto");
13
+ require("./chunks/data-files-BYqhsoPe.js");
14
+ require("node:crypto");
15
15
  function fetchUrl(url) {
16
16
  return new Promise((resolveP, rejectP) => {
17
17
  const lib = url.startsWith("https") ? https : http;
@@ -260,7 +260,7 @@ const api = {
260
260
  /** Remove a secret from the OS keychain. */
261
261
  deleteSecret: (ref) => electron.ipcRenderer.invoke(IPC.secret.delete, ref),
262
262
  /** Optional: generate markdown docs for an item via the configured LLM. */
263
- generateDocs: (input) => electron.ipcRenderer.invoke(IPC.ai.generateDocs, input),
263
+ generateAiDocs: (input) => electron.ipcRenderer.invoke(IPC.ai.generateDocs, input),
264
264
  // ─── Globals ──────────────────────────────────────────────────────────────
265
265
  getGlobals: () => electron.ipcRenderer.invoke(IPC.globals.get),
266
266
  setGlobals: (globals) => electron.ipcRenderer.invoke(IPC.globals.set, globals),
@@ -1,5 +1,5 @@
1
1
  import { l as linter, E as EditorView, L as LanguageSupport, e as LRLanguage, s as styleTags, i as indentNodeProp, f as delimitedIndent, m as foldNodeProp, n as foldInside, S as StateField, p as LRParser, q as StateEffect, u as tags, r as reactExports, j as jsxRuntimeExports, c as ReactCodeMirror, o as oneDark, b as json } from "./codemirror-F6m3Hm1M.js";
2
- import { u as useT, a as useStore, b as useActiveEnvironment } from "./index-ByGIqJ2H.js";
2
+ import { u as useT, a as useStore, b as useActiveEnvironment } from "./index-C0kKFo3R.js";
3
3
  import "./ajv-2MAg6kGF.js";
4
4
  function devAssert(condition, message) {
5
5
  const booleanCondition = Boolean(condition);
@@ -12013,7 +12013,7 @@ function validateQuery(schema, query, variablesJson) {
12013
12013
  } catch {
12014
12014
  }
12015
12015
  const used = /* @__PURE__ */ new Set();
12016
- for (const m of query.matchAll(/\$([A-Za-z_][A-Za-z0-9_]*)/g)) used.add(m[1]);
12016
+ for (const m of query.matchAll(/\$([A-Za-z_]\w*)/g)) used.add(m[1]);
12017
12017
  for (const v of used) {
12018
12018
  if (!(v in provided)) problems.push({ message: `Variable "$${v}" is not set in Variables`, severity: "warning" });
12019
12019
  }
@@ -12253,8 +12253,8 @@ function GraphQLEditor({ request, onChange }) {
12253
12253
  const extraHeaders = {};
12254
12254
  for (const h of request.headers) {
12255
12255
  if (h.enabled && h.key) {
12256
- const key = h.key.replace(/\{\{([^}]+)\}\}/g, (_, k) => resolvedVars[k.trim()] ?? "");
12257
- const val = h.value.replace(/\{\{([^}]+)\}\}/g, (_, k) => resolvedVars[k.trim()] ?? "");
12256
+ const key = h.key.replaceAll(/\{\{([^}]+)\}\}/g, (_, k) => resolvedVars[k.trim()] ?? "");
12257
+ const val = h.value.replaceAll(/\{\{([^}]+)\}\}/g, (_, k) => resolvedVars[k.trim()] ?? "");
12258
12258
  extraHeaders[key] = val;
12259
12259
  }
12260
12260
  }
@@ -12326,12 +12326,12 @@ function GraphQLEditor({ request, onChange }) {
12326
12326
  onClick: () => {
12327
12327
  try {
12328
12328
  const vars = [];
12329
- const safe = gql.query.replace(/\{\{([^}]+)\}\}/g, (_m, v) => {
12329
+ const safe = gql.query.replaceAll(/\{\{([^}]+)\}\}/g, (_m, v) => {
12330
12330
  vars.push(v);
12331
12331
  return `__TPL${vars.length - 1}__`;
12332
12332
  });
12333
12333
  let formatted = print(parse(safe));
12334
- formatted = formatted.replace(/__TPL(\d+)__/g, (_m, i) => `{{${vars[Number(i)]}}}`);
12334
+ formatted = formatted.replaceAll(/__TPL(\d+)__/g, (_m, i) => `{{${vars[Number(i)]}}}`);
12335
12335
  updateGql({ query: formatted });
12336
12336
  } catch {
12337
12337
  }
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, c as ReactCodeMirror, o as oneDark, x as xml } from "./codemirror-F6m3Hm1M.js";
2
- import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-ByGIqJ2H.js";
2
+ import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-C0kKFo3R.js";
3
3
  import "./ajv-2MAg6kGF.js";
4
4
  const SOAP_11_CONTENT_TYPE = "text/xml; charset=utf-8";
5
5
  const SOAP_12_CONTENT_TYPE = "application/soap+xml; charset=utf-8";
@@ -97,7 +97,7 @@ function SoapEditor({ request, onChange }) {
97
97
  }
98
98
  const selected = operations.find((o) => o.name === soap.operationName && (soap.soapVersion === void 0 || o.soapVersion === soap.soapVersion) && (soap.binding === void 0 || (o.binding ?? "") === (soap.binding ?? ""))) ?? operations.find((o) => o.name === soap.operationName) ?? operations[0];
99
99
  const primaryEndpoint = endpoints[0]?.address;
100
- const versions = Array.from(new Set(operations.map((o) => o.soapVersion))).sort();
100
+ const versions = Array.from(new Set(operations.map((o) => o.soapVersion))).sort((a, b) => a.localeCompare(b));
101
101
  const hasSavedSoap = Boolean(soap.envelope?.trim() || soap.operationName || soap.wsdlUrl?.trim());
102
102
  const showFullUi = operations.length > 0;
103
103
  const showFallback = !showFullUi && hasSavedSoap;
@@ -152,7 +152,7 @@ function SoapEditor({ request, onChange }) {
152
152
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-44 shrink-0 flex flex-col bg-surface-900/40 border border-surface-800 rounded-md overflow-hidden", children: [
153
153
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-2.5 py-1.5 text-[9px] uppercase tracking-wider font-semibold text-surface-600 border-b border-surface-800", children: t("Operations") }),
154
154
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-y-auto flex-1", children: operations.map((op) => {
155
- const active = selected && op.name === selected.name && op.soapVersion === selected.soapVersion && (op.binding ?? "") === (selected.binding ?? "");
155
+ const active = op.name === selected?.name && op.soapVersion === selected.soapVersion && (op.binding ?? "") === (selected.binding ?? "");
156
156
  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
157
157
  "button",
158
158
  {