@testsmith/api-spector 0.6.2 → 0.6.3
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/chunks/{request-collection-Hqh3I3rs.js → request-collection-GzK4QgvT.js} +3 -2
- package/out/main/index.js +5 -2
- package/out/main/runner.js +39 -10
- package/out/renderer/assets/{GraphQLEditor-DtppmZJO.js → GraphQLEditor-MImdgXb4.js} +1 -1
- package/out/renderer/assets/{SoapEditor-BwSm12wH.js → SoapEditor-rxb3heue.js} +1 -1
- package/out/renderer/assets/{index-D6-zmXen.js → index-ByGIqJ2H.js} +44 -16
- package/out/renderer/index.html +1 -1
- package/package.json +1 -1
|
@@ -184,8 +184,9 @@ function resolveInheritedAuthAndHeaders(requestId, collection) {
|
|
|
184
184
|
}
|
|
185
185
|
function buildRunPlan(collection, folderId, filterTags) {
|
|
186
186
|
const collectionVars = collection.collectionVariables ?? {};
|
|
187
|
+
const tag = (items) => items.map((i) => ({ ...i, collection: collection.name }));
|
|
187
188
|
{
|
|
188
|
-
return buildFolderPlan(
|
|
189
|
+
return tag(buildFolderPlan(
|
|
189
190
|
collection.rootFolder,
|
|
190
191
|
collection.requests,
|
|
191
192
|
collectionVars,
|
|
@@ -195,7 +196,7 @@ function buildRunPlan(collection, folderId, filterTags) {
|
|
|
195
196
|
[],
|
|
196
197
|
[],
|
|
197
198
|
true
|
|
198
|
-
);
|
|
199
|
+
));
|
|
199
200
|
}
|
|
200
201
|
}
|
|
201
202
|
function expandRunPlanWithData(items, ds) {
|
package/out/main/index.js
CHANGED
|
@@ -34,7 +34,7 @@ const ipcValidate = require("./chunks/ipc-validate-sqUFqRmE.js");
|
|
|
34
34
|
const uuid = require("uuid");
|
|
35
35
|
const jsYaml = require("js-yaml");
|
|
36
36
|
const undici = require("undici");
|
|
37
|
-
const requestCollection = require("./chunks/request-collection-
|
|
37
|
+
const requestCollection = require("./chunks/request-collection-GzK4QgvT.js");
|
|
38
38
|
const mockServer = require("./chunks/mock-server-BxiXhP1m.js");
|
|
39
39
|
const http = require("http");
|
|
40
40
|
const WebSocket = require("ws");
|
|
@@ -4686,6 +4686,7 @@ function registerRunnerHandler(ipc) {
|
|
|
4686
4686
|
isHook: item.isHook,
|
|
4687
4687
|
hookType: item.hookType,
|
|
4688
4688
|
scopeId: item.scopeId,
|
|
4689
|
+
collection: item.collection,
|
|
4689
4690
|
scopePath: item.scopePath,
|
|
4690
4691
|
iterationLabel: item.iterationLabel
|
|
4691
4692
|
};
|
|
@@ -4699,6 +4700,7 @@ function registerRunnerHandler(ipc) {
|
|
|
4699
4700
|
isHook: item.isHook,
|
|
4700
4701
|
hookType: item.hookType,
|
|
4701
4702
|
scopeId: item.scopeId,
|
|
4703
|
+
collection: item.collection,
|
|
4702
4704
|
scopePath: item.scopePath
|
|
4703
4705
|
};
|
|
4704
4706
|
event.sender.send(handle.IPC.runner.progress, { requestId: item.request.id, ...runningUpdate });
|
|
@@ -4730,6 +4732,7 @@ function registerRunnerHandler(ipc) {
|
|
|
4730
4732
|
isHook: item.isHook,
|
|
4731
4733
|
hookType: item.hookType,
|
|
4732
4734
|
scopeId: item.scopeId,
|
|
4735
|
+
collection: item.collection,
|
|
4733
4736
|
scopePath: item.scopePath
|
|
4734
4737
|
});
|
|
4735
4738
|
if (requestDelay > 0 && item !== items[items.length - 1]) {
|
|
@@ -6039,7 +6042,7 @@ function isNewer(a, b) {
|
|
|
6039
6042
|
return a2 > b2;
|
|
6040
6043
|
}
|
|
6041
6044
|
async function checkForUpdate() {
|
|
6042
|
-
const current = "0.6.
|
|
6045
|
+
const current = "0.6.3";
|
|
6043
6046
|
try {
|
|
6044
6047
|
const res = await fetch(REGISTRY_URL, { signal: AbortSignal.timeout(4e3) });
|
|
6045
6048
|
if (!res.ok) return null;
|
package/out/main/runner.js
CHANGED
|
@@ -4,7 +4,7 @@ const promises = require("fs/promises");
|
|
|
4
4
|
const path = require("path");
|
|
5
5
|
const requestExec = require("./chunks/request-exec-DAFA6Fap.js");
|
|
6
6
|
const escape = require("./chunks/escape-BwPM4Tf6.js");
|
|
7
|
-
const requestCollection = require("./chunks/request-collection-
|
|
7
|
+
const requestCollection = require("./chunks/request-collection-GzK4QgvT.js");
|
|
8
8
|
const environments = require("./chunks/environments-iM3SUM-4.js");
|
|
9
9
|
const cliCommon = require("./chunks/cli-common-vASoDfQH.js");
|
|
10
10
|
require("undici");
|
|
@@ -36,6 +36,9 @@ function buildJsonReport(results, summary, meta = {}) {
|
|
|
36
36
|
method: r.method,
|
|
37
37
|
url: r.resolvedUrl,
|
|
38
38
|
status: r.status,
|
|
39
|
+
// Tree position: which collection and folder path this request sits under.
|
|
40
|
+
collection: r.collection ?? meta.collection ?? null,
|
|
41
|
+
folderPath: r.scopePath ?? [],
|
|
39
42
|
isHook: r.isHook ?? false,
|
|
40
43
|
hookType: r.hookType ?? null,
|
|
41
44
|
httpStatus: r.httpStatus ?? null,
|
|
@@ -76,12 +79,26 @@ function buildHtmlReport(results, summary, meta = {}) {
|
|
|
76
79
|
after: "AFTER",
|
|
77
80
|
afterAll: "AFTER ALL"
|
|
78
81
|
};
|
|
79
|
-
let
|
|
82
|
+
let lastCollection = null;
|
|
83
|
+
let lastPath = [];
|
|
80
84
|
const cards = results.map((r, idx) => {
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
let groupHeading = "";
|
|
86
|
+
const coll = r.collection ?? meta.collection ?? "";
|
|
87
|
+
if (coll && coll !== lastCollection) {
|
|
88
|
+
groupHeading += ` <div class="scope-heading lvl-0">${esc(coll)}</div>
|
|
89
|
+
`;
|
|
90
|
+
lastCollection = coll;
|
|
91
|
+
lastPath = [];
|
|
92
|
+
}
|
|
93
|
+
const path2 = r.scopePath ?? [];
|
|
94
|
+
let diverge = 0;
|
|
95
|
+
while (diverge < path2.length && diverge < lastPath.length && path2[diverge] === lastPath[diverge]) diverge++;
|
|
96
|
+
for (let d = diverge; d < path2.length; d++) {
|
|
97
|
+
groupHeading += ` <div class="scope-heading lvl-${Math.min(d + 1, 6)}">${esc(path2[d])}</div>
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
lastPath = path2;
|
|
101
|
+
const cardIndent = `lvl-${Math.min(path2.length + 1, 6)}`;
|
|
85
102
|
const statusCls = r.status === "passed" ? "badge-pass" : r.status === "failed" ? "badge-fail" : r.status === "skipped" ? "badge-skip" : "badge-err";
|
|
86
103
|
const httpCls = r.httpStatus && r.httpStatus < 300 ? "http-ok" : r.httpStatus && r.httpStatus < 400 ? "http-redir" : "http-err";
|
|
87
104
|
const dur = r.durationMs != null ? `${r.durationMs} ms` : "—";
|
|
@@ -121,7 +138,7 @@ function buildHtmlReport(results, summary, meta = {}) {
|
|
|
121
138
|
</div>` : "";
|
|
122
139
|
const hookCls = hookLabel ? r.hookType?.startsWith("before") ? "card-hook-before" : "card-hook-after" : "";
|
|
123
140
|
return `${groupHeading}
|
|
124
|
-
<div class="card ${hookCls}" id="r${idx}">
|
|
141
|
+
<div class="card ${hookCls} ${cardIndent}" id="r${idx}">
|
|
125
142
|
<div class="card-header" onclick="toggle(${idx})">
|
|
126
143
|
<span class="chevron" id="ch${idx}">▶</span>
|
|
127
144
|
<span class="badge ${statusCls}">${r.status}</span>
|
|
@@ -192,8 +209,18 @@ function buildHtmlReport(results, summary, meta = {}) {
|
|
|
192
209
|
.stat-skip .stat-val { color: var(--text-muted); }
|
|
193
210
|
/* Cards */
|
|
194
211
|
.card { border: 1px solid var(--border); border-radius: 8px; margin-bottom: 8px; overflow: hidden; }
|
|
195
|
-
.scope-heading { margin:
|
|
212
|
+
.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
213
|
.scope-heading::before { content: "\\25B8 "; color: var(--text-dim); }
|
|
214
|
+
/* Nested tree indentation: collection (lvl-0) → folders (lvl-1..) → request card. */
|
|
215
|
+
.lvl-0 { margin-left: 0; }
|
|
216
|
+
.lvl-1 { margin-left: 16px; }
|
|
217
|
+
.lvl-2 { margin-left: 32px; }
|
|
218
|
+
.lvl-3 { margin-left: 48px; }
|
|
219
|
+
.lvl-4 { margin-left: 64px; }
|
|
220
|
+
.lvl-5 { margin-left: 80px; }
|
|
221
|
+
.lvl-6 { margin-left: 96px; }
|
|
222
|
+
.scope-heading.lvl-0 { font-size: 13px; color: var(--text); text-transform: none; letter-spacing: 0; margin-top: 22px; }
|
|
223
|
+
.scope-heading.lvl-0::before { content: "\\1F5C0 "; }
|
|
197
224
|
.card-header { display: flex; align-items: baseline; gap: 8px; padding: 10px 14px; cursor: pointer; user-select: none; }
|
|
198
225
|
.card-header:hover { background: var(--bg-surface); }
|
|
199
226
|
.chevron { font-size: 10px; color: var(--text-muted); min-width: 10px; transition: transform .15s; }
|
|
@@ -311,7 +338,7 @@ function buildJUnitReport(results, summary, meta = {}) {
|
|
|
311
338
|
const label = r.iterationLabel ? ` #${r.iterationLabel}` : "";
|
|
312
339
|
const hookPrefix = r.isHook && r.hookType ? `[${HOOK_JUNIT_LABELS[r.hookType] ?? "Hook"}] ` : "";
|
|
313
340
|
const name = esc(hookPrefix + r.name + label);
|
|
314
|
-
const classname = esc(
|
|
341
|
+
const classname = esc([r.collection ?? meta.collection, ...r.scopePath ?? []].filter(Boolean).map((s) => String(s).replace(/\./g, "_")).join(".") || "API Tests");
|
|
315
342
|
const timeSec = ((r.durationMs ?? 0) / 1e3).toFixed(3);
|
|
316
343
|
const failures = [];
|
|
317
344
|
if (r.status === "error") {
|
|
@@ -469,7 +496,7 @@ async function main() {
|
|
|
469
496
|
} else if (!envName && workspace.settings?.defaultEnvironment && !env) {
|
|
470
497
|
console.warn(cliCommon.color(`Warning: default environment "${workspace.settings.defaultEnvironment}" not found. Running without environment.`, cliCommon.C.yellow));
|
|
471
498
|
}
|
|
472
|
-
const version = `v${"0.6.
|
|
499
|
+
const version = `v${"0.6.3"}`;
|
|
473
500
|
console.log("");
|
|
474
501
|
console.log(cliCommon.color(" API Test Runner" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
|
|
475
502
|
console.log(cliCommon.color(` Workspace: ${wsPath}`, cliCommon.C.gray));
|
|
@@ -569,6 +596,7 @@ async function main() {
|
|
|
569
596
|
isHook,
|
|
570
597
|
hookType,
|
|
571
598
|
scopeId,
|
|
599
|
+
collection: item.collection,
|
|
572
600
|
scopePath: item.scopePath,
|
|
573
601
|
iterationLabel: item.iterationLabel
|
|
574
602
|
};
|
|
@@ -594,6 +622,7 @@ async function main() {
|
|
|
594
622
|
result.isHook = isHook;
|
|
595
623
|
result.hookType = hookType;
|
|
596
624
|
result.scopeId = scopeId;
|
|
625
|
+
result.collection = item.collection;
|
|
597
626
|
result.scopePath = item.scopePath;
|
|
598
627
|
result.iterationLabel = item.iterationLabel;
|
|
599
628
|
skipTracker.recordResult(item, result.status);
|
|
@@ -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-ByGIqJ2H.js";
|
|
3
3
|
import "./ajv-2MAg6kGF.js";
|
|
4
4
|
function devAssert(condition, message) {
|
|
5
5
|
const booleanCondition = Boolean(condition);
|
|
@@ -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-ByGIqJ2H.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";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphQLEditor-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphQLEditor-MImdgXb4.js","./codemirror-F6m3Hm1M.js","./ajv-2MAg6kGF.js","./SoapEditor-rxb3heue.js"])))=>i.map(i=>d[i]);
|
|
2
2
|
import { r as reactExports, g as getDefaultExportFromCjs, R as React$2, a as autocompletion, h as hoverTooltip, j as jsxRuntimeExports, k as keymap, t as toggleComment, x as xml, b as json, c as ReactCodeMirror, o as oneDark, d as javascript } from "./codemirror-F6m3Hm1M.js";
|
|
3
3
|
import { A as Ajv } from "./ajv-2MAg6kGF.js";
|
|
4
4
|
var client = { exports: {} };
|
|
@@ -25557,8 +25557,9 @@ function resolveInheritedAuthAndHeaders(requestId, collection2) {
|
|
|
25557
25557
|
}
|
|
25558
25558
|
function buildRunPlan(collection2, folderId, filterTags) {
|
|
25559
25559
|
const collectionVars = collection2.collectionVariables ?? {};
|
|
25560
|
+
const tag = (items) => items.map((i) => ({ ...i, collection: collection2.name }));
|
|
25560
25561
|
if (!folderId) {
|
|
25561
|
-
return buildFolderPlan(
|
|
25562
|
+
return tag(buildFolderPlan(
|
|
25562
25563
|
collection2.rootFolder,
|
|
25563
25564
|
collection2.requests,
|
|
25564
25565
|
collectionVars,
|
|
@@ -25568,7 +25569,7 @@ function buildRunPlan(collection2, folderId, filterTags) {
|
|
|
25568
25569
|
[],
|
|
25569
25570
|
[],
|
|
25570
25571
|
true
|
|
25571
|
-
);
|
|
25572
|
+
));
|
|
25572
25573
|
}
|
|
25573
25574
|
const chain = folderChainTo(collection2.rootFolder, folderId);
|
|
25574
25575
|
if (chain.length === 0) return [];
|
|
@@ -25615,7 +25616,7 @@ function buildRunPlan(collection2, folderId, filterTags) {
|
|
|
25615
25616
|
result.push(makeHook(req, collectionVars, "afterAll", f.id, myAncestors, []));
|
|
25616
25617
|
}
|
|
25617
25618
|
}
|
|
25618
|
-
return result;
|
|
25619
|
+
return tag(result);
|
|
25619
25620
|
}
|
|
25620
25621
|
function expandRunPlanWithData(items, ds) {
|
|
25621
25622
|
if (!ds || ds.rows.length === 0) return items;
|
|
@@ -27375,8 +27376,8 @@ function jsonWithComments() {
|
|
|
27375
27376
|
function xmlWithComments() {
|
|
27376
27377
|
return [xml(), commentKeymap];
|
|
27377
27378
|
}
|
|
27378
|
-
const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-
|
|
27379
|
-
const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-
|
|
27379
|
+
const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-MImdgXb4.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
|
|
27380
|
+
const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-rxb3heue.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
|
|
27380
27381
|
function BodyTab({ request: request2, onChange }) {
|
|
27381
27382
|
const t = useT();
|
|
27382
27383
|
const editorFallback = /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 text-xs text-surface-500", children: t("Loading editor…") });
|
|
@@ -32536,7 +32537,7 @@ function WelcomeScreen() {
|
|
|
32536
32537
|
)
|
|
32537
32538
|
] }),
|
|
32538
32539
|
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-surface-400 text-sm max-w-sm", children: t("Local-first API testing with Robot Framework & Playwright code generation. Secrets stay on your machine.") }),
|
|
32539
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t("version :version", { version: "0.6.
|
|
32540
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t("version :version", { version: "0.6.3" }) })
|
|
32540
32541
|
] }),
|
|
32541
32542
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 w-64", children: [
|
|
32542
32543
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
@@ -35440,6 +35441,9 @@ function buildJsonReport(results, summary, meta = {}) {
|
|
|
35440
35441
|
method: r.method,
|
|
35441
35442
|
url: r.resolvedUrl,
|
|
35442
35443
|
status: r.status,
|
|
35444
|
+
// Tree position: which collection and folder path this request sits under.
|
|
35445
|
+
collection: r.collection ?? meta.collection ?? null,
|
|
35446
|
+
folderPath: r.scopePath ?? [],
|
|
35443
35447
|
isHook: r.isHook ?? false,
|
|
35444
35448
|
hookType: r.hookType ?? null,
|
|
35445
35449
|
httpStatus: r.httpStatus ?? null,
|
|
@@ -35480,12 +35484,26 @@ function buildHtmlReport(results, summary, meta = {}) {
|
|
|
35480
35484
|
after: "AFTER",
|
|
35481
35485
|
afterAll: "AFTER ALL"
|
|
35482
35486
|
};
|
|
35483
|
-
let
|
|
35487
|
+
let lastCollection = null;
|
|
35488
|
+
let lastPath = [];
|
|
35484
35489
|
const cards = results.map((r, idx) => {
|
|
35485
|
-
|
|
35486
|
-
const
|
|
35487
|
-
|
|
35488
|
-
|
|
35490
|
+
let groupHeading = "";
|
|
35491
|
+
const coll = r.collection ?? meta.collection ?? "";
|
|
35492
|
+
if (coll && coll !== lastCollection) {
|
|
35493
|
+
groupHeading += ` <div class="scope-heading lvl-0">${esc2(coll)}</div>
|
|
35494
|
+
`;
|
|
35495
|
+
lastCollection = coll;
|
|
35496
|
+
lastPath = [];
|
|
35497
|
+
}
|
|
35498
|
+
const path = r.scopePath ?? [];
|
|
35499
|
+
let diverge = 0;
|
|
35500
|
+
while (diverge < path.length && diverge < lastPath.length && path[diverge] === lastPath[diverge]) diverge++;
|
|
35501
|
+
for (let d = diverge; d < path.length; d++) {
|
|
35502
|
+
groupHeading += ` <div class="scope-heading lvl-${Math.min(d + 1, 6)}">${esc2(path[d])}</div>
|
|
35503
|
+
`;
|
|
35504
|
+
}
|
|
35505
|
+
lastPath = path;
|
|
35506
|
+
const cardIndent = `lvl-${Math.min(path.length + 1, 6)}`;
|
|
35489
35507
|
const statusCls = r.status === "passed" ? "badge-pass" : r.status === "failed" ? "badge-fail" : r.status === "skipped" ? "badge-skip" : "badge-err";
|
|
35490
35508
|
const httpCls = r.httpStatus && r.httpStatus < 300 ? "http-ok" : r.httpStatus && r.httpStatus < 400 ? "http-redir" : "http-err";
|
|
35491
35509
|
const dur = r.durationMs != null ? `${r.durationMs} ms` : "—";
|
|
@@ -35525,7 +35543,7 @@ function buildHtmlReport(results, summary, meta = {}) {
|
|
|
35525
35543
|
</div>` : "";
|
|
35526
35544
|
const hookCls = hookLabel ? r.hookType?.startsWith("before") ? "card-hook-before" : "card-hook-after" : "";
|
|
35527
35545
|
return `${groupHeading}
|
|
35528
|
-
<div class="card ${hookCls}" id="r${idx}">
|
|
35546
|
+
<div class="card ${hookCls} ${cardIndent}" id="r${idx}">
|
|
35529
35547
|
<div class="card-header" onclick="toggle(${idx})">
|
|
35530
35548
|
<span class="chevron" id="ch${idx}">▶</span>
|
|
35531
35549
|
<span class="badge ${statusCls}">${r.status}</span>
|
|
@@ -35596,8 +35614,18 @@ function buildHtmlReport(results, summary, meta = {}) {
|
|
|
35596
35614
|
.stat-skip .stat-val { color: var(--text-muted); }
|
|
35597
35615
|
/* Cards */
|
|
35598
35616
|
.card { border: 1px solid var(--border); border-radius: 8px; margin-bottom: 8px; overflow: hidden; }
|
|
35599
|
-
.scope-heading { margin:
|
|
35617
|
+
.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); }
|
|
35600
35618
|
.scope-heading::before { content: "\\25B8 "; color: var(--text-dim); }
|
|
35619
|
+
/* Nested tree indentation: collection (lvl-0) → folders (lvl-1..) → request card. */
|
|
35620
|
+
.lvl-0 { margin-left: 0; }
|
|
35621
|
+
.lvl-1 { margin-left: 16px; }
|
|
35622
|
+
.lvl-2 { margin-left: 32px; }
|
|
35623
|
+
.lvl-3 { margin-left: 48px; }
|
|
35624
|
+
.lvl-4 { margin-left: 64px; }
|
|
35625
|
+
.lvl-5 { margin-left: 80px; }
|
|
35626
|
+
.lvl-6 { margin-left: 96px; }
|
|
35627
|
+
.scope-heading.lvl-0 { font-size: 13px; color: var(--text); text-transform: none; letter-spacing: 0; margin-top: 22px; }
|
|
35628
|
+
.scope-heading.lvl-0::before { content: "\\1F5C0 "; }
|
|
35601
35629
|
.card-header { display: flex; align-items: baseline; gap: 8px; padding: 10px 14px; cursor: pointer; user-select: none; }
|
|
35602
35630
|
.card-header:hover { background: var(--bg-surface); }
|
|
35603
35631
|
.chevron { font-size: 10px; color: var(--text-muted); min-width: 10px; transition: transform .15s; }
|
|
@@ -35715,7 +35743,7 @@ function buildJUnitReport(results, summary, meta = {}) {
|
|
|
35715
35743
|
const label = r.iterationLabel ? ` #${r.iterationLabel}` : "";
|
|
35716
35744
|
const hookPrefix = r.isHook && r.hookType ? `[${HOOK_JUNIT_LABELS[r.hookType] ?? "Hook"}] ` : "";
|
|
35717
35745
|
const name = esc2(hookPrefix + r.name + label);
|
|
35718
|
-
const classname = esc2(
|
|
35746
|
+
const classname = esc2([r.collection ?? meta.collection, ...r.scopePath ?? []].filter(Boolean).map((s) => String(s).replace(/\./g, "_")).join(".") || "API Tests");
|
|
35719
35747
|
const timeSec = ((r.durationMs ?? 0) / 1e3).toFixed(3);
|
|
35720
35748
|
const failures = [];
|
|
35721
35749
|
if (r.status === "error") {
|
|
@@ -41485,7 +41513,7 @@ function App() {
|
|
|
41485
41513
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#6aa3c8" }, children: "Spector" }),
|
|
41486
41514
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-2 text-[10px] font-normal opacity-50", children: [
|
|
41487
41515
|
"v",
|
|
41488
|
-
"0.6.
|
|
41516
|
+
"0.6.3"
|
|
41489
41517
|
] }),
|
|
41490
41518
|
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mx-2 opacity-30", children: "·" }),
|
|
41491
41519
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
package/out/renderer/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta charset="UTF-8" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>API Spector</title>
|
|
8
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
+
<script type="module" crossorigin src="./assets/index-ByGIqJ2H.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="./assets/codemirror-F6m3Hm1M.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="./assets/ajv-2MAg6kGF.js">
|
|
11
11
|
<link rel="stylesheet" crossorigin href="./assets/index-B3mtLdU3.css">
|