@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.
- package/out/main/agents.js +5 -5
- package/out/main/chunks/{broker-client-WEymdqAK.js → broker-client-CvRuiX3o.js} +26 -23
- package/out/main/chunks/{cli-common-vASoDfQH.js → cli-common-Cq_cphpZ.js} +4 -4
- package/out/main/chunks/{coverage-C54mZEh_.js → coverage-C0U4QM83.js} +8 -10
- package/out/main/chunks/{data-files-Br2h3Dt2.js → data-files-BYqhsoPe.js} +4 -4
- package/out/main/chunks/escape-DDVAlOvZ.js +9 -0
- package/out/main/chunks/{import-DdXhO56X.js → import-DYssQzex.js} +4 -4
- package/out/main/chunks/{mock-server-BxiXhP1m.js → mock-server-C4kTFkod.js} +9 -11
- package/out/main/chunks/{recorder-0Ij921El.js → recorder-BkO8G_mB.js} +2 -2
- package/out/main/chunks/{request-collection-GzK4QgvT.js → request-collection-KGPuvN7o.js} +2 -2
- package/out/main/chunks/{request-exec-DAFA6Fap.js → request-exec-BRmVweue.js} +41 -41
- package/out/main/chunks/{soap-handler-BAPCALkN.js → soap-handler-BznuMFIP.js} +7 -9
- package/out/main/compare.js +10 -10
- package/out/main/contract.js +18 -20
- package/out/main/coverage.js +7 -7
- package/out/main/generate-tests.js +9 -9
- package/out/main/index.js +163 -263
- package/out/main/lib.js +6 -7
- package/out/main/mock.js +8 -8
- package/out/main/record.js +9 -9
- package/out/main/runner.js +14 -15
- package/out/main/wsdl.js +9 -9
- package/out/preload/index.js +1 -1
- package/out/renderer/assets/{GraphQLEditor-MImdgXb4.js → GraphQLEditor-u5atf7vH.js} +6 -6
- package/out/renderer/assets/{SoapEditor-rxb3heue.js → SoapEditor-D8MpL0vd.js} +3 -3
- package/out/renderer/assets/{index-ByGIqJ2H.js → index-C0kKFo3R.js} +380 -269
- package/out/renderer/index.html +1 -1
- package/package.json +1 -1
- 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-
|
|
4
|
-
const requestExec = require("./chunks/request-exec-
|
|
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:
|
|
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-
|
|
4
|
-
const cliCommon = require("./chunks/cli-common-
|
|
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-
|
|
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) {
|
package/out/main/record.js
CHANGED
|
@@ -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-
|
|
6
|
-
const cliCommon = require("./chunks/cli-common-
|
|
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-
|
|
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().
|
|
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}`;
|
package/out/main/runner.js
CHANGED
|
@@ -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-
|
|
6
|
-
const escape = require("./chunks/escape-
|
|
7
|
-
const requestCollection = require("./chunks/request-collection-
|
|
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-
|
|
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-
|
|
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).
|
|
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.
|
|
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-
|
|
8
|
-
const _import = require("./chunks/import-
|
|
9
|
-
const cliCommon = require("./chunks/cli-common-
|
|
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-
|
|
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;
|
package/out/preload/index.js
CHANGED
|
@@ -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
|
-
|
|
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-
|
|
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_]
|
|
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.
|
|
12257
|
-
const val = h.value.
|
|
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.
|
|
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.
|
|
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-
|
|
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 =
|
|
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
|
{
|