@testsmith/api-spector-agent 0.4.8 → 0.5.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.
Files changed (2) hide show
  1. package/dist/index.cjs +667 -146
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -463,11 +463,11 @@ var require_dom = __commonJS({
463
463
  function splitOnASCIIWhitespace(input) {
464
464
  return input ? input.split(/[\t\n\f\r ]+/).filter(notEmptyString) : [];
465
465
  }
466
- function orderedSetReducer(current, element) {
467
- if (!current.hasOwnProperty(element)) {
468
- current[element] = true;
466
+ function orderedSetReducer(current2, element) {
467
+ if (!current2.hasOwnProperty(element)) {
468
+ current2[element] = true;
469
469
  }
470
- return current;
470
+ return current2;
471
471
  }
472
472
  function toOrderedSet(input) {
473
473
  if (!input) return [];
@@ -4709,9 +4709,9 @@ var require_dom_parser = __commonJS({
4709
4709
  }
4710
4710
  },
4711
4711
  endElement: function(namespaceURI, localName, qName) {
4712
- var current = this.currentElement;
4713
- var tagName = current.tagName;
4714
- this.currentElement = current.parentNode;
4712
+ var current2 = this.currentElement;
4713
+ var tagName = current2.tagName;
4714
+ this.currentElement = current2.parentNode;
4715
4715
  },
4716
4716
  startPrefixMapping: function(prefix, uri) {
4717
4717
  },
@@ -7472,9 +7472,9 @@ var require_dispatcher_base = __commonJS({
7472
7472
  }
7473
7473
  close(callback) {
7474
7474
  if (callback === void 0) {
7475
- return new Promise((resolve, reject) => {
7475
+ return new Promise((resolve4, reject) => {
7476
7476
  this.close((err, data) => {
7477
- return err ? reject(err) : resolve(data);
7477
+ return err ? reject(err) : resolve4(data);
7478
7478
  });
7479
7479
  });
7480
7480
  }
@@ -7512,9 +7512,9 @@ var require_dispatcher_base = __commonJS({
7512
7512
  err = null;
7513
7513
  }
7514
7514
  if (callback === void 0) {
7515
- return new Promise((resolve, reject) => {
7515
+ return new Promise((resolve4, reject) => {
7516
7516
  this.destroy(err, (err2, data) => {
7517
- return err2 ? reject(err2) : resolve(data);
7517
+ return err2 ? reject(err2) : resolve4(data);
7518
7518
  });
7519
7519
  });
7520
7520
  }
@@ -10991,8 +10991,8 @@ var require_promise = __commonJS({
10991
10991
  function createDeferredPromise() {
10992
10992
  let res;
10993
10993
  let rej;
10994
- const promise = new Promise((resolve, reject) => {
10995
- res = resolve;
10994
+ const promise = new Promise((resolve4, reject) => {
10995
+ res = resolve4;
10996
10996
  rej = reject;
10997
10997
  });
10998
10998
  return { promise, resolve: res, reject: rej };
@@ -12293,12 +12293,12 @@ upgrade: ${upgrade}\r
12293
12293
  cb();
12294
12294
  }
12295
12295
  }
12296
- const waitForDrain = () => new Promise((resolve, reject) => {
12296
+ const waitForDrain = () => new Promise((resolve4, reject) => {
12297
12297
  assert(callback === null);
12298
12298
  if (socket[kError]) {
12299
12299
  reject(socket[kError]);
12300
12300
  } else {
12301
- callback = resolve;
12301
+ callback = resolve4;
12302
12302
  }
12303
12303
  });
12304
12304
  socket.on("close", onDrain).on("drain", onDrain);
@@ -13143,12 +13143,12 @@ var require_client_h2 = __commonJS({
13143
13143
  cb();
13144
13144
  }
13145
13145
  }
13146
- const waitForDrain = () => new Promise((resolve, reject) => {
13146
+ const waitForDrain = () => new Promise((resolve4, reject) => {
13147
13147
  assert(callback === null);
13148
13148
  if (socket[kError]) {
13149
13149
  reject(socket[kError]);
13150
13150
  } else {
13151
- callback = resolve;
13151
+ callback = resolve4;
13152
13152
  }
13153
13153
  });
13154
13154
  h2stream.on("close", onDrain).on("drain", onDrain);
@@ -13459,16 +13459,16 @@ var require_client = __commonJS({
13459
13459
  return this[kNeedDrain] < 2;
13460
13460
  }
13461
13461
  [kClose]() {
13462
- return new Promise((resolve) => {
13462
+ return new Promise((resolve4) => {
13463
13463
  if (this[kSize]) {
13464
- this[kClosedResolve] = resolve;
13464
+ this[kClosedResolve] = resolve4;
13465
13465
  } else {
13466
- resolve(null);
13466
+ resolve4(null);
13467
13467
  }
13468
13468
  });
13469
13469
  }
13470
13470
  [kDestroy](err) {
13471
- return new Promise((resolve) => {
13471
+ return new Promise((resolve4) => {
13472
13472
  const requests = this[kQueue].splice(this[kPendingIdx]);
13473
13473
  for (let i68 = 0; i68 < requests.length; i68++) {
13474
13474
  const request = requests[i68];
@@ -13479,7 +13479,7 @@ var require_client = __commonJS({
13479
13479
  this[kClosedResolve]();
13480
13480
  this[kClosedResolve] = null;
13481
13481
  }
13482
- resolve(null);
13482
+ resolve4(null);
13483
13483
  };
13484
13484
  if (this[kHTTPContext]) {
13485
13485
  this[kHTTPContext].destroy(err, callback);
@@ -13879,8 +13879,8 @@ var require_pool_base = __commonJS({
13879
13879
  }
13880
13880
  return Promise.all(closeAll);
13881
13881
  } else {
13882
- return new Promise((resolve) => {
13883
- this[kClosedResolve] = resolve;
13882
+ return new Promise((resolve4) => {
13883
+ this[kClosedResolve] = resolve4;
13884
13884
  });
13885
13885
  }
13886
13886
  }
@@ -14972,10 +14972,10 @@ var require_socks5_proxy_agent = __commonJS({
14972
14972
  const proxyHost = this[kProxyUrl].hostname;
14973
14973
  const proxyPort = parseInt(this[kProxyUrl].port) || 1080;
14974
14974
  debug("creating SOCKS5 connection to", proxyHost, proxyPort);
14975
- const socket = await new Promise((resolve, reject) => {
14975
+ const socket = await new Promise((resolve4, reject) => {
14976
14976
  const onConnect = () => {
14977
14977
  socket2.removeListener("error", onError);
14978
- resolve(socket2);
14978
+ resolve4(socket2);
14979
14979
  };
14980
14980
  const onError = (err) => {
14981
14981
  socket2.removeListener("connect", onConnect);
@@ -14994,14 +14994,14 @@ var require_socks5_proxy_agent = __commonJS({
14994
14994
  socket.destroy();
14995
14995
  });
14996
14996
  await socks5Client.handshake();
14997
- await new Promise((resolve, reject) => {
14997
+ await new Promise((resolve4, reject) => {
14998
14998
  const timeout = setTimeout(() => {
14999
14999
  reject(new Error("SOCKS5 authentication timeout"));
15000
15000
  }, 5e3);
15001
15001
  const onAuthenticated = () => {
15002
15002
  clearTimeout(timeout);
15003
15003
  socks5Client.removeListener("error", onError);
15004
- resolve();
15004
+ resolve4();
15005
15005
  };
15006
15006
  const onError = (err) => {
15007
15007
  clearTimeout(timeout);
@@ -15010,14 +15010,14 @@ var require_socks5_proxy_agent = __commonJS({
15010
15010
  };
15011
15011
  if (socks5Client.state === "authenticated") {
15012
15012
  clearTimeout(timeout);
15013
- resolve();
15013
+ resolve4();
15014
15014
  } else {
15015
15015
  socks5Client.once("authenticated", onAuthenticated);
15016
15016
  socks5Client.once("error", onError);
15017
15017
  }
15018
15018
  });
15019
15019
  await socks5Client.connect(targetHost, targetPort);
15020
- await new Promise((resolve, reject) => {
15020
+ await new Promise((resolve4, reject) => {
15021
15021
  const timeout = setTimeout(() => {
15022
15022
  reject(new Error("SOCKS5 connection timeout"));
15023
15023
  }, 5e3);
@@ -15025,7 +15025,7 @@ var require_socks5_proxy_agent = __commonJS({
15025
15025
  debug("SOCKS5 tunnel established to", targetHost, targetPort, "via", info);
15026
15026
  clearTimeout(timeout);
15027
15027
  socks5Client.removeListener("error", onError);
15028
- resolve();
15028
+ resolve4();
15029
15029
  };
15030
15030
  const onError = (err) => {
15031
15031
  clearTimeout(timeout);
@@ -15066,8 +15066,8 @@ var require_socks5_proxy_agent = __commonJS({
15066
15066
  servername: targetHost,
15067
15067
  ...connectOpts.tls || {}
15068
15068
  });
15069
- await new Promise((resolve, reject) => {
15070
- finalSocket.once("secureConnect", resolve);
15069
+ await new Promise((resolve4, reject) => {
15070
+ finalSocket.once("secureConnect", resolve4);
15071
15071
  finalSocket.once("error", reject);
15072
15072
  });
15073
15073
  }
@@ -16092,7 +16092,7 @@ var require_readable = __commonJS({
16092
16092
  if (this._readableState.closeEmitted) {
16093
16093
  return Promise.resolve(null);
16094
16094
  }
16095
- return new Promise((resolve, reject) => {
16095
+ return new Promise((resolve4, reject) => {
16096
16096
  if (this[kContentLength] && this[kContentLength] > limit || this[kBytesRead] > limit) {
16097
16097
  this.destroy(new AbortError());
16098
16098
  }
@@ -16106,11 +16106,11 @@ var require_readable = __commonJS({
16106
16106
  if (signal.aborted) {
16107
16107
  reject(signal.reason ?? new AbortError());
16108
16108
  } else {
16109
- resolve(null);
16109
+ resolve4(null);
16110
16110
  }
16111
16111
  });
16112
16112
  } else {
16113
- this.on("close", resolve);
16113
+ this.on("close", resolve4);
16114
16114
  }
16115
16115
  this.on("error", noop).on("data", () => {
16116
16116
  if (this[kBytesRead] > limit) {
@@ -16138,7 +16138,7 @@ var require_readable = __commonJS({
16138
16138
  }
16139
16139
  function consume(stream, type) {
16140
16140
  assert(!stream[kConsume]);
16141
- return new Promise((resolve, reject) => {
16141
+ return new Promise((resolve4, reject) => {
16142
16142
  if (isUnusable(stream)) {
16143
16143
  const rState = stream._readableState;
16144
16144
  if (rState.destroyed && rState.closeEmitted === false) {
@@ -16153,7 +16153,7 @@ var require_readable = __commonJS({
16153
16153
  stream[kConsume] = {
16154
16154
  type,
16155
16155
  stream,
16156
- resolve,
16156
+ resolve: resolve4,
16157
16157
  reject,
16158
16158
  length: 0,
16159
16159
  body: []
@@ -16227,18 +16227,18 @@ var require_readable = __commonJS({
16227
16227
  return buffer;
16228
16228
  }
16229
16229
  function consumeEnd(consume2, encoding) {
16230
- const { type, body, resolve, stream, length } = consume2;
16230
+ const { type, body, resolve: resolve4, stream, length } = consume2;
16231
16231
  try {
16232
16232
  if (type === "text") {
16233
- resolve(chunksDecode(body, length, encoding));
16233
+ resolve4(chunksDecode(body, length, encoding));
16234
16234
  } else if (type === "json") {
16235
- resolve(JSON.parse(chunksDecode(body, length, encoding)));
16235
+ resolve4(JSON.parse(chunksDecode(body, length, encoding)));
16236
16236
  } else if (type === "arrayBuffer") {
16237
- resolve(chunksConcat(body, length).buffer);
16237
+ resolve4(chunksConcat(body, length).buffer);
16238
16238
  } else if (type === "blob") {
16239
- resolve(new Blob(body, { type: stream[kContentType] }));
16239
+ resolve4(new Blob(body, { type: stream[kContentType] }));
16240
16240
  } else if (type === "bytes") {
16241
- resolve(chunksConcat(body, length));
16241
+ resolve4(chunksConcat(body, length));
16242
16242
  }
16243
16243
  consumeFinish(consume2);
16244
16244
  } catch (err) {
@@ -16428,9 +16428,9 @@ var require_api_request = __commonJS({
16428
16428
  };
16429
16429
  function request(opts, callback) {
16430
16430
  if (callback === void 0) {
16431
- return new Promise((resolve, reject) => {
16431
+ return new Promise((resolve4, reject) => {
16432
16432
  request.call(this, opts, (err, data) => {
16433
- return err ? reject(err) : resolve(data);
16433
+ return err ? reject(err) : resolve4(data);
16434
16434
  });
16435
16435
  });
16436
16436
  }
@@ -16642,9 +16642,9 @@ var require_api_stream = __commonJS({
16642
16642
  };
16643
16643
  function stream(opts, factory, callback) {
16644
16644
  if (callback === void 0) {
16645
- return new Promise((resolve, reject) => {
16645
+ return new Promise((resolve4, reject) => {
16646
16646
  stream.call(this, opts, factory, (err, data) => {
16647
- return err ? reject(err) : resolve(data);
16647
+ return err ? reject(err) : resolve4(data);
16648
16648
  });
16649
16649
  });
16650
16650
  }
@@ -16932,9 +16932,9 @@ var require_api_upgrade = __commonJS({
16932
16932
  };
16933
16933
  function upgrade(opts, callback) {
16934
16934
  if (callback === void 0) {
16935
- return new Promise((resolve, reject) => {
16935
+ return new Promise((resolve4, reject) => {
16936
16936
  upgrade.call(this, opts, (err, data) => {
16937
- return err ? reject(err) : resolve(data);
16937
+ return err ? reject(err) : resolve4(data);
16938
16938
  });
16939
16939
  });
16940
16940
  }
@@ -17027,9 +17027,9 @@ var require_api_connect = __commonJS({
17027
17027
  };
17028
17028
  function connect(opts, callback) {
17029
17029
  if (callback === void 0) {
17030
- return new Promise((resolve, reject) => {
17030
+ return new Promise((resolve4, reject) => {
17031
17031
  connect.call(this, opts, (err, data) => {
17032
- return err ? reject(err) : resolve(data);
17032
+ return err ? reject(err) : resolve4(data);
17033
17033
  });
17034
17034
  });
17035
17035
  }
@@ -18297,7 +18297,7 @@ var require_snapshot_recorder = __commonJS({
18297
18297
  "node_modules/undici/lib/mock/snapshot-recorder.js"(exports2, module2) {
18298
18298
  "use strict";
18299
18299
  var { writeFile: writeFile2, readFile: readFile4, mkdir } = require("node:fs/promises");
18300
- var { dirname, resolve } = require("node:path");
18300
+ var { dirname, resolve: resolve4 } = require("node:path");
18301
18301
  var { setTimeout: setTimeout2, clearTimeout: clearTimeout2 } = require("node:timers");
18302
18302
  var { InvalidArgumentError, UndiciError } = require_errors();
18303
18303
  var { hashId, isUrlExcludedFactory, normalizeHeaders, createHeaderFilters } = require_snapshot_utils();
@@ -18498,7 +18498,7 @@ var require_snapshot_recorder = __commonJS({
18498
18498
  throw new InvalidArgumentError("Snapshot path is required");
18499
18499
  }
18500
18500
  try {
18501
- const data = await readFile4(resolve(path), "utf8");
18501
+ const data = await readFile4(resolve4(path), "utf8");
18502
18502
  const parsed = JSON.parse(data);
18503
18503
  if (Array.isArray(parsed)) {
18504
18504
  this.#snapshots.clear();
@@ -18527,7 +18527,7 @@ var require_snapshot_recorder = __commonJS({
18527
18527
  if (!path) {
18528
18528
  throw new InvalidArgumentError("Snapshot path is required");
18529
18529
  }
18530
- const resolvedPath = resolve(path);
18530
+ const resolvedPath = resolve4(path);
18531
18531
  await mkdir(dirname(resolvedPath), { recursive: true });
18532
18532
  const data = Array.from(this.#snapshots.entries()).map(([hash, snapshot]) => ({
18533
18533
  hash,
@@ -25365,7 +25365,7 @@ var require_fetch = __commonJS({
25365
25365
  const agent = fetchParams.controller.dispatcher;
25366
25366
  const path = url.pathname + url.search;
25367
25367
  const hasTrailingQuestionMark = url.search.length === 0 && url.href[url.href.length - url.hash.length - 1] === "?";
25368
- return new Promise((resolve, reject) => agent.dispatch(
25368
+ return new Promise((resolve4, reject) => agent.dispatch(
25369
25369
  {
25370
25370
  path: hasTrailingQuestionMark ? `${path}?` : path,
25371
25371
  origin: url.origin,
@@ -25445,7 +25445,7 @@ var require_fetch = __commonJS({
25445
25445
  }
25446
25446
  }
25447
25447
  const onError = this.onError.bind(this);
25448
- resolve({
25448
+ resolve4({
25449
25449
  status,
25450
25450
  statusText,
25451
25451
  headersList,
@@ -25498,7 +25498,7 @@ var require_fetch = __commonJS({
25498
25498
  headersList.append(headerName, String(value), true);
25499
25499
  }
25500
25500
  }
25501
- resolve({
25501
+ resolve4({
25502
25502
  status,
25503
25503
  statusText: STATUS_CODES2[status],
25504
25504
  headersList,
@@ -25514,7 +25514,7 @@ var require_fetch = __commonJS({
25514
25514
  for (let i68 = 0; i68 < rawHeaders.length; i68 += 2) {
25515
25515
  headersList.append(bufferToLowerCasedHeaderName(rawHeaders[i68]), rawHeaders[i68 + 1].toString("latin1"), true);
25516
25516
  }
25517
- resolve({
25517
+ resolve4({
25518
25518
  status,
25519
25519
  statusText: STATUS_CODES2[status],
25520
25520
  headersList,
@@ -25901,8 +25901,8 @@ var require_cache3 = __commonJS({
25901
25901
  * @returns {requestResponseList}
25902
25902
  */
25903
25903
  #batchCacheOperations(operations) {
25904
- const cache = this.#relevantRequestResponseList;
25905
- const backupCache = [...cache];
25904
+ const cache2 = this.#relevantRequestResponseList;
25905
+ const backupCache = [...cache2];
25906
25906
  const addedItems = [];
25907
25907
  const resultList = [];
25908
25908
  try {
@@ -25929,9 +25929,9 @@ var require_cache3 = __commonJS({
25929
25929
  return [];
25930
25930
  }
25931
25931
  for (const requestResponse of requestResponses) {
25932
- const idx = cache.indexOf(requestResponse);
25932
+ const idx = cache2.indexOf(requestResponse);
25933
25933
  assert(idx !== -1);
25934
- cache.splice(idx, 1);
25934
+ cache2.splice(idx, 1);
25935
25935
  }
25936
25936
  } else if (operation.type === "put") {
25937
25937
  if (operation.response == null) {
@@ -25961,11 +25961,11 @@ var require_cache3 = __commonJS({
25961
25961
  }
25962
25962
  requestResponses = this.#queryCache(operation.request);
25963
25963
  for (const requestResponse of requestResponses) {
25964
- const idx = cache.indexOf(requestResponse);
25964
+ const idx = cache2.indexOf(requestResponse);
25965
25965
  assert(idx !== -1);
25966
- cache.splice(idx, 1);
25966
+ cache2.splice(idx, 1);
25967
25967
  }
25968
- cache.push([operation.request, operation.response]);
25968
+ cache2.push([operation.request, operation.response]);
25969
25969
  addedItems.push([operation.request, operation.response]);
25970
25970
  }
25971
25971
  resultList.push([operation.request, operation.response]);
@@ -26142,13 +26142,13 @@ var require_cachestorage = __commonJS({
26142
26142
  if (options.cacheName != null) {
26143
26143
  if (this.#caches.has(options.cacheName)) {
26144
26144
  const cacheList = this.#caches.get(options.cacheName);
26145
- const cache = new Cache(kConstruct, cacheList);
26146
- return await cache.match(request, options);
26145
+ const cache2 = new Cache(kConstruct, cacheList);
26146
+ return await cache2.match(request, options);
26147
26147
  }
26148
26148
  } else {
26149
26149
  for (const cacheList of this.#caches.values()) {
26150
- const cache = new Cache(kConstruct, cacheList);
26151
- const response = await cache.match(request, options);
26150
+ const cache2 = new Cache(kConstruct, cacheList);
26151
+ const response = await cache2.match(request, options);
26152
26152
  if (response !== void 0) {
26153
26153
  return response;
26154
26154
  }
@@ -26178,12 +26178,12 @@ var require_cachestorage = __commonJS({
26178
26178
  webidl.argumentLengthCheck(arguments, 1, prefix);
26179
26179
  cacheName = webidl.converters.DOMString(cacheName, prefix, "cacheName");
26180
26180
  if (this.#caches.has(cacheName)) {
26181
- const cache2 = this.#caches.get(cacheName);
26182
- return new Cache(kConstruct, cache2);
26181
+ const cache3 = this.#caches.get(cacheName);
26182
+ return new Cache(kConstruct, cache3);
26183
26183
  }
26184
- const cache = [];
26185
- this.#caches.set(cacheName, cache);
26186
- return new Cache(kConstruct, cache);
26184
+ const cache2 = [];
26185
+ this.#caches.set(cacheName, cache2);
26186
+ return new Cache(kConstruct, cache2);
26187
26187
  }
26188
26188
  /**
26189
26189
  * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete
@@ -40543,20 +40543,20 @@ var require_compile = __commonJS({
40543
40543
  var util_1 = require_util7();
40544
40544
  var validate_1 = require_validate();
40545
40545
  var SchemaEnv = class {
40546
- constructor(env) {
40546
+ constructor(env5) {
40547
40547
  var _a3;
40548
40548
  this.refs = {};
40549
40549
  this.dynamicAnchors = {};
40550
40550
  let schema;
40551
- if (typeof env.schema == "object")
40552
- schema = env.schema;
40553
- this.schema = env.schema;
40554
- this.schemaId = env.schemaId;
40555
- this.root = env.root || this;
40556
- this.baseId = (_a3 = env.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env.schemaId || "$id"]);
40557
- this.schemaPath = env.schemaPath;
40558
- this.localRefs = env.localRefs;
40559
- this.meta = env.meta;
40551
+ if (typeof env5.schema == "object")
40552
+ schema = env5.schema;
40553
+ this.schema = env5.schema;
40554
+ this.schemaId = env5.schemaId;
40555
+ this.root = env5.root || this;
40556
+ this.baseId = (_a3 = env5.baseId) !== null && _a3 !== void 0 ? _a3 : (0, resolve_1.normalizeId)(schema === null || schema === void 0 ? void 0 : schema[env5.schemaId || "$id"]);
40557
+ this.schemaPath = env5.schemaPath;
40558
+ this.localRefs = env5.localRefs;
40559
+ this.meta = env5.meta;
40560
40560
  this.$async = schema === null || schema === void 0 ? void 0 : schema.$async;
40561
40561
  this.refs = {};
40562
40562
  }
@@ -40654,7 +40654,7 @@ var require_compile = __commonJS({
40654
40654
  const schOrFunc = root.refs[ref];
40655
40655
  if (schOrFunc)
40656
40656
  return schOrFunc;
40657
- let _sch = resolve.call(this, root, ref);
40657
+ let _sch = resolve4.call(this, root, ref);
40658
40658
  if (_sch === void 0) {
40659
40659
  const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
40660
40660
  const { schemaId } = this.opts;
@@ -40681,7 +40681,7 @@ var require_compile = __commonJS({
40681
40681
  function sameSchemaEnv(s1, s210) {
40682
40682
  return s1.schema === s210.schema && s1.root === s210.root && s1.baseId === s210.baseId;
40683
40683
  }
40684
- function resolve(root, ref) {
40684
+ function resolve4(root, ref) {
40685
40685
  let sch;
40686
40686
  while (typeof (sch = this.refs[ref]) == "string")
40687
40687
  ref = sch;
@@ -40740,15 +40740,15 @@ var require_compile = __commonJS({
40740
40740
  baseId = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schId);
40741
40741
  }
40742
40742
  }
40743
- let env;
40743
+ let env5;
40744
40744
  if (typeof schema != "boolean" && schema.$ref && !(0, util_1.schemaHasRulesButRef)(schema, this.RULES)) {
40745
40745
  const $ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, schema.$ref);
40746
- env = resolveSchema.call(this, root, $ref);
40746
+ env5 = resolveSchema.call(this, root, $ref);
40747
40747
  }
40748
40748
  const { schemaId } = this.opts;
40749
- env = env || new SchemaEnv({ schema, schemaId, root, baseId });
40750
- if (env.schema !== env.root.schema)
40751
- return env;
40749
+ env5 = env5 || new SchemaEnv({ schema, schemaId, root, baseId });
40750
+ if (env5.schema !== env5.root.schema)
40751
+ return env5;
40752
40752
  return void 0;
40753
40753
  }
40754
40754
  }
@@ -41256,7 +41256,7 @@ var require_fast_uri = __commonJS({
41256
41256
  }
41257
41257
  return uri;
41258
41258
  }
41259
- function resolve(baseURI, relativeURI, options) {
41259
+ function resolve4(baseURI, relativeURI, options) {
41260
41260
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
41261
41261
  const resolved = resolveComponent(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true);
41262
41262
  schemelessOptions.skipEscape = true;
@@ -41483,7 +41483,7 @@ var require_fast_uri = __commonJS({
41483
41483
  var fastUri = {
41484
41484
  SCHEMES,
41485
41485
  normalize,
41486
- resolve,
41486
+ resolve: resolve4,
41487
41487
  resolveComponent,
41488
41488
  equal,
41489
41489
  serialize,
@@ -42149,8 +42149,8 @@ var require_ref = __commonJS({
42149
42149
  schemaType: "string",
42150
42150
  code(cxt) {
42151
42151
  const { gen, schema: $ref, it: it4 } = cxt;
42152
- const { baseId, schemaEnv: env, validateName, opts, self: self2 } = it4;
42153
- const { root } = env;
42152
+ const { baseId, schemaEnv: env5, validateName, opts, self: self2 } = it4;
42153
+ const { root } = env5;
42154
42154
  if (($ref === "#" || $ref === "#/") && baseId === root.baseId)
42155
42155
  return callRootRef();
42156
42156
  const schOrEnv = compile_1.resolveRef.call(self2, root, baseId, $ref);
@@ -42160,8 +42160,8 @@ var require_ref = __commonJS({
42160
42160
  return callValidate(schOrEnv);
42161
42161
  return inlineRefSchema(schOrEnv);
42162
42162
  function callRootRef() {
42163
- if (env === root)
42164
- return callRef(cxt, validateName, env, env.$async);
42163
+ if (env5 === root)
42164
+ return callRef(cxt, validateName, env5, env5.$async);
42165
42165
  const rootName = gen.scopeValue("root", { ref: root });
42166
42166
  return callRef(cxt, (0, codegen_1._)`${rootName}.validate`, root, root.$async);
42167
42167
  }
@@ -42191,14 +42191,14 @@ var require_ref = __commonJS({
42191
42191
  exports2.getValidate = getValidate;
42192
42192
  function callRef(cxt, v60, sch, $async) {
42193
42193
  const { gen, it: it4 } = cxt;
42194
- const { allErrors, schemaEnv: env, opts } = it4;
42194
+ const { allErrors, schemaEnv: env5, opts } = it4;
42195
42195
  const passCxt = opts.passContext ? names_1.default.this : codegen_1.nil;
42196
42196
  if ($async)
42197
42197
  callAsyncRef();
42198
42198
  else
42199
42199
  callSyncRef();
42200
42200
  function callAsyncRef() {
42201
- if (!env.$async)
42201
+ if (!env5.$async)
42202
42202
  throw new Error("async schema referenced by sync schema");
42203
42203
  const valid = gen.let("valid");
42204
42204
  gen.try(() => {
@@ -44338,6 +44338,479 @@ async function readStream(body, kind, startMs, opts = {}) {
44338
44338
  return { events, text, close, firstEventMs: firstEventMs < 0 ? 0 : firstEventMs };
44339
44339
  }
44340
44340
 
44341
+ // src/main/secrets/registry.ts
44342
+ var providers = /* @__PURE__ */ new Map();
44343
+ function registerSecretProvider(provider) {
44344
+ providers.set(provider.scheme.toLowerCase(), provider);
44345
+ }
44346
+ function schemeOf(ref) {
44347
+ const m75 = /^([a-z][a-z0-9+.-]*):/i.exec(ref);
44348
+ if (!m75) return null;
44349
+ const scheme = m75[1].toLowerCase();
44350
+ return providers.has(scheme) ? scheme : null;
44351
+ }
44352
+ function hasSecretScheme(ref) {
44353
+ return schemeOf(ref) !== null;
44354
+ }
44355
+ async function resolveExternalSecret(ref, ctx = {}) {
44356
+ const scheme = schemeOf(ref);
44357
+ if (!scheme) return null;
44358
+ const provider = providers.get(scheme);
44359
+ const refBody = ref.slice(scheme.length + 1);
44360
+ return provider.resolve(refBody, ctx);
44361
+ }
44362
+
44363
+ // src/main/secrets/providers/vault.ts
44364
+ var import_node_fs = require("node:fs");
44365
+ var import_node_os = require("node:os");
44366
+ var import_node_path = require("node:path");
44367
+
44368
+ // src/main/secrets/config.ts
44369
+ var current;
44370
+ function getSecretsConfig() {
44371
+ return current;
44372
+ }
44373
+
44374
+ // src/main/secrets/providers/vault.ts
44375
+ function env(...names) {
44376
+ for (const n63 of names) {
44377
+ const v60 = process.env[n63];
44378
+ if (v60 !== void 0 && v60 !== "") return v60;
44379
+ }
44380
+ return void 0;
44381
+ }
44382
+ function readFileTrim(path) {
44383
+ try {
44384
+ return (0, import_node_fs.readFileSync)(path, "utf8").trim() || void 0;
44385
+ } catch {
44386
+ return void 0;
44387
+ }
44388
+ }
44389
+ function resolveConn() {
44390
+ const cfg = getSecretsConfig()?.vault ?? {};
44391
+ const address = env("VAULT_ADDR", "API_SPECTOR_VAULT_ADDR") ?? cfg.address;
44392
+ if (!address) {
44393
+ throw new Error("Vault is not configured: set VAULT_ADDR (or settings.secrets.vault.address)");
44394
+ }
44395
+ const token = env("VAULT_TOKEN", "API_SPECTOR_VAULT_TOKEN") ?? readFileTrim((0, import_node_path.join)((0, import_node_os.homedir)(), ".vault-token"));
44396
+ const roleId = env("VAULT_ROLE_ID", "API_SPECTOR_VAULT_ROLE_ID") ?? cfg.roleId;
44397
+ const secretId = env("VAULT_SECRET_ID", "API_SPECTOR_VAULT_SECRET_ID");
44398
+ const jwt = env("VAULT_JWT", "API_SPECTOR_VAULT_JWT") ?? (env("VAULT_JWT_PATH", "API_SPECTOR_VAULT_JWT_PATH") ? readFileTrim(env("VAULT_JWT_PATH", "API_SPECTOR_VAULT_JWT_PATH")) : void 0);
44399
+ const jwtRole = env("VAULT_JWT_ROLE", "API_SPECTOR_VAULT_JWT_ROLE") ?? cfg.jwtRole;
44400
+ const explicit = env("VAULT_AUTH_METHOD", "API_SPECTOR_VAULT_AUTH_METHOD") ?? cfg.authMethod;
44401
+ const authMethod = explicit ?? (token ? "token" : roleId ? "approle" : jwt ? "jwt" : "token");
44402
+ return {
44403
+ address: address.replace(/\/+$/, ""),
44404
+ namespace: env("VAULT_NAMESPACE", "API_SPECTOR_VAULT_NAMESPACE") ?? cfg.namespace,
44405
+ authMethod,
44406
+ token,
44407
+ roleId,
44408
+ secretId,
44409
+ jwt,
44410
+ jwtRole,
44411
+ loginMount: cfg.loginMount,
44412
+ kvVersion: env("VAULT_KV_VERSION", "API_SPECTOR_VAULT_KV_VERSION") ?? cfg.kvVersion ?? "auto",
44413
+ skipVerify: (env("VAULT_SKIP_VERIFY", "API_SPECTOR_VAULT_SKIP_VERIFY") ?? "").toLowerCase() === "true" || cfg.skipVerify === true,
44414
+ caPath: env("VAULT_CACERT", "API_SPECTOR_VAULT_CACERT")
44415
+ };
44416
+ }
44417
+ var cachedToken = null;
44418
+ var secretCache = /* @__PURE__ */ new Map();
44419
+ var _dispatcher;
44420
+ var _dispatcherKey = "";
44421
+ async function dispatcherFor(conn) {
44422
+ if (!conn.skipVerify && !conn.caPath) return void 0;
44423
+ const key = `${conn.skipVerify}|${conn.caPath ?? ""}`;
44424
+ if (_dispatcher && _dispatcherKey === key) return _dispatcher;
44425
+ const { Agent: Agent2 } = await Promise.resolve().then(() => __toESM(require_undici()));
44426
+ const connect = {};
44427
+ if (conn.skipVerify) connect.rejectUnauthorized = false;
44428
+ if (conn.caPath) {
44429
+ const ca7 = readFileTrim(conn.caPath);
44430
+ if (ca7) connect.ca = ca7;
44431
+ }
44432
+ _dispatcher = new Agent2({ connect });
44433
+ _dispatcherKey = key;
44434
+ return _dispatcher;
44435
+ }
44436
+ async function vaultFetch(conn, path, init = {}) {
44437
+ const headers = { ...init.headers };
44438
+ if (conn.namespace) headers["X-Vault-Namespace"] = conn.namespace;
44439
+ if (init.token) headers["X-Vault-Token"] = init.token;
44440
+ const dispatcher = await dispatcherFor(conn);
44441
+ const res = await fetch(`${conn.address}/v1/${path}`, {
44442
+ ...init,
44443
+ headers,
44444
+ // undici honours `dispatcher`; the field is not in the DOM RequestInit type.
44445
+ ...dispatcher ? { dispatcher } : {}
44446
+ });
44447
+ if (!res.ok) {
44448
+ const body = await res.text().catch(() => "");
44449
+ throw new Error(`Vault ${res.status} on /v1/${path}: ${body.slice(0, 300)}`);
44450
+ }
44451
+ return res.json();
44452
+ }
44453
+ async function clientToken(conn) {
44454
+ if (conn.authMethod === "token") {
44455
+ if (!conn.token) {
44456
+ throw new Error("Vault token auth selected but no token found (set VAULT_TOKEN or run `vault login`)");
44457
+ }
44458
+ return conn.token;
44459
+ }
44460
+ const now = Date.now();
44461
+ if (cachedToken && cachedToken.expiresAt > now + 5e3) return cachedToken.value;
44462
+ let mount;
44463
+ let body;
44464
+ if (conn.authMethod === "approle") {
44465
+ if (!conn.roleId || !conn.secretId) {
44466
+ throw new Error("Vault AppRole auth needs VAULT_ROLE_ID and VAULT_SECRET_ID");
44467
+ }
44468
+ mount = conn.loginMount ?? "approle";
44469
+ body = { role_id: conn.roleId, secret_id: conn.secretId };
44470
+ } else {
44471
+ if (!conn.jwt || !conn.jwtRole) {
44472
+ throw new Error("Vault JWT/OIDC auth needs a JWT (VAULT_JWT or VAULT_JWT_PATH) and a role (VAULT_JWT_ROLE)");
44473
+ }
44474
+ mount = conn.loginMount ?? "jwt";
44475
+ body = { role: conn.jwtRole, jwt: conn.jwt };
44476
+ }
44477
+ const json = await vaultFetch(conn, `auth/${mount}/login`, {
44478
+ method: "POST",
44479
+ headers: { "content-type": "application/json" },
44480
+ body: JSON.stringify(body)
44481
+ });
44482
+ const token = json?.auth?.client_token;
44483
+ if (!token) throw new Error("Vault login did not return a client token");
44484
+ const ttl = Number(json?.auth?.lease_duration ?? 0);
44485
+ cachedToken = { value: token, expiresAt: ttl > 0 ? now + ttl * 1e3 : now + 5 * 6e4 };
44486
+ return token;
44487
+ }
44488
+ async function readSecret(refBody) {
44489
+ const hash = refBody.lastIndexOf("#");
44490
+ if (hash < 0) {
44491
+ throw new Error(`Vault reference must be 'vault:<path>#<key>' (got 'vault:${refBody}')`);
44492
+ }
44493
+ const path = refBody.slice(0, hash).replace(/^\/+/, "");
44494
+ const key = refBody.slice(hash + 1);
44495
+ if (!path || !key) {
44496
+ throw new Error(`Vault reference must be 'vault:<path>#<key>' (got 'vault:${refBody}')`);
44497
+ }
44498
+ const conn = resolveConn();
44499
+ const cacheKey = `${conn.address}|${conn.namespace ?? ""}|${path}`;
44500
+ const now = Date.now();
44501
+ let bag;
44502
+ const hit = secretCache.get(cacheKey);
44503
+ if (hit && hit.expiresAt > now) {
44504
+ bag = hit.bag;
44505
+ } else {
44506
+ const json = await vaultFetch(conn, path, { token: await clientToken(conn) });
44507
+ const isV2 = conn.kvVersion === "2" || conn.kvVersion === "auto" && json?.data?.data !== void 0 && json?.data?.metadata !== void 0;
44508
+ bag = isV2 ? json?.data?.data : json?.data;
44509
+ const lease = Number(json?.lease_duration ?? 0);
44510
+ if (bag) {
44511
+ secretCache.set(cacheKey, { bag, expiresAt: lease > 0 ? now + lease * 1e3 : now + 5 * 6e4 });
44512
+ }
44513
+ }
44514
+ if (!bag || !(key in bag)) {
44515
+ throw new Error(`Vault secret at '${path}' has no key '${key}'`);
44516
+ }
44517
+ return String(bag[key]);
44518
+ }
44519
+ var vaultProvider = {
44520
+ scheme: "vault",
44521
+ resolve: (refBody) => readSecret(refBody)
44522
+ };
44523
+
44524
+ // src/main/secrets/providers/sigv4.ts
44525
+ var import_node_crypto = require("node:crypto");
44526
+ function hmac(key, data) {
44527
+ return (0, import_node_crypto.createHmac)("sha256", key).update(data, "utf8").digest();
44528
+ }
44529
+ function sha256hex(data) {
44530
+ return (0, import_node_crypto.createHash)("sha256").update(data, "utf8").digest("hex");
44531
+ }
44532
+ function signSigV4(input) {
44533
+ const amzDate = input.now.toISOString().replace(/[:-]|\.\d{3}/g, "");
44534
+ const dateStamp = amzDate.slice(0, 8);
44535
+ const headers = { ...input.headers, host: input.host, "x-amz-date": amzDate };
44536
+ if (input.sessionToken) headers["x-amz-security-token"] = input.sessionToken;
44537
+ const lower = {};
44538
+ for (const k68 of Object.keys(headers)) lower[k68.toLowerCase()] = headers[k68].trim().replace(/\s+/g, " ");
44539
+ const sortedKeys = Object.keys(lower).sort();
44540
+ const canonicalHeaders = sortedKeys.map((k68) => `${k68}:${lower[k68]}
44541
+ `).join("");
44542
+ const signedHeaders = sortedKeys.join(";");
44543
+ const payloadHash = sha256hex(input.body);
44544
+ const canonicalRequest = [input.method, input.path, input.query ?? "", canonicalHeaders, signedHeaders, payloadHash].join("\n");
44545
+ const scope = `${dateStamp}/${input.region}/${input.service}/aws4_request`;
44546
+ const stringToSign = ["AWS4-HMAC-SHA256", amzDate, scope, sha256hex(canonicalRequest)].join("\n");
44547
+ const kDate = hmac(`AWS4${input.secretAccessKey}`, dateStamp);
44548
+ const kRegion = hmac(kDate, input.region);
44549
+ const kService = hmac(kRegion, input.service);
44550
+ const kSigning = hmac(kService, "aws4_request");
44551
+ const signature = (0, import_node_crypto.createHmac)("sha256", kSigning).update(stringToSign, "utf8").digest("hex");
44552
+ return {
44553
+ ...headers,
44554
+ Authorization: `AWS4-HMAC-SHA256 Credential=${input.accessKeyId}/${scope}, SignedHeaders=${signedHeaders}, Signature=${signature}`
44555
+ };
44556
+ }
44557
+
44558
+ // src/main/secrets/providers/aws.ts
44559
+ function env2(...names) {
44560
+ for (const n63 of names) {
44561
+ const v60 = process.env[n63];
44562
+ if (v60 !== void 0 && v60 !== "") return v60;
44563
+ }
44564
+ return void 0;
44565
+ }
44566
+ function resolveConn2() {
44567
+ const cfg = getSecretsConfig()?.aws ?? {};
44568
+ const region = env2("AWS_REGION", "AWS_DEFAULT_REGION", "API_SPECTOR_AWS_REGION") ?? cfg.region;
44569
+ const accessKeyId = env2("AWS_ACCESS_KEY_ID");
44570
+ const secretAccessKey = env2("AWS_SECRET_ACCESS_KEY");
44571
+ if (!region) throw new Error("AWS Secrets Manager: no region (set AWS_REGION or settings.secrets.aws.region)");
44572
+ if (!accessKeyId || !secretAccessKey) {
44573
+ throw new Error("AWS Secrets Manager: no credentials (set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY)");
44574
+ }
44575
+ return { region, accessKeyId, secretAccessKey, sessionToken: env2("AWS_SESSION_TOKEN") };
44576
+ }
44577
+ var cache = /* @__PURE__ */ new Map();
44578
+ async function getSecretString(conn, secretId) {
44579
+ const cacheKey = `${conn.region}|${secretId}`;
44580
+ const now = Date.now();
44581
+ const hit = cache.get(cacheKey);
44582
+ if (hit && hit.expiresAt > now) return hit.raw;
44583
+ const host = `secretsmanager.${conn.region}.amazonaws.com`;
44584
+ const body = JSON.stringify({ SecretId: secretId });
44585
+ const headers = signSigV4({
44586
+ method: "POST",
44587
+ host,
44588
+ path: "/",
44589
+ headers: {
44590
+ "content-type": "application/x-amz-json-1.1",
44591
+ "x-amz-target": "secretsmanager.GetSecretValue"
44592
+ },
44593
+ body,
44594
+ service: "secretsmanager",
44595
+ region: conn.region,
44596
+ accessKeyId: conn.accessKeyId,
44597
+ secretAccessKey: conn.secretAccessKey,
44598
+ sessionToken: conn.sessionToken,
44599
+ now: new Date(now)
44600
+ });
44601
+ const res = await fetch(`https://${host}/`, { method: "POST", headers, body });
44602
+ if (!res.ok) {
44603
+ const text = await res.text().catch(() => "");
44604
+ throw new Error(`AWS Secrets Manager ${res.status} for '${secretId}': ${text.slice(0, 300)}`);
44605
+ }
44606
+ const json = await res.json();
44607
+ const raw = json?.SecretString;
44608
+ if (raw === void 0) throw new Error(`AWS secret '${secretId}' has no SecretString (binary secrets are not supported)`);
44609
+ cache.set(cacheKey, { raw, expiresAt: now + 5 * 6e4 });
44610
+ return raw;
44611
+ }
44612
+ async function resolve(refBody) {
44613
+ const hash = refBody.lastIndexOf("#");
44614
+ const secretId = hash < 0 ? refBody : refBody.slice(0, hash);
44615
+ const key = hash < 0 ? null : refBody.slice(hash + 1);
44616
+ if (!secretId) throw new Error(`AWS reference must be 'aws:<secretId>[#<key>]' (got 'aws:${refBody}')`);
44617
+ const raw = await getSecretString(resolveConn2(), secretId);
44618
+ if (key === null) return raw;
44619
+ let parsed;
44620
+ try {
44621
+ parsed = JSON.parse(raw);
44622
+ } catch {
44623
+ throw new Error(`AWS secret '${secretId}' is not JSON, so key '${key}' cannot be read (drop the '#${key}')`);
44624
+ }
44625
+ if (!(key in parsed)) throw new Error(`AWS secret '${secretId}' has no key '${key}'`);
44626
+ return String(parsed[key]);
44627
+ }
44628
+ var awsSecretsProvider = {
44629
+ scheme: "aws",
44630
+ resolve: (refBody) => resolve(refBody)
44631
+ };
44632
+
44633
+ // src/main/secrets/providers/azure.ts
44634
+ function env3(...names) {
44635
+ for (const n63 of names) {
44636
+ const v60 = process.env[n63];
44637
+ if (v60 !== void 0 && v60 !== "") return v60;
44638
+ }
44639
+ return void 0;
44640
+ }
44641
+ function resolveConn3() {
44642
+ const cfg = getSecretsConfig()?.azure ?? {};
44643
+ const tenantId = env3("AZURE_TENANT_ID", "API_SPECTOR_AZURE_TENANT_ID") ?? cfg.tenantId;
44644
+ const clientId = env3("AZURE_CLIENT_ID", "API_SPECTOR_AZURE_CLIENT_ID") ?? cfg.clientId;
44645
+ const clientSecret = env3("AZURE_CLIENT_SECRET", "API_SPECTOR_AZURE_CLIENT_SECRET");
44646
+ if (!tenantId || !clientId || !clientSecret) {
44647
+ throw new Error("Azure Key Vault: set AZURE_TENANT_ID, AZURE_CLIENT_ID and AZURE_CLIENT_SECRET");
44648
+ }
44649
+ return { tenantId, clientId, clientSecret, defaultVault: cfg.vault };
44650
+ }
44651
+ var cachedToken2 = null;
44652
+ var secretCache2 = /* @__PURE__ */ new Map();
44653
+ async function accessToken(conn) {
44654
+ const now = Date.now();
44655
+ if (cachedToken2 && cachedToken2.expiresAt > now + 3e4) return cachedToken2.value;
44656
+ const form = new URLSearchParams({
44657
+ grant_type: "client_credentials",
44658
+ client_id: conn.clientId,
44659
+ client_secret: conn.clientSecret,
44660
+ scope: "https://vault.azure.net/.default"
44661
+ });
44662
+ const res = await fetch(`https://login.microsoftonline.com/${conn.tenantId}/oauth2/v2.0/token`, {
44663
+ method: "POST",
44664
+ headers: { "content-type": "application/x-www-form-urlencoded" },
44665
+ body: form.toString()
44666
+ });
44667
+ if (!res.ok) {
44668
+ const text = await res.text().catch(() => "");
44669
+ throw new Error(`Azure AD token ${res.status}: ${text.slice(0, 300)}`);
44670
+ }
44671
+ const json = await res.json();
44672
+ const token = json?.access_token;
44673
+ if (!token) throw new Error("Azure AD did not return an access token");
44674
+ const ttl = Number(json?.expires_in ?? 0);
44675
+ cachedToken2 = { value: token, expiresAt: ttl > 0 ? now + ttl * 1e3 : now + 5 * 6e4 };
44676
+ return token;
44677
+ }
44678
+ function secretUrl(refBody, defaultVault) {
44679
+ if (/^https?:\/\//i.test(refBody)) {
44680
+ return refBody.split("#")[0];
44681
+ }
44682
+ const parts = refBody.replace(/^\/+/, "").split("/");
44683
+ let vault;
44684
+ let name;
44685
+ let version = "";
44686
+ if (parts.length >= 2) {
44687
+ [vault, name, version = ""] = parts;
44688
+ } else if (parts.length === 1 && defaultVault) {
44689
+ vault = defaultVault;
44690
+ name = parts[0];
44691
+ } else {
44692
+ throw new Error(`Azure reference must be 'azure:<vault>/<secret>[/<version>]' (got 'azure:${refBody}')`);
44693
+ }
44694
+ const base = /^https?:\/\//i.test(vault) ? vault.replace(/\/+$/, "") : `https://${vault}.vault.azure.net`;
44695
+ const path = version ? `secrets/${name}/${version}` : `secrets/${name}`;
44696
+ return `${base}/${path}?api-version=7.4`;
44697
+ }
44698
+ async function resolve2(refBody) {
44699
+ const conn = resolveConn3();
44700
+ const url = secretUrl(refBody, conn.defaultVault);
44701
+ const now = Date.now();
44702
+ const hit = secretCache2.get(url);
44703
+ if (hit && hit.expiresAt > now) return hit.value;
44704
+ const res = await fetch(url, { headers: { authorization: `Bearer ${await accessToken(conn)}` } });
44705
+ if (!res.ok) {
44706
+ const text = await res.text().catch(() => "");
44707
+ throw new Error(`Azure Key Vault ${res.status} for '${refBody}': ${text.slice(0, 300)}`);
44708
+ }
44709
+ const json = await res.json();
44710
+ const value = json?.value;
44711
+ if (value === void 0) throw new Error(`Azure Key Vault secret '${refBody}' has no value`);
44712
+ secretCache2.set(url, { value, expiresAt: now + 5 * 6e4 });
44713
+ return value;
44714
+ }
44715
+ var azureKeyVaultProvider = {
44716
+ scheme: "azure",
44717
+ resolve: (refBody) => resolve2(refBody)
44718
+ };
44719
+
44720
+ // src/main/secrets/providers/onepassword.ts
44721
+ function env4(...names) {
44722
+ for (const n63 of names) {
44723
+ const v60 = process.env[n63];
44724
+ if (v60 !== void 0 && v60 !== "") return v60;
44725
+ }
44726
+ return void 0;
44727
+ }
44728
+ function resolveConn4() {
44729
+ const cfg = getSecretsConfig()?.onePassword ?? {};
44730
+ const host = env4("OP_CONNECT_HOST", "API_SPECTOR_OP_CONNECT_HOST") ?? cfg.connectHost;
44731
+ const token = env4("OP_CONNECT_TOKEN", "API_SPECTOR_OP_CONNECT_TOKEN");
44732
+ if (!host || !token) {
44733
+ throw new Error("1Password: set OP_CONNECT_HOST and OP_CONNECT_TOKEN (1Password Connect)");
44734
+ }
44735
+ return { host: host.replace(/\/+$/, ""), token };
44736
+ }
44737
+ var itemCache = /* @__PURE__ */ new Map();
44738
+ var idCache = /* @__PURE__ */ new Map();
44739
+ async function opGet(conn, path) {
44740
+ const res = await fetch(`${conn.host}${path}`, { headers: { authorization: `Bearer ${conn.token}` } });
44741
+ if (!res.ok) {
44742
+ const text = await res.text().catch(() => "");
44743
+ throw new Error(`1Password Connect ${res.status} on ${path}: ${text.slice(0, 300)}`);
44744
+ }
44745
+ return res.json();
44746
+ }
44747
+ var isId = (s71) => /^[a-z0-9]{26}$/i.test(s71);
44748
+ async function vaultId(conn, vault) {
44749
+ if (isId(vault)) return vault;
44750
+ const cacheKey = `vaults:${vault}`;
44751
+ const cached = idCache.get(cacheKey);
44752
+ if (cached) return cached;
44753
+ const list = await opGet(conn, `/v1/vaults?filter=${encodeURIComponent(`name eq "${vault}"`)}`);
44754
+ const id = Array.isArray(list) && list[0]?.id;
44755
+ if (!id) throw new Error(`1Password: vault '${vault}' not found`);
44756
+ idCache.set(cacheKey, id);
44757
+ return id;
44758
+ }
44759
+ async function itemId(conn, vid, item) {
44760
+ if (isId(item)) return item;
44761
+ const cacheKey = `items:${vid}:${item}`;
44762
+ const cached = idCache.get(cacheKey);
44763
+ if (cached) return cached;
44764
+ const list = await opGet(conn, `/v1/vaults/${vid}/items?filter=${encodeURIComponent(`title eq "${item}"`)}`);
44765
+ const id = Array.isArray(list) && list[0]?.id;
44766
+ if (!id) throw new Error(`1Password: item '${item}' not found in vault`);
44767
+ idCache.set(cacheKey, id);
44768
+ return id;
44769
+ }
44770
+ async function resolve3(refBody) {
44771
+ const parts = refBody.replace(/^\/\//, "").replace(/^\/+/, "").split("/").filter(Boolean);
44772
+ if (parts.length < 3) {
44773
+ throw new Error(`1Password reference must be 'op://<vault>/<item>/<field>' (got 'op:${refBody}')`);
44774
+ }
44775
+ const [vault, item, ...rest] = parts;
44776
+ const sectionLabel = rest.length >= 2 ? rest[0] : null;
44777
+ const fieldLabel = rest[rest.length - 1];
44778
+ const conn = resolveConn4();
44779
+ const vid = await vaultId(conn, vault);
44780
+ const iid = await itemId(conn, vid, item);
44781
+ const cacheKey = `${vid}/${iid}`;
44782
+ const now = Date.now();
44783
+ let fields;
44784
+ const hit = itemCache.get(cacheKey);
44785
+ if (hit && hit.expiresAt > now) {
44786
+ fields = hit.fields;
44787
+ } else {
44788
+ const doc = await opGet(conn, `/v1/vaults/${vid}/items/${iid}`);
44789
+ fields = Array.isArray(doc?.fields) ? doc.fields : [];
44790
+ itemCache.set(cacheKey, { fields, expiresAt: now + 5 * 6e4 });
44791
+ }
44792
+ const match = fields.find((f74) => {
44793
+ const labelOk = String(f74?.label ?? "").toLowerCase() === fieldLabel.toLowerCase() || f74?.id === fieldLabel;
44794
+ if (!labelOk) return false;
44795
+ if (!sectionLabel) return true;
44796
+ return String(f74?.section?.label ?? "").toLowerCase() === sectionLabel.toLowerCase();
44797
+ });
44798
+ if (!match || match.value === void 0) {
44799
+ throw new Error(`1Password: field '${fieldLabel}' not found on item '${item}'`);
44800
+ }
44801
+ return String(match.value);
44802
+ }
44803
+ var onePasswordProvider = {
44804
+ scheme: "op",
44805
+ resolve: (refBody) => resolve3(refBody)
44806
+ };
44807
+
44808
+ // src/main/secrets/index.ts
44809
+ registerSecretProvider(vaultProvider);
44810
+ registerSecretProvider(awsSecretsProvider);
44811
+ registerSecretProvider(azureKeyVaultProvider);
44812
+ registerSecretProvider(onePasswordProvider);
44813
+
44341
44814
  // src/main/ipc/secret-handler.ts
44342
44815
  var secretStore = {};
44343
44816
  function getSafeStorage() {
@@ -44350,6 +44823,9 @@ function getSafeStorage() {
44350
44823
  }
44351
44824
  }
44352
44825
  async function getSecret(ref) {
44826
+ if (hasSecretScheme(ref)) {
44827
+ return resolveExternalSecret(ref);
44828
+ }
44353
44829
  const stored = secretStore[ref];
44354
44830
  if (stored) {
44355
44831
  const ss = getSafeStorage();
@@ -44488,10 +44964,10 @@ var Hooks = class {
44488
44964
  * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.
44489
44965
  * @public
44490
44966
  */
44491
- run(name, env) {
44967
+ run(name, env5) {
44492
44968
  this[name] = this[name] || [];
44493
44969
  this[name].forEach(function(callback) {
44494
- callback.call(env && env.context ? env.context : env, env);
44970
+ callback.call(env5 && env5.context ? env5.context : env5, env5);
44495
44971
  });
44496
44972
  }
44497
44973
  };
@@ -44744,12 +45220,12 @@ var Jsep = class _Jsep {
44744
45220
  */
44745
45221
  runHook(name, node) {
44746
45222
  if (_Jsep.hooks[name]) {
44747
- const env = {
45223
+ const env5 = {
44748
45224
  context: this,
44749
45225
  node
44750
45226
  };
44751
- _Jsep.hooks.run(name, env);
44752
- return env.node;
45227
+ _Jsep.hooks.run(name, env5);
45228
+ return env5.node;
44753
45229
  }
44754
45230
  return node;
44755
45231
  }
@@ -44760,14 +45236,14 @@ var Jsep = class _Jsep {
44760
45236
  */
44761
45237
  searchHook(name) {
44762
45238
  if (_Jsep.hooks[name]) {
44763
- const env = {
45239
+ const env5 = {
44764
45240
  context: this
44765
45241
  };
44766
45242
  _Jsep.hooks[name].find(function(callback) {
44767
- callback.call(env.context, env);
44768
- return env.node;
45243
+ callback.call(env5.context, env5);
45244
+ return env5.node;
44769
45245
  });
44770
- return env.node;
45246
+ return env5.node;
44771
45247
  }
44772
45248
  }
44773
45249
  /**
@@ -45365,10 +45841,10 @@ var CONDITIONAL_EXP = "ConditionalExpression";
45365
45841
  var ternary = {
45366
45842
  name: "ternary",
45367
45843
  init(jsep2) {
45368
- jsep2.hooks.add("after-expression", function gobbleTernary(env) {
45369
- if (env.node && this.code === jsep2.QUMARK_CODE) {
45844
+ jsep2.hooks.add("after-expression", function gobbleTernary(env5) {
45845
+ if (env5.node && this.code === jsep2.QUMARK_CODE) {
45370
45846
  this.index++;
45371
- const test = env.node;
45847
+ const test = env5.node;
45372
45848
  const consequent = this.gobbleExpression();
45373
45849
  if (!consequent) {
45374
45850
  this.throwError("Expected expression");
@@ -45380,7 +45856,7 @@ var ternary = {
45380
45856
  if (!alternate) {
45381
45857
  this.throwError("Expected expression");
45382
45858
  }
45383
- env.node = {
45859
+ env5.node = {
45384
45860
  type: CONDITIONAL_EXP,
45385
45861
  test,
45386
45862
  consequent,
@@ -45391,9 +45867,9 @@ var ternary = {
45391
45867
  while (newTest.right.operator && jsep2.binary_ops[newTest.right.operator] <= 0.9) {
45392
45868
  newTest = newTest.right;
45393
45869
  }
45394
- env.node.test = newTest.right;
45395
- newTest.right = env.node;
45396
- env.node = test;
45870
+ env5.node.test = newTest.right;
45871
+ newTest.right = env5.node;
45872
+ env5.node = test;
45397
45873
  }
45398
45874
  } else {
45399
45875
  this.throwError("Expected :");
@@ -45408,7 +45884,7 @@ var BSLASH_CODE = 92;
45408
45884
  var index = {
45409
45885
  name: "regex",
45410
45886
  init(jsep2) {
45411
- jsep2.hooks.add("gobble-token", function gobbleRegexLiteral(env) {
45887
+ jsep2.hooks.add("gobble-token", function gobbleRegexLiteral(env5) {
45412
45888
  if (this.code === FSLASH_CODE) {
45413
45889
  const patternIndex = ++this.index;
45414
45890
  let inCharSet = false;
@@ -45430,13 +45906,13 @@ var index = {
45430
45906
  } catch (e20) {
45431
45907
  this.throwError(e20.message);
45432
45908
  }
45433
- env.node = {
45909
+ env5.node = {
45434
45910
  type: jsep2.LITERAL,
45435
45911
  value,
45436
45912
  raw: this.expr.slice(patternIndex - 1, this.index)
45437
45913
  };
45438
- env.node = this.gobbleTokenProperty(env.node);
45439
- return env.node;
45914
+ env5.node = this.gobbleTokenProperty(env5.node);
45915
+ return env5.node;
45440
45916
  }
45441
45917
  if (this.code === jsep2.OBRACK_CODE) {
45442
45918
  inCharSet = true;
@@ -45460,41 +45936,41 @@ var plugin = {
45460
45936
  init(jsep2) {
45461
45937
  const updateNodeTypes = [jsep2.IDENTIFIER, jsep2.MEMBER_EXP];
45462
45938
  plugin.assignmentOperators.forEach((op) => jsep2.addBinaryOp(op, plugin.assignmentPrecedence, true));
45463
- jsep2.hooks.add("gobble-token", function gobbleUpdatePrefix(env) {
45939
+ jsep2.hooks.add("gobble-token", function gobbleUpdatePrefix(env5) {
45464
45940
  const code = this.code;
45465
45941
  if (plugin.updateOperators.some((c70) => c70 === code && c70 === this.expr.charCodeAt(this.index + 1))) {
45466
45942
  this.index += 2;
45467
- env.node = {
45943
+ env5.node = {
45468
45944
  type: "UpdateExpression",
45469
45945
  operator: code === PLUS_CODE ? "++" : "--",
45470
45946
  argument: this.gobbleTokenProperty(this.gobbleIdentifier()),
45471
45947
  prefix: true
45472
45948
  };
45473
- if (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {
45474
- this.throwError(`Unexpected ${env.node.operator}`);
45949
+ if (!env5.node.argument || !updateNodeTypes.includes(env5.node.argument.type)) {
45950
+ this.throwError(`Unexpected ${env5.node.operator}`);
45475
45951
  }
45476
45952
  }
45477
45953
  });
45478
- jsep2.hooks.add("after-token", function gobbleUpdatePostfix(env) {
45479
- if (env.node) {
45954
+ jsep2.hooks.add("after-token", function gobbleUpdatePostfix(env5) {
45955
+ if (env5.node) {
45480
45956
  const code = this.code;
45481
45957
  if (plugin.updateOperators.some((c70) => c70 === code && c70 === this.expr.charCodeAt(this.index + 1))) {
45482
- if (!updateNodeTypes.includes(env.node.type)) {
45483
- this.throwError(`Unexpected ${env.node.operator}`);
45958
+ if (!updateNodeTypes.includes(env5.node.type)) {
45959
+ this.throwError(`Unexpected ${env5.node.operator}`);
45484
45960
  }
45485
45961
  this.index += 2;
45486
- env.node = {
45962
+ env5.node = {
45487
45963
  type: "UpdateExpression",
45488
45964
  operator: code === PLUS_CODE ? "++" : "--",
45489
- argument: env.node,
45965
+ argument: env5.node,
45490
45966
  prefix: false
45491
45967
  };
45492
45968
  }
45493
45969
  }
45494
45970
  });
45495
- jsep2.hooks.add("after-expression", function gobbleAssignment(env) {
45496
- if (env.node) {
45497
- updateBinariesToAssignments(env.node);
45971
+ jsep2.hooks.add("after-expression", function gobbleAssignment(env5) {
45972
+ if (env5.node) {
45973
+ updateBinariesToAssignments(env5.node);
45498
45974
  }
45499
45975
  });
45500
45976
  function updateBinariesToAssignments(node) {
@@ -46112,10 +46588,10 @@ JSONPath.toPointer = function(pointer) {
46112
46588
  };
46113
46589
  JSONPath.toPathArray = function(expr) {
46114
46590
  const {
46115
- cache
46591
+ cache: cache2
46116
46592
  } = JSONPath;
46117
- if (cache[expr]) {
46118
- return cache[expr].concat();
46593
+ if (cache2[expr]) {
46594
+ return cache2[expr].concat();
46119
46595
  }
46120
46596
  const subx = [];
46121
46597
  const normalized = expr.replaceAll(/@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\(\)/gu, ";$&;").replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function($0, $1) {
@@ -46129,8 +46605,8 @@ JSONPath.toPathArray = function(expr) {
46129
46605
  const match = exp.match(/#(\d+)/u);
46130
46606
  return !match || !match[1] ? exp : subx[match[1]];
46131
46607
  });
46132
- cache[expr] = exprList;
46133
- return cache[expr].concat();
46608
+ cache2[expr] = exprList;
46609
+ return cache2[expr].concat();
46134
46610
  };
46135
46611
  JSONPath.prototype.safeVm = {
46136
46612
  Script: SafeScript
@@ -46392,9 +46868,9 @@ function buildAt(ctx, testResults, consoleOutput) {
46392
46868
  const counterBuf = Buffer.alloc(8);
46393
46869
  counterBuf.writeUInt32BE(Math.floor(counter / 4294967296), 0);
46394
46870
  counterBuf.writeUInt32BE(counter >>> 0, 4);
46395
- const hmac = crypto.createHmac(algorithm, keyBytes).update(counterBuf).digest();
46396
- const offset = hmac[hmac.length - 1] & 15;
46397
- const binCode = (hmac[offset] & 127) << 24 | (hmac[offset + 1] & 255) << 16 | (hmac[offset + 2] & 255) << 8 | hmac[offset + 3] & 255;
46871
+ const hmac2 = crypto.createHmac(algorithm, keyBytes).update(counterBuf).digest();
46872
+ const offset = hmac2[hmac2.length - 1] & 15;
46873
+ const binCode = (hmac2[offset] & 127) << 24 | (hmac2[offset + 1] & 255) << 16 | (hmac2[offset + 2] & 255) << 8 | hmac2[offset + 3] & 255;
46398
46874
  return String(binCode % 10 ** digits).padStart(digits, "0");
46399
46875
  }
46400
46876
  };
@@ -46914,12 +47390,12 @@ async function fetchOAuth2Token(auth, vars) {
46914
47390
  throw new Error(`OAuth 2.0 token request failed (${resp.status}): ${body}`);
46915
47391
  }
46916
47392
  const json = await resp.json();
46917
- const accessToken = String(json["access_token"] ?? "");
46918
- if (!accessToken) throw new Error("OAuth 2.0: token response missing access_token.");
47393
+ const accessToken2 = String(json["access_token"] ?? "");
47394
+ if (!accessToken2) throw new Error("OAuth 2.0: token response missing access_token.");
46919
47395
  const expiresIn = Number(json["expires_in"] ?? 3600);
46920
47396
  const expiresAt = Date.now() + expiresIn * 1e3;
46921
47397
  return {
46922
- accessToken,
47398
+ accessToken: accessToken2,
46923
47399
  expiresAt,
46924
47400
  refreshToken: json["refresh_token"] ? String(json["refresh_token"]) : void 0
46925
47401
  };
@@ -47185,7 +47661,10 @@ function buildBodyAndApplyHeaders(req, vars, headers) {
47185
47661
  return body;
47186
47662
  }
47187
47663
  async function performHttpExchange(opts) {
47188
- const { req, vars, resolvedUrl, dispatcher, proxy, tls, onSent } = opts;
47664
+ const { req, resolvedUrl, dispatcher, proxy, tls, onSent } = opts;
47665
+ let vars = opts.vars;
47666
+ const inlineSecrets = await resolveInlineSecrets(req);
47667
+ if (Object.keys(inlineSecrets).length) vars = { ...vars, ...inlineSecrets };
47189
47668
  const start = Date.now();
47190
47669
  if (req.auth.type === "oauth2") {
47191
47670
  const now = Date.now();
@@ -47299,6 +47778,29 @@ function syntheticHttpFailure(status, statusText) {
47299
47778
  error: `Request returned ${status} - no assertion was defined to verify the status code.`
47300
47779
  };
47301
47780
  }
47781
+ async function resolveInlineSecrets(req) {
47782
+ const haystack = [
47783
+ req.url ?? "",
47784
+ JSON.stringify(req.params ?? []),
47785
+ JSON.stringify(req.headers ?? []),
47786
+ JSON.stringify(req.body ?? {}),
47787
+ JSON.stringify(req.auth ?? {}),
47788
+ req.preRequestScript ?? "",
47789
+ req.postRequestScript ?? ""
47790
+ ].join("\n");
47791
+ const refs = /* @__PURE__ */ new Set();
47792
+ for (const m75 of haystack.matchAll(/\{\{\s*([^}]+?)\s*\}\}/g)) {
47793
+ const inner = m75[1].trim();
47794
+ if (hasSecretScheme(inner)) refs.add(inner);
47795
+ }
47796
+ if (refs.size === 0) return {};
47797
+ const out = {};
47798
+ await Promise.all([...refs].map(async (ref) => {
47799
+ const value = await resolveExternalSecret(ref);
47800
+ if (value !== null) out[ref] = value;
47801
+ }));
47802
+ return out;
47803
+ }
47302
47804
  async function executeRunnerRequest(opts) {
47303
47805
  const { req, collectionVars, envVars, globals: globals2, dispatcher, piiMaskPatterns, proxy, tls, onScriptOutput } = opts;
47304
47806
  let { localVars } = opts;
@@ -47316,6 +47818,24 @@ async function executeRunnerRequest(opts) {
47316
47818
  let updatedCollectionVars = { ...collectionVars };
47317
47819
  let updatedGlobals = { ...globals2 };
47318
47820
  let preScriptError;
47821
+ let inlineSecrets = {};
47822
+ try {
47823
+ inlineSecrets = await resolveInlineSecrets(req);
47824
+ } catch (err) {
47825
+ return {
47826
+ result: {
47827
+ ...base,
47828
+ status: "error",
47829
+ durationMs: 0,
47830
+ error: err instanceof Error ? err.message : String(err)
47831
+ },
47832
+ updatedEnvVars,
47833
+ updatedCollectionVars,
47834
+ updatedGlobals,
47835
+ updatedLocalVars: localVars
47836
+ };
47837
+ }
47838
+ if (Object.keys(inlineSecrets).length) vars = { ...vars, ...inlineSecrets };
47319
47839
  if (req.preRequestScript?.trim()) {
47320
47840
  const r52 = await runScript(interpolate(req.preRequestScript, vars), {
47321
47841
  envVars: { ...envVars },
@@ -47333,6 +47853,7 @@ async function executeRunnerRequest(opts) {
47333
47853
  await persistGlobals();
47334
47854
  onScriptOutput?.("pre", r52.consoleOutput, r52.error);
47335
47855
  vars = mergeVars(updatedEnvVars, updatedCollectionVars, updatedGlobals, localVars, dynamicVars);
47856
+ if (Object.keys(inlineSecrets).length) vars = { ...vars, ...inlineSecrets };
47336
47857
  }
47337
47858
  const resolvedUrl = buildUrl(req.url, req.params, vars);
47338
47859
  base.resolvedUrl = resolvedUrl;
@@ -47423,7 +47944,7 @@ var APP_URL = (process.env.APP_URL || "").replace(/\/+$/, "");
47423
47944
  var AGENT_TOKEN = process.env.AGENT_TOKEN || "";
47424
47945
  var RUNTIME_TOKEN = process.env.RUNTIME_TOKEN || "";
47425
47946
  var POLL_MS = Number(process.env.POLL_INTERVAL_MS || 5e3);
47426
- var VERSION = true ? "0.4.8" : "";
47947
+ var VERSION = true ? "0.5.0" : "";
47427
47948
  var authHeaders = AGENT_TOKEN ? { Authorization: `Bearer ${AGENT_TOKEN}` } : RUNTIME_TOKEN ? { "X-Runtime-Token": RUNTIME_TOKEN } : {};
47428
47949
  async function postResult(m75, fields) {
47429
47950
  await fetch(`${APP_URL}/api/monitor-runtime/${m75.id}/result`, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testsmith/api-spector-agent",
3
- "version": "0.4.8",
3
+ "version": "0.5.0",
4
4
  "description": "API Spector private runner: monitor internal/local APIs the cloud cannot reach, with no inbound connections.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://api-spector.dev",