@testsmith/api-spector 0.7.9 → 0.8.0

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-CgyqbNWk.js");
6
+ const requestExec = require("./request-exec-CEmSNDIG.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-CgyqbNWk.js");
2
+ const requestExec = require("./request-exec-CEmSNDIG.js");
3
3
  const grpc = require("@grpc/grpc-js");
4
4
  const protoLoader = require("@grpc/proto-loader");
5
5
  const fs = require("node:fs");
@@ -913,6 +913,20 @@ async function buildEnvVars(environment) {
913
913
  }
914
914
  return vars;
915
915
  }
916
+ async function resolveInlineSecretRefs(text) {
917
+ const refs = /* @__PURE__ */ new Set();
918
+ for (const m of text.matchAll(/\{\{\s*([^}]+?)\s*\}\}/g)) {
919
+ const inner = m[1].trim();
920
+ if (hasSecretScheme(inner)) refs.add(inner);
921
+ }
922
+ if (refs.size === 0) return {};
923
+ const out = {};
924
+ await Promise.all([...refs].map(async (ref) => {
925
+ const value = await resolveExternalSecret(ref);
926
+ if (value !== null) out[ref] = value;
927
+ }));
928
+ return out;
929
+ }
916
930
  function mergeVars(envVars, collectionVars, globals2, localVars = {}, dynamicVars = {}, folderVars = {}) {
917
931
  const out = {};
918
932
  for (const src of [dynamicVars, globals2, collectionVars, folderVars, envVars, localVars]) {
@@ -2604,18 +2618,7 @@ async function resolveInlineSecrets(req) {
2604
2618
  req.preRequestScript ?? "",
2605
2619
  req.postRequestScript ?? ""
2606
2620
  ].join("\n");
2607
- const refs = /* @__PURE__ */ new Set();
2608
- for (const m of haystack.matchAll(/\{\{\s*([^}]+?)\s*\}\}/g)) {
2609
- const inner = m[1].trim();
2610
- if (hasSecretScheme(inner)) refs.add(inner);
2611
- }
2612
- if (refs.size === 0) return {};
2613
- const out = {};
2614
- await Promise.all([...refs].map(async (ref) => {
2615
- const value = await resolveExternalSecret(ref);
2616
- if (value !== null) out[ref] = value;
2617
- }));
2618
- return out;
2621
+ return resolveInlineSecretRefs(haystack);
2619
2622
  }
2620
2623
  async function executeRunnerRequest(opts) {
2621
2624
  const { req, collectionVars, envVars, globals: globals2, dispatcher, piiMaskPatterns, proxy, tls, onScriptOutput } = opts;
@@ -2938,6 +2941,7 @@ exports.registerSecretProvider = registerSecretProvider;
2938
2941
  exports.registeredSchemes = registeredSchemes;
2939
2942
  exports.resolveDataRow = resolveDataRow;
2940
2943
  exports.resolveExternalSecret = resolveExternalSecret;
2944
+ exports.resolveInlineSecretRefs = resolveInlineSecretRefs;
2941
2945
  exports.runGraphqlWsTest = runGraphqlWsTest;
2942
2946
  exports.runMqttTest = runMqttTest;
2943
2947
  exports.runScript = runScript;
@@ -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-CJBfpvbd.js");
5
+ const brokerClient = require("./chunks/broker-client-BQBPAPCZ.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-CgyqbNWk.js");
14
+ require("./chunks/request-exec-CEmSNDIG.js");
15
15
  require("fs/promises");
16
16
  require("tls");
17
17
  require("./chunks/handle-Crv1i9hb.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-CgyqbNWk.js");
5
+ const requestExec = require("./chunks/request-exec-CEmSNDIG.js");
6
6
  const requestCollection = require("./chunks/request-collection-gkOYlWml.js");
7
7
  const environments = require("./chunks/environments-iM3SUM-4.js");
8
8
  const flowEngine = require("./chunks/flow-engine-BxwjEy37.js");
@@ -268,7 +268,7 @@ async function main() {
268
268
  const envName = args.environment ?? args.env;
269
269
  const env = environments.selectEnvironment(workspace, environments$1, envName);
270
270
  const verbose = Boolean(args.verbose);
271
- const version = `v${"0.7.9"}`;
271
+ const version = `v${"0.8.0"}`;
272
272
  console.log("");
273
273
  console.log(cliCommon.color(" API Flow Runner" + (version ? ` ${version}` : ""), cliCommon.C.bold, cliCommon.C.white));
274
274
  console.log(cliCommon.color(` Flow: ${flow.name}`, cliCommon.C.gray));
package/out/main/index.js CHANGED
@@ -29,7 +29,7 @@ const promises = require("node:fs/promises");
29
29
  const crypto = require("node:crypto");
30
30
  const JSZip = require("jszip");
31
31
  const dataFiles = require("./chunks/data-files-BYqhsoPe.js");
32
- const requestExec = require("./chunks/request-exec-CgyqbNWk.js");
32
+ const requestExec = require("./chunks/request-exec-CEmSNDIG.js");
33
33
  const ipcValidate = require("./chunks/ipc-validate-sqUFqRmE.js");
34
34
  const uuid = require("uuid");
35
35
  const jsYaml = require("js-yaml");
@@ -48,7 +48,7 @@ const grpc = require("@grpc/grpc-js");
48
48
  const protoLoader = require("@grpc/proto-loader");
49
49
  const soapHandler = require("./chunks/soap-handler-Brr7BPWO.js");
50
50
  const escape = require("./chunks/escape-DDVAlOvZ.js");
51
- const brokerClient = require("./chunks/broker-client-CJBfpvbd.js");
51
+ const brokerClient = require("./chunks/broker-client-BQBPAPCZ.js");
52
52
  const simpleGit = require("simple-git");
53
53
  const recorder = require("./chunks/recorder-BkO8G_mB.js");
54
54
  const electronUpdater = require("electron-updater");
@@ -5498,10 +5498,12 @@ function registerMockHandlers(ipc) {
5498
5498
  return JSON.parse(raw);
5499
5499
  });
5500
5500
  }
5501
- async function resolveVars(ctx) {
5501
+ async function resolveVars(ctx, auth) {
5502
5502
  const envVars = await requestExec.buildEnvVars(ctx?.environment ?? null);
5503
5503
  const dynamic = await requestExec.buildDynamicVars();
5504
- return requestExec.mergeVars(envVars, ctx?.collectionVars ?? {}, ctx?.globals ?? {}, {}, dynamic);
5504
+ const scope = requestExec.mergeVars(envVars, ctx?.collectionVars ?? {}, ctx?.globals ?? {}, {}, dynamic);
5505
+ const inline = await requestExec.resolveInlineSecretRefs(JSON.stringify(auth ?? {}));
5506
+ return { ...scope, ...inline };
5505
5507
  }
5506
5508
  async function resolveClientSecret(auth, vars) {
5507
5509
  let secret = auth.oauth2ClientSecret ?? "";
@@ -5601,7 +5603,7 @@ async function browserFlow(auth, vars, flow) {
5601
5603
  function registerOAuth2Handlers(ipc) {
5602
5604
  handle.handleIpc(ipc, handle.IPC.oauth2.startFlow, async (_e, auth, ctx) => {
5603
5605
  if (auth.type !== "oauth2") throw new Error("OAuth 2.0: auth is not an oauth2 config.");
5604
- const vars = await resolveVars(ctx);
5606
+ const vars = await resolveVars(ctx, auth);
5605
5607
  const flow = auth.oauth2Flow ?? "client_credentials";
5606
5608
  if (flow === "authorization_code" || flow === "implicit") {
5607
5609
  return browserFlow(auth, vars, flow);
@@ -5609,7 +5611,7 @@ function registerOAuth2Handlers(ipc) {
5609
5611
  return requestExec.fetchOAuth2Token(auth, vars);
5610
5612
  });
5611
5613
  handle.handleIpc(ipc, handle.IPC.oauth2.refreshToken, async (_e, auth, ctx, refreshToken) => {
5612
- const vars = await resolveVars(ctx);
5614
+ const vars = await resolveVars(ctx, auth);
5613
5615
  const tokenUrl = requestExec.interpolate(auth.oauth2TokenUrl ?? "", vars);
5614
5616
  const clientId = requestExec.interpolate(auth.oauth2ClientId ?? "", vars);
5615
5617
  let clientSecret = auth.oauth2ClientSecret ?? "";
@@ -7301,7 +7303,7 @@ function isNewer(a, b) {
7301
7303
  return a2 > b2;
7302
7304
  }
7303
7305
  async function checkForUpdate() {
7304
- const current = "0.7.9";
7306
+ const current = "0.8.0";
7305
7307
  try {
7306
7308
  const res = await fetch(REGISTRY_URL, { signal: AbortSignal.timeout(4e3) });
7307
7309
  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-CgyqbNWk.js");
4
+ const requestExec = require("./chunks/request-exec-CEmSNDIG.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-Co_5unBR.js");
3
- const requestExec = require("./chunks/request-exec-CgyqbNWk.js");
2
+ const perfRun = require("./chunks/perf-run-D02WoC6i.js");
3
+ const requestExec = require("./chunks/request-exec-CEmSNDIG.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,10 +2,10 @@
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-CgyqbNWk.js");
5
+ const requestExec = require("./chunks/request-exec-CEmSNDIG.js");
6
6
  const environments = require("./chunks/environments-iM3SUM-4.js");
7
7
  const flowEngine = require("./chunks/flow-engine-BxwjEy37.js");
8
- const perfRun = require("./chunks/perf-run-Co_5unBR.js");
8
+ const perfRun = require("./chunks/perf-run-D02WoC6i.js");
9
9
  const perfReport = require("./chunks/perf-report-ChaO3K0w.js");
10
10
  const cliCommon = require("./chunks/cli-common-GnihVSjU.js");
11
11
  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.7.9"}`;
194
+ const version = `v${"0.8.0"}`;
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));
@@ -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-CgyqbNWk.js");
5
+ const requestExec = require("./chunks/request-exec-CEmSNDIG.js");
6
6
  const escape = require("./chunks/escape-DDVAlOvZ.js");
7
7
  const requestCollection = require("./chunks/request-collection-gkOYlWml.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.7.9"}`;
554
+ const version = `v${"0.8.0"}`;
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, f as LRLanguage, s as styleTags, i as indentNodeProp, m as delimitedIndent, n as foldNodeProp, p as foldInside, S as StateField, q as LRParser, u as StateEffect, v as tags, a as reactExports, j as jsxRuntimeExports, d as ReactCodeMirror, o as oneDark, c as json } from "./codemirror-CdIFBPs2.js";
2
- import { u as useT, a as useStore, b as useActiveEnvironment, i as isSubscriptionQuery } from "./index-BUFSn_qD.js";
2
+ import { u as useT, a as useStore, b as useActiveEnvironment, i as isSubscriptionQuery } from "./index-CpSTmcc1.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, d as ReactCodeMirror, o as oneDark, x as xml } from "./codemirror-CdIFBPs2.js";
2
- import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-BUFSn_qD.js";
2
+ import { u as useT, c as btnPrimaryCls, d as commentKeymap } from "./index-CpSTmcc1.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-CXvLKrnv.js","./codemirror-CdIFBPs2.js","./ajv-CJPwFjiP.js","./SoapEditor-7hxhISPZ.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./GraphQLEditor-DG84rEn7.js","./codemirror-CdIFBPs2.js","./ajv-CJPwFjiP.js","./SoapEditor-eFNU1uxt.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, k as keymap, t as toggleComment, x as xml, c as json, d as ReactCodeMirror, o as oneDark, e as javascript } from "./codemirror-CdIFBPs2.js";
3
3
  import { r as requireAjv } from "./ajv-CJPwFjiP.js";
4
4
  var client = { exports: {} };
@@ -24891,7 +24891,7 @@ function Modal({
24891
24891
  subtitle,
24892
24892
  overlayClassName = DEFAULT_OVERLAY,
24893
24893
  panelClassName = DEFAULT_PANEL,
24894
- closeOnBackdrop = true,
24894
+ closeOnBackdrop = false,
24895
24895
  closeOnEscape = true,
24896
24896
  children: children2
24897
24897
  }) {
@@ -28427,8 +28427,8 @@ function jsonWithComments() {
28427
28427
  function xmlWithComments() {
28428
28428
  return [xml(), commentKeymap];
28429
28429
  }
28430
- const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-CXvLKrnv.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
28431
- const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-7hxhISPZ.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
28430
+ const GraphQLEditor = reactExports.lazy(() => __vitePreload(() => import("./GraphQLEditor-DG84rEn7.js"), true ? __vite__mapDeps([0,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.GraphQLEditor })));
28431
+ const SoapEditor = reactExports.lazy(() => __vitePreload(() => import("./SoapEditor-eFNU1uxt.js"), true ? __vite__mapDeps([3,1,2]) : void 0, import.meta.url).then((m) => ({ default: m.SoapEditor })));
28432
28432
  function BodyTab({ request: request2, onChange }) {
28433
28433
  const t2 = useT();
28434
28434
  const editorFallback = /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 text-xs text-surface-500", children: t2("Loading editor…") });
@@ -31315,11 +31315,10 @@ function AskVarsModal({ asks, requestName, onSubmit, onCancel }) {
31315
31315
  onCancel();
31316
31316
  }
31317
31317
  }
31318
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", onMouseDown: onCancel, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
31318
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
31319
31319
  "div",
31320
31320
  {
31321
31321
  className: "bg-surface-900 border border-surface-700 rounded-lg shadow-xl w-[420px] max-h-[80vh] flex flex-col",
31322
- onMouseDown: (e) => e.stopPropagation(),
31323
31322
  onKeyDown,
31324
31323
  children: [
31325
31324
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-4 py-3 border-b border-surface-800 flex-shrink-0", children: [
@@ -35877,7 +35876,7 @@ function WelcomeScreen() {
35877
35876
  )
35878
35877
  ] }),
35879
35878
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-surface-400 text-sm max-w-sm", children: t2("Local-first API testing with Robot Framework & Playwright code generation. Secrets stay on your machine.") }),
35880
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t2("version :version", { version: "0.7.9" }) })
35879
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[11px] mt-3", style: { color: "var(--text-muted)" }, children: t2("version :version", { version: "0.8.0" }) })
35881
35880
  ] }),
35882
35881
  /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3 w-64", children: [
35883
35882
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -56012,7 +56011,7 @@ function App() {
56012
56011
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { color: "#6aa3c8" }, children: "Spector" }),
56013
56012
  /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "ml-2 text-[10px] font-normal opacity-50", children: [
56014
56013
  "v",
56015
- "0.7.9"
56014
+ "0.8.0"
56016
56015
  ] }),
56017
56016
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "mx-2 opacity-30", children: "·" }),
56018
56017
  /* @__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-BUFSn_qD.js"></script>
8
+ <script type="module" crossorigin src="./assets/index-CpSTmcc1.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="./assets/codemirror-CdIFBPs2.js">
10
10
  <link rel="modulepreload" crossorigin href="./assets/ajv-CJPwFjiP.js">
11
11
  <link rel="stylesheet" crossorigin href="./assets/index-DkhdKzQJ.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.7.9",
4
+ "version": "0.8.0",
5
5
  "description": "Local-first API testing tool to inspect, test and mock APIs",
6
6
  "repository": {
7
7
  "type": "git",