@testsmith/api-spector 0.6.2 → 0.6.4

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-Hqh3I3rs.js → request-collection-KGPuvN7o.js} +5 -4
  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 +166 -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 +50 -22
  22. package/out/main/wsdl.js +9 -9
  23. package/out/preload/index.js +1 -1
  24. package/out/renderer/assets/{GraphQLEditor-DtppmZJO.js → GraphQLEditor-Bih8eb_r.js} +6 -6
  25. package/out/renderer/assets/{SoapEditor-BwSm12wH.js → SoapEditor-D1sQKu7l.js} +3 -3
  26. package/out/renderer/assets/{index-D6-zmXen.js → index-vEDOfWlE.js} +418 -279
  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-Hqh3I3rs.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(),
@@ -36,6 +35,9 @@ function buildJsonReport(results, summary, meta = {}) {
36
35
  method: r.method,
37
36
  url: r.resolvedUrl,
38
37
  status: r.status,
38
+ // Tree position: which collection and folder path this request sits under.
39
+ collection: r.collection ?? meta.collection ?? null,
40
+ folderPath: r.scopePath ?? [],
39
41
  isHook: r.isHook ?? false,
40
42
  hookType: r.hookType ?? null,
41
43
  httpStatus: r.httpStatus ?? null,
@@ -76,12 +78,26 @@ function buildHtmlReport(results, summary, meta = {}) {
76
78
  after: "AFTER",
77
79
  afterAll: "AFTER ALL"
78
80
  };
79
- let lastScopeKey = null;
81
+ let lastCollection = null;
82
+ let lastPath = [];
80
83
  const cards = results.map((r, idx) => {
81
- const scopeKey = (r.scopePath ?? []).join(" / ");
82
- const groupHeading = scopeKey && scopeKey !== lastScopeKey ? ` <div class="scope-heading">${esc(scopeKey)}</div>
83
- ` : "";
84
- lastScopeKey = scopeKey;
84
+ let groupHeading = "";
85
+ const coll = r.collection ?? meta.collection ?? "";
86
+ if (coll && coll !== lastCollection) {
87
+ groupHeading += ` <div class="scope-heading lvl-0">${esc(coll)}</div>
88
+ `;
89
+ lastCollection = coll;
90
+ lastPath = [];
91
+ }
92
+ const path2 = r.scopePath ?? [];
93
+ let diverge = 0;
94
+ while (diverge < path2.length && diverge < lastPath.length && path2[diverge] === lastPath[diverge]) diverge++;
95
+ for (let d = diverge; d < path2.length; d++) {
96
+ groupHeading += ` <div class="scope-heading lvl-${Math.min(d + 1, 6)}">${esc(path2[d])}</div>
97
+ `;
98
+ }
99
+ lastPath = path2;
100
+ const cardIndent = `lvl-${Math.min(path2.length + 1, 6)}`;
85
101
  const statusCls = r.status === "passed" ? "badge-pass" : r.status === "failed" ? "badge-fail" : r.status === "skipped" ? "badge-skip" : "badge-err";
86
102
  const httpCls = r.httpStatus && r.httpStatus < 300 ? "http-ok" : r.httpStatus && r.httpStatus < 400 ? "http-redir" : "http-err";
87
103
  const dur = r.durationMs != null ? `${r.durationMs} ms` : "—";
@@ -121,7 +137,7 @@ function buildHtmlReport(results, summary, meta = {}) {
121
137
  </div>` : "";
122
138
  const hookCls = hookLabel ? r.hookType?.startsWith("before") ? "card-hook-before" : "card-hook-after" : "";
123
139
  return `${groupHeading}
124
- <div class="card ${hookCls}" id="r${idx}">
140
+ <div class="card ${hookCls} ${cardIndent}" id="r${idx}">
125
141
  <div class="card-header" onclick="toggle(${idx})">
126
142
  <span class="chevron" id="ch${idx}">▶</span>
127
143
  <span class="badge ${statusCls}">${r.status}</span>
@@ -192,8 +208,18 @@ function buildHtmlReport(results, summary, meta = {}) {
192
208
  .stat-skip .stat-val { color: var(--text-muted); }
193
209
  /* Cards */
194
210
  .card { border: 1px solid var(--border); border-radius: 8px; margin-bottom: 8px; overflow: hidden; }
195
- .scope-heading { margin: 18px 0 6px; padding: 4px 2px; font-size: 11px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; border-bottom: 1px solid var(--border); }
211
+ .scope-heading { margin: 14px 0 6px; padding: 4px 2px; font-size: 11px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; border-bottom: 1px solid var(--border); }
196
212
  .scope-heading::before { content: "\\25B8 "; color: var(--text-dim); }
213
+ /* Nested tree indentation: collection (lvl-0) → folders (lvl-1..) → request card. */
214
+ .lvl-0 { margin-left: 0; }
215
+ .lvl-1 { margin-left: 16px; }
216
+ .lvl-2 { margin-left: 32px; }
217
+ .lvl-3 { margin-left: 48px; }
218
+ .lvl-4 { margin-left: 64px; }
219
+ .lvl-5 { margin-left: 80px; }
220
+ .lvl-6 { margin-left: 96px; }
221
+ .scope-heading.lvl-0 { font-size: 13px; color: var(--text); text-transform: none; letter-spacing: 0; margin-top: 22px; }
222
+ .scope-heading.lvl-0::before { content: "\\1F5C0 "; }
197
223
  .card-header { display: flex; align-items: baseline; gap: 8px; padding: 10px 14px; cursor: pointer; user-select: none; }
198
224
  .card-header:hover { background: var(--bg-surface); }
199
225
  .chevron { font-size: 10px; color: var(--text-muted); min-width: 10px; transition: transform .15s; }
@@ -311,7 +337,7 @@ function buildJUnitReport(results, summary, meta = {}) {
311
337
  const label = r.iterationLabel ? ` #${r.iterationLabel}` : "";
312
338
  const hookPrefix = r.isHook && r.hookType ? `[${HOOK_JUNIT_LABELS[r.hookType] ?? "Hook"}] ` : "";
313
339
  const name = esc(hookPrefix + r.name + label);
314
- const classname = esc(`${r.method} ${r.resolvedUrl}`);
340
+ const classname = esc([r.collection ?? meta.collection, ...r.scopePath ?? []].filter(Boolean).map((s) => String(s).replaceAll(".", "_")).join(".") || "API Tests");
315
341
  const timeSec = ((r.durationMs ?? 0) / 1e3).toFixed(3);
316
342
  const failures = [];
317
343
  if (r.status === "error") {
@@ -469,7 +495,7 @@ async function main() {
469
495
  } else if (!envName && workspace.settings?.defaultEnvironment && !env) {
470
496
  console.warn(cliCommon.color(`Warning: default environment "${workspace.settings.defaultEnvironment}" not found. Running without environment.`, cliCommon.C.yellow));
471
497
  }
472
- const version = `v${"0.6.2"}`;
498
+ const version = `v${"0.6.4"}`;
473
499
  console.log("");
474
500
  console.log(cliCommon.color(" API Test Runner" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
475
501
  console.log(cliCommon.color(` Workspace: ${wsPath}`, cliCommon.C.gray));
@@ -528,7 +554,7 @@ async function main() {
528
554
  if (!firstColName) firstColName = col.name;
529
555
  let runEnvVars = await requestExec.buildEnvVars(env);
530
556
  let runGlobals = requestExec.getGlobals();
531
- let runCollectionVars = { ...col.collectionVariables ?? {} };
557
+ let runCollectionVars = { ...col.collectionVariables };
532
558
  let runLocalVars = {};
533
559
  console.log(cliCommon.color(` ┌ ${col.name}`, cliCommon.C.bold, cliCommon.C.white));
534
560
  const workspaceTls = workspace.settings?.tls;
@@ -569,6 +595,7 @@ async function main() {
569
595
  isHook,
570
596
  hookType,
571
597
  scopeId,
598
+ collection: item.collection,
572
599
  scopePath: item.scopePath,
573
600
  iterationLabel: item.iterationLabel
574
601
  };
@@ -578,7 +605,7 @@ async function main() {
578
605
  collectionVars: { ...item.collectionVars, ...runCollectionVars },
579
606
  envVars: runEnvVars,
580
607
  globals: runGlobals,
581
- localVars: { ...runLocalVars, ...item.dataRow ?? {} },
608
+ localVars: { ...runLocalVars, ...item.dataRow },
582
609
  dispatcher,
583
610
  piiMaskPatterns: piiPatterns,
584
611
  tls: effectiveTls,
@@ -594,6 +621,7 @@ async function main() {
594
621
  result.isHook = isHook;
595
622
  result.hookType = hookType;
596
623
  result.scopeId = scopeId;
624
+ result.collection = item.collection;
597
625
  result.scopePath = item.scopePath;
598
626
  result.iterationLabel = item.iterationLabel;
599
627
  skipTracker.recordResult(item, result.status);
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-D6-zmXen.js";
2
+ import { u as useT, a as useStore, b as useActiveEnvironment } from "./index-vEDOfWlE.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-D6-zmXen.js";
2
+ import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-vEDOfWlE.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
  {