@testsmith/api-spector 0.9.4 → 0.9.6

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.
@@ -3,7 +3,7 @@ const promises = require("node:fs/promises");
3
3
  const path = require("node:path");
4
4
  const crypto = require("node:crypto");
5
5
  const undici = require("undici");
6
- const requestExec = require("./request-exec-B8DJ8Id2.js");
6
+ const requestExec = require("./request-exec-DGX9gws9.js");
7
7
  const Ajv = require("ajv");
8
8
  const jsYaml = require("js-yaml");
9
9
  require("node:http");
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const requestExec = require("./request-exec-B8DJ8Id2.js");
2
+ const requestExec = require("./request-exec-DGX9gws9.js");
3
3
  const grpc = require("@grpc/grpc-js");
4
4
  const protoLoader = require("@grpc/proto-loader");
5
5
  const fs = require("node:fs");
@@ -59,6 +59,59 @@ function _interopNamespaceDefault(e) {
59
59
  const nodeTls__namespace = /* @__PURE__ */ _interopNamespaceDefault(nodeTls);
60
60
  const crypto__namespace = /* @__PURE__ */ _interopNamespaceDefault(crypto);
61
61
  const vm__namespace = /* @__PURE__ */ _interopNamespaceDefault(vm);
62
+ function parseDict(raw) {
63
+ if (!raw) return null;
64
+ try {
65
+ const parsed = JSON.parse(raw);
66
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
67
+ const out = {};
68
+ for (const [k, v] of Object.entries(parsed)) {
69
+ if (typeof v === "string") out[k] = v;
70
+ }
71
+ return out;
72
+ } catch {
73
+ return null;
74
+ }
75
+ }
76
+ const cache$1 = /* @__PURE__ */ new Map();
77
+ function cached(name, rawKey, build) {
78
+ const hit = cache$1.get(name);
79
+ if (hit && hit.key === rawKey) return hit.dict;
80
+ const dict = build();
81
+ cache$1.set(name, { key: rawKey, dict });
82
+ return dict;
83
+ }
84
+ function valuesInline() {
85
+ const raw = process.env["API_SPECTOR_SECRETS"];
86
+ return cached("inline", raw ?? "", () => parseDict(raw));
87
+ }
88
+ function valuesFromFile() {
89
+ const path2 = process.env["API_SPECTOR_SECRETS_FILE"];
90
+ return cached("file", path2 ?? "", () => {
91
+ if (!path2) return null;
92
+ try {
93
+ return parseDict(fs.readFileSync(path2, "utf8"));
94
+ } catch {
95
+ return null;
96
+ }
97
+ });
98
+ }
99
+ function envNameMap() {
100
+ const raw = process.env["API_SPECTOR_SECRET_ENV_MAP"];
101
+ return cached("envmap", raw ?? "", () => parseDict(raw));
102
+ }
103
+ function injectedSecret(ref) {
104
+ const direct = valuesInline();
105
+ if (direct && typeof direct[ref] === "string") return direct[ref];
106
+ const file = valuesFromFile();
107
+ if (file && typeof file[ref] === "string") return file[ref];
108
+ const map = envNameMap();
109
+ if (map && typeof map[ref] === "string") {
110
+ const value = process.env[map[ref]];
111
+ if (value !== void 0 && value !== "") return value;
112
+ }
113
+ return void 0;
114
+ }
62
115
  const providers = /* @__PURE__ */ new Map();
63
116
  function registerSecretProvider(provider) {
64
117
  providers.set(provider.scheme.toLowerCase(), provider);
@@ -78,6 +131,8 @@ function hasSecretScheme(ref) {
78
131
  async function resolveExternalSecret(ref, ctx = {}) {
79
132
  const scheme = schemeOf(ref);
80
133
  if (!scheme) return null;
134
+ const injected = injectedSecret(ref);
135
+ if (injected !== void 0) return injected;
81
136
  const provider = providers.get(scheme);
82
137
  const refBody = ref.slice(scheme.length + 1);
83
138
  return provider.resolve(refBody, ctx);
@@ -461,8 +516,8 @@ const isId = (s) => /^[a-z0-9]{26}$/i.test(s);
461
516
  async function vaultId(conn, vault) {
462
517
  if (isId(vault)) return vault;
463
518
  const cacheKey = `vaults:${vault}`;
464
- const cached = idCache.get(cacheKey);
465
- if (cached) return cached;
519
+ const cached2 = idCache.get(cacheKey);
520
+ if (cached2) return cached2;
466
521
  const list = await opGet(conn, `/v1/vaults?filter=${encodeURIComponent(`name eq "${vault}"`)}`);
467
522
  const id = Array.isArray(list) && list[0]?.id;
468
523
  if (!id) throw new Error(`1Password: vault '${vault}' not found`);
@@ -472,8 +527,8 @@ async function vaultId(conn, vault) {
472
527
  async function itemId(conn, vid, item) {
473
528
  if (isId(item)) return item;
474
529
  const cacheKey = `items:${vid}:${item}`;
475
- const cached = idCache.get(cacheKey);
476
- if (cached) return cached;
530
+ const cached2 = idCache.get(cacheKey);
531
+ if (cached2) return cached2;
477
532
  const list = await opGet(conn, `/v1/vaults/${vid}/items?filter=${encodeURIComponent(`title eq "${item}"`)}`);
478
533
  const id = Array.isArray(list) && list[0]?.id;
479
534
  if (!id) throw new Error(`1Password: item '${item}' not found in vault`);
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  const promises = require("node:fs/promises");
4
4
  const path = require("node:path");
5
- const brokerClient = require("./chunks/broker-client-Cl6Fu3oD.js");
5
+ const brokerClient = require("./chunks/broker-client-BB61Fjjk.js");
6
6
  const escape = require("./chunks/escape-DDVAlOvZ.js");
7
7
  const crypto = require("node:crypto");
8
8
  const undici = require("undici");
@@ -11,7 +11,7 @@ const cliCommon = require("./chunks/cli-common-GnihVSjU.js");
11
11
  const node_child_process = require("node:child_process");
12
12
  const jsYaml = require("js-yaml");
13
13
  const environments = require("./chunks/environments-iM3SUM-4.js");
14
- require("./chunks/request-exec-B8DJ8Id2.js");
14
+ require("./chunks/request-exec-DGX9gws9.js");
15
15
  require("fs/promises");
16
16
  require("tls");
17
17
  require("./chunks/handle-HQp1EXf8.js");
package/out/main/flow.js CHANGED
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  const promises = require("node:fs/promises");
4
4
  const path = require("node:path");
5
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
5
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
6
6
  const requestCollection = require("./chunks/request-collection-zRRUfg0X.js");
7
7
  const environments = require("./chunks/environments-iM3SUM-4.js");
8
8
  const flowEngine = require("./chunks/flow-engine-BxwjEy37.js");
@@ -281,7 +281,7 @@ async function main() {
281
281
  const envName = args.environment ?? args.env;
282
282
  const env = environments.selectEnvironment(workspace, environments$1, envName);
283
283
  const verbose = Boolean(args.verbose);
284
- const version = `v${"0.9.4"}`;
284
+ const version = `v${"0.9.6"}`;
285
285
  console.log("");
286
286
  console.log(cliCommon.color(" API Flow Runner" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
287
287
  console.log(cliCommon.color(` Flow: ${flow.name}`, cliCommon.C.gray));
package/out/main/index.js CHANGED
@@ -4,7 +4,7 @@ const handle = require("./chunks/handle-HQp1EXf8.js");
4
4
  const path = require("node:path");
5
5
  const fs = require("node:fs");
6
6
  const registerHandlers = require("./register-handlers.js");
7
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
7
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
8
8
  const electronUpdater = require("electron-updater");
9
9
  const mockServer = require("./chunks/mock-server-C4kTFkod.js");
10
10
  require("node:fs/promises");
@@ -32,7 +32,7 @@ require("node:os");
32
32
  require("@grpc/grpc-js");
33
33
  require("@grpc/proto-loader");
34
34
  require("./chunks/escape-DDVAlOvZ.js");
35
- require("./chunks/broker-client-Cl6Fu3oD.js");
35
+ require("./chunks/broker-client-BB61Fjjk.js");
36
36
  require("./chunks/recorder-BkO8G_mB.js");
37
37
  require("fs/promises");
38
38
  require("tls");
@@ -50,7 +50,7 @@ function isNewer(a, b) {
50
50
  return a2 > b2;
51
51
  }
52
52
  async function checkForUpdate() {
53
- const current = "0.9.4";
53
+ const current = "0.9.6";
54
54
  try {
55
55
  const res = await fetch(REGISTRY_URL, { signal: AbortSignal.timeout(4e3) });
56
56
  if (!res.ok) return null;
package/out/main/lib.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mockServer = require("./chunks/mock-server-C4kTFkod.js");
4
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
4
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
5
5
  const flowEngine = require("./chunks/flow-engine-BxwjEy37.js");
6
6
  require("node:http");
7
7
  require("node:crypto");
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
- const perfRun = require("./chunks/perf-run-BNunvZsG.js");
3
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
2
+ const perfRun = require("./chunks/perf-run-rkkwuJKQ.js");
3
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
4
4
  require("@grpc/grpc-js");
5
5
  require("@grpc/proto-loader");
6
6
  require("node:fs");
package/out/main/perf.js CHANGED
@@ -2,11 +2,11 @@
2
2
  "use strict";
3
3
  const promises = require("node:fs/promises");
4
4
  const path = require("node:path");
5
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
5
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
6
6
  const requestCollection = require("./chunks/request-collection-zRRUfg0X.js");
7
7
  const environments = require("./chunks/environments-iM3SUM-4.js");
8
8
  const flowEngine = require("./chunks/flow-engine-BxwjEy37.js");
9
- const perfRun = require("./chunks/perf-run-BNunvZsG.js");
9
+ const perfRun = require("./chunks/perf-run-rkkwuJKQ.js");
10
10
  const perfReport = require("./chunks/perf-report-KXGZgCDY.js");
11
11
  const cliCommon = require("./chunks/cli-common-GnihVSjU.js");
12
12
  require("undici");
@@ -191,7 +191,7 @@ async function main() {
191
191
  targetLabel = `flow: ${flow.name}`;
192
192
  }
193
193
  const load = perfRun.deriveLoad(plan);
194
- const version = `v${"0.9.4"}`;
194
+ const version = `v${"0.9.6"}`;
195
195
  console.log("");
196
196
  console.log(cliCommon.color(" API Performance" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
197
197
  console.log(cliCommon.color(` Plan: ${plan.name}`, cliCommon.C.gray));
@@ -31,7 +31,7 @@ const JSZip = require("jszip");
31
31
  const simpleGit = require("simple-git");
32
32
  const dataFiles = require("./chunks/data-files-BYqhsoPe.js");
33
33
  const requestCollection = require("./chunks/request-collection-zRRUfg0X.js");
34
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
34
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
35
35
  const ipcValidate = require("./chunks/ipc-validate-sqUFqRmE.js");
36
36
  const uuid = require("uuid");
37
37
  const jsYaml = require("js-yaml");
@@ -50,7 +50,7 @@ const os = require("node:os");
50
50
  const grpc = require("@grpc/grpc-js");
51
51
  const protoLoader = require("@grpc/proto-loader");
52
52
  const escape = require("./chunks/escape-DDVAlOvZ.js");
53
- const brokerClient = require("./chunks/broker-client-Cl6Fu3oD.js");
53
+ const brokerClient = require("./chunks/broker-client-BB61Fjjk.js");
54
54
  const recorder = require("./chunks/recorder-BkO8G_mB.js");
55
55
  require("fs/promises");
56
56
  require("tls");
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  const promises = require("node:fs/promises");
4
4
  const path = require("node:path");
5
- const requestExec = require("./chunks/request-exec-B8DJ8Id2.js");
5
+ const requestExec = require("./chunks/request-exec-DGX9gws9.js");
6
6
  const requestCollection = require("./chunks/request-collection-zRRUfg0X.js");
7
7
  const escape = require("./chunks/escape-DDVAlOvZ.js");
8
8
  const runConcurrent = require("./chunks/run-concurrent-468tH0AX.js");
@@ -551,7 +551,7 @@ async function main() {
551
551
  } else if (!envName && workspace.settings?.defaultEnvironment && !env) {
552
552
  console.warn(cliCommon.color(`Warning: default environment "${workspace.settings.defaultEnvironment}" not found. Running without environment.`, cliCommon.C.yellow));
553
553
  }
554
- const version = `v${"0.9.4"}`;
554
+ const version = `v${"0.9.6"}`;
555
555
  console.log("");
556
556
  console.log(cliCommon.color(" API Test Runner" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
557
557
  console.log(cliCommon.color(` Workspace: ${wsPath}`, cliCommon.C.gray));
@@ -1,5 +1,5 @@
1
1
  import { l as linter, E as EditorView, L as LanguageSupport, i as LRLanguage, s as styleTags, m as indentNodeProp, n as delimitedIndent, p as foldNodeProp, q as foldInside, S as StateField, u as LRParser, v as StateEffect, w as tags, a as reactExports, j as jsxRuntimeExports, e as ReactCodeMirror, o as oneDark, d as json } from "./codemirror-BKmwMUlV.js";
2
- import { u as useT, a as useStore, b as useActiveEnvironment, i as isSubscriptionQuery } from "./index-B9q3bCW_.js";
2
+ import { u as useT, a as useStore, b as useActiveEnvironment, i as isSubscriptionQuery } from "./index-Bceaiayq.js";
3
3
  import "./ajv-CJPwFjiP.js";
4
4
  function devAssert(condition, message) {
5
5
  const booleanCondition = Boolean(condition);
@@ -1,5 +1,5 @@
1
1
  import { a as reactExports, j as jsxRuntimeExports, e as ReactCodeMirror, o as oneDark, x as xml } from "./codemirror-BKmwMUlV.js";
2
- import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-B9q3bCW_.js";
2
+ import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-Bceaiayq.js";
3
3
  import "./ajv-CJPwFjiP.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-rGp7TpEL.js","./codemirror-BKmwMUlV.js","./ajv-CJPwFjiP.js","./SoapEditor-qaY1tu_j.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphQLEditor-R0IcsB_0.js","./codemirror-BKmwMUlV.js","./ajv-CJPwFjiP.js","./SoapEditor-BjH4YNR-.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: {} };
@@ -29938,8 +29938,8 @@ function jsonWithComments() {
29938
29938
  function xmlWithComments() {
29939
29939
  return [xml(), commentKeymap];
29940
29940
  }
29941
- const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-rGp7TpEL.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
29942
- const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-qaY1tu_j.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
29941
+ const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-R0IcsB_0.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
29942
+ const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-BjH4YNR-.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
29943
29943
  function BodyTab({ request: request2, onChange }) {
29944
29944
  const t = useT();
29945
29945
  const editorFallback = /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 text-xs text-surface-500", children: t("Loading editor…") });
@@ -46702,7 +46702,7 @@ function WelcomeScreen() {
46702
46702
  )
46703
46703
  ] }),
46704
46704
  /* @__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.") }),
46705
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t("version :version", { version: "0.9.4" }) })
46705
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t("version :version", { version: "0.9.6" }) })
46706
46706
  ] }),
46707
46707
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 w-64", children: [
46708
46708
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -58817,7 +58817,7 @@ function App() {
58817
58817
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "var(--wordmark-accent)" }, children: "Spector" }),
58818
58818
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-2 text-[10px] font-normal", style: { color: "var(--text-muted)" }, children: [
58819
58819
  "v",
58820
- "0.9.4"
58820
+ "0.9.6"
58821
58821
  ] }),
58822
58822
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mx-2 opacity-30", "aria-hidden": "true", children: "·" }),
58823
58823
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -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-B9q3bCW_.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-Bceaiayq.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="./assets/codemirror-BKmwMUlV.js">
10
10
  <link rel="modulepreload" crossorigin href="./assets/ajv-CJPwFjiP.js">
11
11
  <link rel="stylesheet" crossorigin href="./assets/index-C8ZGv8yy.css">
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@testsmith/api-spector",
3
3
  "productName": "API Spector",
4
- "version": "0.9.4",
4
+ "version": "0.9.6",
5
5
  "description": "Local-first API testing tool to inspect, test and mock APIs",
6
6
  "repository": {
7
7
  "type": "git",