@testsmith/api-spector 0.9.0 → 0.9.1

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.
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphQLEditor-CmfodipY.js","./codemirror-BKmwMUlV.js","./ajv-CJPwFjiP.js","./SoapEditor-CVRCFvJy.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphQLEditor-CJm8glW5.js","./codemirror-BKmwMUlV.js","./ajv-CJPwFjiP.js","./SoapEditor-C2eMs7-Z.js"])))=>i.map(i=>d[i]);
2
2
  import { r as requireReact, g as getDefaultExportFromCjs, R as React, a as reactExports, b as autocompletion, h as hoverTooltip, j as jsxRuntimeExports, V as ViewPlugin, E as EditorView, k as keymap, t as toggleComment, D as Decoration, c as RangeSetBuilder, x as xml, d as json, e as ReactCodeMirror, o as oneDark, f as javascript } from "./codemirror-BKmwMUlV.js";
3
3
  import { r as requireAjv } from "./ajv-CJPwFjiP.js";
4
4
  var client = { exports: {} };
@@ -15985,6 +15985,7 @@ function useVarValues() {
15985
15985
  }
15986
15986
  return result;
15987
15987
  }
15988
+ const Workspace = "Workspace";
15988
15989
  const Collections$6 = "Collections";
15989
15990
  const History$6 = "History";
15990
15991
  const Git$6 = "Git";
@@ -16190,6 +16191,9 @@ const or$6 = "or";
16190
16191
  const Disabled$6 = "Disabled";
16191
16192
  const en = {
16192
16193
  "Close tab": "Close tab",
16194
+ "Open api-spector.dev": "Open api-spector.dev",
16195
+ Workspace,
16196
+ "API Spector home": "API Spector home",
16193
16197
  "Request body": "Request body",
16194
16198
  "Script editor": "Script editor",
16195
16199
  "JSON schema": "JSON schema",
@@ -29587,8 +29591,8 @@ function jsonWithComments() {
29587
29591
  function xmlWithComments() {
29588
29592
  return [xml(), commentKeymap];
29589
29593
  }
29590
- const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-CmfodipY.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
29591
- const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-CVRCFvJy.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
29594
+ const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-CJm8glW5.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
29595
+ const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-C2eMs7-Z.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
29592
29596
  function BodyTab({ request: request2, onChange }) {
29593
29597
  const t = useT();
29594
29598
  const editorFallback = /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 text-xs text-surface-500", children: t("Loading editor…") });
@@ -46348,7 +46352,7 @@ function WelcomeScreen() {
46348
46352
  )
46349
46353
  ] }),
46350
46354
  /* @__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.") }),
46351
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t("version :version", { version: "0.9.0" }) })
46355
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t("version :version", { version: "0.9.1" }) })
46352
46356
  ] }),
46353
46357
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 w-64", children: [
46354
46358
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -47965,10 +47969,17 @@ function WorkspaceSettingsModal({ onClose, initialTab }) {
47965
47969
  " ",
47966
47970
  t("in an environment variable or an auth field; it is resolved at send-time and never written to the workspace. This connection config is non-secret - tokens and secret-ids come from your environment (or the Vault sign-in below).")
47967
47971
  ] }),
47972
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-surface-600 text-[11px]", children: [
47973
+ t("Using OpenBao? It is API-compatible, so the same settings apply. Reference secrets with"),
47974
+ " ",
47975
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-mono text-surface-400", children: "bao:secret/data/app#token" }),
47976
+ " ",
47977
+ t("and set BAO_ADDR / BAO_TOKEN (VAULT_* also works).")
47978
+ ] }),
47968
47979
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-2 border border-surface-800 rounded p-3", children: [
47969
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] uppercase tracking-wider text-surface-500 font-semibold", children: "HashiCorp Vault" }),
47980
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] uppercase tracking-wider text-surface-500 font-semibold", children: t("HashiCorp Vault / OpenBao") }),
47970
47981
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-1", children: [
47971
- /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: labelCls, children: t("Address (VAULT_ADDR)") }),
47982
+ /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: labelCls, children: t("Address (VAULT_ADDR / BAO_ADDR)") }),
47972
47983
  /* @__PURE__ */ jsxRuntimeExports.jsx(
47973
47984
  "input",
47974
47985
  {
@@ -49249,6 +49260,46 @@ function collectRequestsByFolder(folder2, src) {
49249
49260
  walk2(folder2);
49250
49261
  return out;
49251
49262
  }
49263
+ function Tooltip({
49264
+ label,
49265
+ align = "center",
49266
+ children: children2
49267
+ }) {
49268
+ const pos = align === "right" ? "right-0" : align === "left" ? "left-0" : "left-1/2 -translate-x-1/2";
49269
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "relative inline-flex group/tip", children: [
49270
+ children2,
49271
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
49272
+ "span",
49273
+ {
49274
+ "aria-hidden": "true",
49275
+ className: `pointer-events-none absolute top-full ${pos} mt-1.5 z-50 hidden group-hover/tip:block group-focus-within/tip:block whitespace-nowrap rounded px-2 py-1 text-[11px] bg-surface-900 text-[var(--text-primary)] border border-surface-700 shadow-lg`,
49276
+ children: label
49277
+ }
49278
+ )
49279
+ ] });
49280
+ }
49281
+ function DocIcon() {
49282
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", strokeWidth: 1.8, viewBox: "0 0 24 24", "aria-hidden": "true", children: [
49283
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14 3H7a2 2 0 00-2 2v14a2 2 0 002 2h10a2 2 0 002-2V8l-5-5z" }),
49284
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M14 3v5h5M8.5 13h7M8.5 16.5h5" })
49285
+ ] });
49286
+ }
49287
+ function ImportIcon() {
49288
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", strokeWidth: 1.8, viewBox: "0 0 24 24", "aria-hidden": "true", children: [
49289
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 3v10m0 0l-3.5-3.5M12 13l3.5-3.5" }),
49290
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M4 16v3a2 2 0 002 2h12a2 2 0 002-2v-3" })
49291
+ ] });
49292
+ }
49293
+ function Svg({ children: children2 }) {
49294
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", strokeWidth: 1.8, viewBox: "0 0 24 24", "aria-hidden": "true", children: children2 });
49295
+ }
49296
+ const OpenWsIcon = () => /* @__PURE__ */ jsxRuntimeExports.jsx(Svg, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M3.75 9.75h16.5a1.5 1.5 0 011.47 1.8l-1.2 6a1.5 1.5 0 01-1.47 1.2H4.95a1.5 1.5 0 01-1.47-1.2l-1.2-6a1.5 1.5 0 011.47-1.8zM3.75 9.75V6.75A1.5 1.5 0 015.25 5.25h3.88a1.5 1.5 0 011.06.44l1.12 1.12a1.5 1.5 0 001.06.44h4.88a1.5 1.5 0 011.5 1.5v.56" }) });
49297
+ const NewWsIcon = () => /* @__PURE__ */ jsxRuntimeExports.jsx(Svg, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 11v5m2.5-2.5h-5M3.75 7.5V18a1.5 1.5 0 001.5 1.5h13.5A1.5 1.5 0 0020.25 18V9a1.5 1.5 0 00-1.5-1.5h-5.19a1.5 1.5 0 01-1.06-.44l-1.12-1.12a1.5 1.5 0 00-1.06-.44H5.25a1.5 1.5 0 00-1.5 1.5z" }) });
49298
+ const CloseWsIcon = () => /* @__PURE__ */ jsxRuntimeExports.jsx(Svg, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 6l12 12M18 6L6 18" }) });
49299
+ const SaveIcon = () => /* @__PURE__ */ jsxRuntimeExports.jsxs(Svg, { children: [
49300
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 4h11l3 3v12a1 1 0 01-1 1H5a1 1 0 01-1-1V5a1 1 0 011-1z" }),
49301
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 4v4h6V4M8 13h8v6H8z" })
49302
+ ] });
49252
49303
  const { electron: electron$f } = window;
49253
49304
  function Toolbar({ onOpenDocs: _onOpenDocs }) {
49254
49305
  const t = useT();
@@ -49360,34 +49411,51 @@ function Toolbar({ onOpenDocs: _onOpenDocs }) {
49360
49411
  .logo-pupil-r { animation-delay: 0.04s; }
49361
49412
  ` }),
49362
49413
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 mr-1 shrink-0 select-none", children: [
49363
- /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { width: "52", height: "52", viewBox: "0 0 512 512", xmlns: "http://www.w3.org/2000/svg", children: [
49364
- /* @__PURE__ */ jsxRuntimeExports.jsxs("defs", { children: [
49365
- /* @__PURE__ */ jsxRuntimeExports.jsxs("radialGradient", { id: "logoBody", cx: "35%", cy: "22%", r: "70%", children: [
49366
- /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "#5497c8" }),
49367
- /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "55%", stopColor: "#205d96" }),
49368
- /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "#123a60" })
49369
- ] }),
49370
- /* @__PURE__ */ jsxRuntimeExports.jsxs("linearGradient", { id: "logoGloss", x1: "0", y1: "0", x2: "0", y2: "1", children: [
49371
- /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "white", stopOpacity: "0.45" }),
49372
- /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "white", stopOpacity: "0" })
49373
- ] }),
49374
- /* @__PURE__ */ jsxRuntimeExports.jsx("clipPath", { id: "logoGhostClip", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M 130,225 C 130,95 382,95 382,225 L 382,390 Q 340,435 298,390 Q 256,435 214,390 Q 172,435 130,390 Z" }) })
49375
- ] }),
49376
- /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M 130,225 C 130,95 382,95 382,225 L 382,390 Q 340,435 298,390 Q 256,435 214,390 Q 172,435 130,390 Z", fill: "url(#logoBody)" }),
49377
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "198", cy: "262", rx: "29", ry: "33", fill: "white" }),
49378
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "314", cy: "262", rx: "29", ry: "33", fill: "white" }),
49379
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "204", cy: "268", rx: "16", ry: "20", fill: "#0b1624", className: "logo-pupil" }),
49380
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "320", cy: "268", rx: "16", ry: "20", fill: "#0b1624", className: "logo-pupil logo-pupil-r" }),
49381
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "194", cy: "254", rx: "6", ry: "7", fill: "white", opacity: "0.65" }),
49382
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "310", cy: "254", rx: "6", ry: "7", fill: "white", opacity: "0.65" }),
49383
- /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "256", cy: "100", rx: "200", ry: "180", fill: "url(#logoGloss)", clipPath: "url(#logoGhostClip)" })
49384
- ] }),
49414
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
49415
+ "button",
49416
+ {
49417
+ onClick: () => window.electron.openExternal("https://api-spector.dev"),
49418
+ title: t("Open api-spector.dev"),
49419
+ "aria-label": t("API Spector home"),
49420
+ className: "shrink-0 focus:outline-none rounded hover:opacity-80 transition-opacity cursor-pointer",
49421
+ children: /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { width: "52", height: "52", viewBox: "0 0 512 512", xmlns: "http://www.w3.org/2000/svg", children: [
49422
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("defs", { children: [
49423
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("radialGradient", { id: "logoBody", cx: "35%", cy: "22%", r: "70%", children: [
49424
+ /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "#5497c8" }),
49425
+ /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "55%", stopColor: "#205d96" }),
49426
+ /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "#123a60" })
49427
+ ] }),
49428
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("linearGradient", { id: "logoGloss", x1: "0", y1: "0", x2: "0", y2: "1", children: [
49429
+ /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "0%", stopColor: "white", stopOpacity: "0.45" }),
49430
+ /* @__PURE__ */ jsxRuntimeExports.jsx("stop", { offset: "100%", stopColor: "white", stopOpacity: "0" })
49431
+ ] }),
49432
+ /* @__PURE__ */ jsxRuntimeExports.jsx("clipPath", { id: "logoGhostClip", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M 130,225 C 130,95 382,95 382,225 L 382,390 Q 340,435 298,390 Q 256,435 214,390 Q 172,435 130,390 Z" }) })
49433
+ ] }),
49434
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M 130,225 C 130,95 382,95 382,225 L 382,390 Q 340,435 298,390 Q 256,435 214,390 Q 172,435 130,390 Z", fill: "url(#logoBody)" }),
49435
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "198", cy: "262", rx: "29", ry: "33", fill: "white" }),
49436
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "314", cy: "262", rx: "29", ry: "33", fill: "white" }),
49437
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "204", cy: "268", rx: "16", ry: "20", fill: "#0b1624", className: "logo-pupil" }),
49438
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "320", cy: "268", rx: "16", ry: "20", fill: "#0b1624", className: "logo-pupil logo-pupil-r" }),
49439
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "194", cy: "254", rx: "6", ry: "7", fill: "white", opacity: "0.65" }),
49440
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "310", cy: "254", rx: "6", ry: "7", fill: "white", opacity: "0.65" }),
49441
+ /* @__PURE__ */ jsxRuntimeExports.jsx("ellipse", { cx: "256", cy: "100", rx: "200", ry: "180", fill: "url(#logoGloss)", clipPath: "url(#logoGhostClip)" })
49442
+ ] })
49443
+ }
49444
+ ),
49385
49445
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col leading-tight", children: [
49386
- /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs font-semibold tracking-wide", children: [
49387
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--wordmark-muted)" }, children: "API" }),
49388
- " ",
49389
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--wordmark-accent)" }, children: "Spector" })
49390
- ] }),
49446
+ /* @__PURE__ */ jsxRuntimeExports.jsxs(
49447
+ "button",
49448
+ {
49449
+ onClick: () => window.electron.openExternal("https://api-spector.dev"),
49450
+ title: t("Open api-spector.dev"),
49451
+ className: "text-xs font-semibold tracking-wide text-left hover:underline focus:outline-none cursor-pointer",
49452
+ children: [
49453
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--wordmark-muted)" }, children: "API" }),
49454
+ " ",
49455
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--wordmark-accent)" }, children: "Spector" })
49456
+ ]
49457
+ }
49458
+ ),
49391
49459
  /* @__PURE__ */ jsxRuntimeExports.jsx(
49392
49460
  "button",
49393
49461
  {
@@ -49399,92 +49467,98 @@ function Toolbar({ onOpenDocs: _onOpenDocs }) {
49399
49467
  )
49400
49468
  ] })
49401
49469
  ] }),
49402
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49403
- "button",
49404
- {
49405
- onClick: () => setImportOpen(true),
49406
- className: "px-2.5 py-1 text-xs bg-surface-800 hover:bg-surface-700 rounded transition-colors shrink-0",
49407
- title: t("Import collection (Postman, OpenAPI, Insomnia, Bruno)"),
49408
- children: t("Import")
49409
- }
49410
- ),
49411
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px h-4 bg-surface-800 mx-1 shrink-0" }),
49412
49470
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-surface-600 text-xs shrink-0", children: t("ENV") }),
49413
49471
  /* @__PURE__ */ jsxRuntimeExports.jsx(EnvironmentBar, { inline: true })
49414
49472
  ] }),
49415
49473
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-3 py-1.5 shrink-0 border-l border-surface-800", children: [
49416
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49474
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-surface-600 text-xs shrink-0", children: t("Workspace") }),
49475
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Open a different workspace"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49417
49476
  "button",
49418
49477
  {
49419
49478
  onClick: openWs,
49420
49479
  disabled: wsBusy,
49421
- className: "px-2.5 py-1 text-xs bg-surface-800 hover:bg-surface-700 rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
49422
- title: t("Open a different workspace"),
49423
- children: t("Open WS")
49480
+ className: "p-1.5 bg-surface-800 hover:bg-surface-700 rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
49481
+ "aria-label": t("Open a different workspace"),
49482
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(OpenWsIcon, {})
49424
49483
  }
49425
- ),
49426
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49484
+ ) }),
49485
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Create a new workspace"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49427
49486
  "button",
49428
49487
  {
49429
49488
  onClick: newWs,
49430
49489
  disabled: wsBusy,
49431
- className: "px-2.5 py-1 text-xs bg-surface-800 hover:bg-surface-700 rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
49432
- title: t("Create a new workspace"),
49433
- children: t("New WS")
49490
+ className: "p-1.5 bg-surface-800 hover:bg-surface-700 rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed",
49491
+ "aria-label": t("Create a new workspace"),
49492
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(NewWsIcon, {})
49434
49493
  }
49435
- ),
49436
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49494
+ ) }),
49495
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Close current workspace"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49437
49496
  "button",
49438
49497
  {
49439
49498
  onClick: async () => {
49440
49499
  await electron$f.closeWorkspace();
49441
49500
  closeWorkspace();
49442
49501
  },
49443
- className: "px-2.5 py-1 text-xs bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49444
- title: t("Close current workspace"),
49445
- children: t("Close WS")
49502
+ className: "p-1.5 bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49503
+ "aria-label": t("Close current workspace"),
49504
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(CloseWsIcon, {})
49446
49505
  }
49447
- ),
49448
- /* @__PURE__ */ jsxRuntimeExports.jsxs(
49506
+ ) }),
49507
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: saving ? t("Saving…") : t("Save all unsaved changes"), children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
49449
49508
  "button",
49450
49509
  {
49451
49510
  onClick: saveAll,
49452
49511
  disabled: saving,
49453
- className: `px-2.5 py-1 text-xs rounded transition-colors flex items-center gap-1.5 ${hasDirty ? "bg-blue-700 hover:bg-blue-600 text-white" : "bg-surface-800 hover:bg-surface-700 text-surface-500"}`,
49454
- title: t("Save all unsaved changes"),
49512
+ className: `relative p-1.5 rounded transition-colors ${hasDirty ? "bg-blue-700 hover:bg-blue-600 text-white" : "bg-surface-800 hover:bg-surface-700 text-surface-500"} ${saving ? "opacity-60" : ""}`,
49513
+ "aria-label": t("Save all unsaved changes"),
49455
49514
  children: [
49456
- hasDirty && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-amber-400 inline-block" }),
49457
- saving ? t("Saving…") : t("Save")
49515
+ /* @__PURE__ */ jsxRuntimeExports.jsx(SaveIcon, {}),
49516
+ hasDirty && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute -top-0.5 -right-0.5 w-1.5 h-1.5 rounded-full bg-amber-400" })
49458
49517
  ]
49459
49518
  }
49460
- ),
49461
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49462
- "button",
49463
- {
49464
- onClick: () => setWorkspaceSettingsOpen(true),
49465
- className: "px-2.5 py-1 text-xs bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49466
- title: t("Workspace settings"),
49467
- children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { fontSize: "16px", lineHeight: 1 }, children: "⚙" })
49468
- }
49469
- ),
49470
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49519
+ ) }),
49520
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px h-4 bg-surface-800 mx-1 shrink-0" }),
49521
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Import collection (Postman, OpenAPI, Insomnia, Bruno)"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49471
49522
  "button",
49472
49523
  {
49473
- onClick: () => setDocsOpen(true),
49474
- className: "px-2.5 py-1 text-xs bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49475
- title: t("Generate API documentation"),
49476
- children: t("Docs")
49524
+ onClick: () => setImportOpen(true),
49525
+ className: "p-1.5 bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49526
+ "aria-label": t("Import collection (Postman, OpenAPI, Insomnia, Bruno)"),
49527
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(ImportIcon, {})
49477
49528
  }
49478
- ),
49479
- /* @__PURE__ */ jsxRuntimeExports.jsx(
49529
+ ) }),
49530
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px h-4 bg-surface-800 mx-1 shrink-0" }),
49531
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [
49532
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-surface-600 text-xs", children: t("Generate") }),
49533
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Generate API documentation"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49534
+ "button",
49535
+ {
49536
+ onClick: () => setDocsOpen(true),
49537
+ className: "p-1.5 bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49538
+ "aria-label": t("Generate API documentation"),
49539
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(DocIcon, {})
49540
+ }
49541
+ ) }),
49542
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Toggle code generator"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49543
+ "button",
49544
+ {
49545
+ onClick: () => setShowGeneratorPanel(!showGeneratorPanel),
49546
+ className: `px-2 py-1 text-xs font-mono rounded transition-colors ${showGeneratorPanel ? "bg-blue-700 text-white" : "bg-surface-800 hover:bg-surface-700"}`,
49547
+ "aria-label": t("Toggle code generator"),
49548
+ children: "</>"
49549
+ }
49550
+ ) })
49551
+ ] }),
49552
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-px h-4 bg-surface-800 mx-1 shrink-0" }),
49553
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Tooltip, { label: t("Workspace settings"), align: "right", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
49480
49554
  "button",
49481
49555
  {
49482
- onClick: () => setShowGeneratorPanel(!showGeneratorPanel),
49483
- className: `px-2.5 py-1 text-xs rounded transition-colors font-mono ${showGeneratorPanel ? "bg-blue-700 text-white" : "bg-surface-800 hover:bg-surface-700"}`,
49484
- title: t("Toggle code generator"),
49485
- children: "</>"
49556
+ onClick: () => setWorkspaceSettingsOpen(true),
49557
+ className: "p-1.5 bg-surface-800 hover:bg-surface-700 rounded transition-colors",
49558
+ "aria-label": t("Workspace settings"),
49559
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(GearIcon, {})
49486
49560
  }
49487
- )
49561
+ ) })
49488
49562
  ] })
49489
49563
  ] })
49490
49564
  ] });
@@ -54084,6 +54158,7 @@ function detectPlatform(remotes) {
54084
54158
  const NODE_LTS = "lts/*";
54085
54159
  const PROVIDER_ENV = {
54086
54160
  vault: ["VAULT_ADDR", "VAULT_ROLE_ID", "VAULT_SECRET_ID"],
54161
+ bao: ["BAO_ADDR", "BAO_ROLE_ID", "BAO_SECRET_ID"],
54087
54162
  aws: ["AWS_REGION", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
54088
54163
  azure: ["AZURE_TENANT_ID", "AZURE_CLIENT_ID", "AZURE_CLIENT_SECRET"],
54089
54164
  gcp: ["GCP_PROJECT", "GOOGLE_APPLICATION_CREDENTIALS_JSON"],
@@ -54092,10 +54167,10 @@ const PROVIDER_ENV = {
54092
54167
  function secretManagerOf(ref) {
54093
54168
  if (ref.startsWith("op://")) return "op";
54094
54169
  const scheme = ref.split(":", 1)[0];
54095
- if (scheme === "vault" || scheme === "aws" || scheme === "azure" || scheme === "gcp") return scheme;
54170
+ if (scheme === "vault" || scheme === "bao" || scheme === "aws" || scheme === "azure" || scheme === "gcp") return scheme;
54096
54171
  return null;
54097
54172
  }
54098
- const INLINE_REF_RE = /\{\{\s*(vault:|aws:|azure:|gcp:|op:\/\/)/g;
54173
+ const INLINE_REF_RE = /\{\{\s*(vault:|bao:|aws:|azure:|gcp:|op:\/\/)/g;
54099
54174
  function inlineSecretManagers(text) {
54100
54175
  if (!text) return [];
54101
54176
  const kinds = /* @__PURE__ */ new Set();
@@ -56599,7 +56674,7 @@ function AddBlockMenu({ onAdd: onAdd2 }) {
56599
56674
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute left-0 top-full mt-1 z-50 w-56 bg-surface-900 border border-surface-700 rounded-lg shadow-2xl max-h-[70vh] overflow-y-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsx(BlockPickerList, { onPick: (type) => {
56600
56675
  onAdd2(type);
56601
56676
  setOpen(false);
56602
- } }) })
56677
+ }, includeEnd: true }) })
56603
56678
  ] })
56604
56679
  ] });
56605
56680
  }
@@ -58005,7 +58080,7 @@ function App() {
58005
58080
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--wordmark-accent)" }, children: "Spector" }),
58006
58081
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-2 text-[10px] font-normal", style: { color: "var(--text-muted)" }, children: [
58007
58082
  "v",
58008
- "0.9.0"
58083
+ "0.9.1"
58009
58084
  ] }),
58010
58085
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mx-2 opacity-30", "aria-hidden": "true", children: "·" }),
58011
58086
  /* @__PURE__ */ jsxRuntimeExports.jsx(