@readme/httpsnippet 10.1.1 → 11.1.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.
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
- import 'har-format';
2
- import './helpers/reducer.cjs';
3
- export { n as HTTPSnippet, m as HTTPSnippetOptions, H as HarRequest, l as Request, R as RequestExtras, j as addClientPlugin, g as addTarget, k as addTargetClient, o as availableTargets, p as extname } from './index-CM3ebXTM.cjs';
4
1
  import 'node:url';
5
- import './helpers/code-builder.cjs';
2
+ import 'har-format';
6
3
  import 'type-fest';
4
+ import './helpers/code-builder.cjs';
5
+ import './helpers/reducer.cjs';
6
+ export { Client, c as HTTPSnippet, b as HTTPSnippetOptions, H as HarRequest, O as Options, a as Request, R as RequestExtras, addClientPlugin, addTarget, addTargetClient, d as availableTargets, e as extname } from './targets/index.cjs';
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import 'har-format';
2
- import './helpers/reducer.js';
3
- export { n as HTTPSnippet, m as HTTPSnippetOptions, H as HarRequest, l as Request, R as RequestExtras, j as addClientPlugin, g as addTarget, k as addTargetClient, o as availableTargets, p as extname } from './index-Bi-oJSCB.js';
4
1
  import 'node:url';
5
- import './helpers/code-builder.js';
2
+ import 'har-format';
6
3
  import 'type-fest';
4
+ import './helpers/code-builder.js';
5
+ import './helpers/reducer.js';
6
+ export { Client, c as HTTPSnippet, b as HTTPSnippetOptions, H as HarRequest, O as Options, a as Request, R as RequestExtras, addClientPlugin, addTarget, addTargetClient, d as availableTargets, e as extname } from './targets/index.js';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { reducer } from './chunk-KT7MO6Z4.js';
2
- import { targets, getHeaderName } from './chunk-532RKFLR.js';
3
- export { addClientPlugin, addTarget, addTargetClient } from './chunk-532RKFLR.js';
4
- import './chunk-Y7NI4MMY.js';
1
+ import { reducer } from './chunk-LCVMSGCB.js';
2
+ import { targets, getHeaderName } from './chunk-EFUQ6POB.js';
3
+ export { addClientPlugin, addTarget, addTargetClient } from './chunk-EFUQ6POB.js';
4
+ import './chunk-6B3J3CUI.js';
5
5
  import { parse, format } from 'url';
6
6
  import { stringify } from 'qs';
7
7
 
@@ -75,10 +75,10 @@ var HTTPSnippet = class {
75
75
  cookiesObj: {},
76
76
  allHeaders: {}
77
77
  };
78
- if (request.queryString && request.queryString.length) {
78
+ if (request?.queryString.length) {
79
79
  request.queryObj = request.queryString.reduce(reducer, {});
80
80
  }
81
- if (request.headers && request.headers.length) {
81
+ if (request?.headers.length) {
82
82
  const http2VersionRegex = /^HTTP\/2/;
83
83
  request.headersObj = request.headers.reduce((accumulator, { name, value }) => {
84
84
  const headerName = http2VersionRegex.exec(request.httpVersion) ? name.toLocaleLowerCase() : name;
@@ -88,7 +88,7 @@ var HTTPSnippet = class {
88
88
  };
89
89
  }, {});
90
90
  }
91
- if (request.cookies && request.cookies.length) {
91
+ if (request?.cookies.length) {
92
92
  request.cookiesObj = request.cookies.reduceRight(
93
93
  (accumulator, { name, value }) => ({
94
94
  ...accumulator,
@@ -117,7 +117,7 @@ var HTTPSnippet = class {
117
117
  const boundary = "---011000010111000001101001";
118
118
  const carriage = `${boundary}--`;
119
119
  const rn = "\r\n";
120
- const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22");
120
+ const escapeStr = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22");
121
121
  const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n");
122
122
  const payload = [`--${boundary}`];
123
123
  request.postData?.params.forEach((param, i) => {
@@ -127,7 +127,7 @@ var HTTPSnippet = class {
127
127
  const contentType = param.contentType || "application/octet-stream";
128
128
  if (filename) {
129
129
  payload.push(
130
- `Content-Disposition: form-data; name="${escape(normalizeLinefeeds(name))}"; filename="${filename}"`
130
+ `Content-Disposition: form-data; name="${escapeStr(normalizeLinefeeds(name))}"; filename="${filename}"`
131
131
  );
132
132
  payload.push(`Content-Type: ${contentType}`);
133
133
  } else {
@@ -162,7 +162,7 @@ var HTTPSnippet = class {
162
162
  if (request.postData.text) {
163
163
  try {
164
164
  request.postData.jsonObj = JSON.parse(request.postData.text);
165
- } catch (e) {
165
+ } catch {
166
166
  request.postData.mimeType = "text/plain";
167
167
  }
168
168
  }
@@ -216,16 +216,31 @@ var HTTPSnippet = class {
216
216
  this.init();
217
217
  }
218
218
  if (!options && clientId) {
219
- options = clientId;
219
+ options = { clientId };
220
220
  }
221
221
  const target = targets[targetId];
222
222
  if (!target) {
223
- return false;
223
+ return [false];
224
224
  }
225
225
  const { convert } = target.clientsById[clientId || target.info.default];
226
226
  const results = this.requests.map((request) => convert(request, options));
227
227
  return results;
228
228
  }
229
+ installation(targetId, clientId, options) {
230
+ if (!this.initCalled) {
231
+ this.init();
232
+ }
233
+ if (!options && clientId) {
234
+ options = { clientId };
235
+ }
236
+ const target = targets[targetId];
237
+ if (!target) {
238
+ return [false];
239
+ }
240
+ const { info } = target.clientsById[clientId || target.info.default];
241
+ const results = this.requests.map((request) => info?.installation ? info.installation(request, options) : false);
242
+ return results;
243
+ }
229
244
  };
230
245
  /*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */
231
246
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/helpers/utils.ts","../src/index.ts"],"names":["queryStringify","urlParse","urlFormat"],"mappings":";;;;;;;;AAQO,IAAM,mBAAmB,MAC9B,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,IAAqB,CAAa,QAAA,MAAA;AAAA,EACrD,GAAG,OAAQ,CAAA,QAAoB,CAAE,CAAA,IAAA;AAAA,EACjC,SAAS,MAAO,CAAA,IAAA,CAAK,QAAQ,QAAoB,CAAA,CAAE,WAAW,CAAE,CAAA,GAAA;AAAA,IAC9D,cAAY,OAAQ,CAAA,QAAoB,CAAE,CAAA,WAAA,CAAY,QAAQ,CAAE,CAAA,IAAA;AAAA,GAClE;AACF,CAAE,CAAA,EAAA;AAES,IAAA,OAAA,GAAU,CAAC,QAAA,EAAoB,QAAuB,KAAA;AACjE,EAAM,MAAA,MAAA,GAAS,QAAQ,QAAQ,CAAA,CAAA;AAC/B,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,MAAO,CAAA,WAAA,CAAY,QAAQ,CAAA,EAAG,KAAK,OAAW,IAAA,EAAA,CAAA;AACvD,EAAA;;;ACyCA,IAAM,aAAa,CAAC,KAAA,KAClB,OAAO,KAAU,KAAA,QAAA,IACjB,SAAS,KACT,IAAA,OAAO,MAAM,GAAQ,KAAA,QAAA,IACrB,aAAa,KAAM,CAAA,GAAA,IACnB,MAAM,OAAQ,CAAA,KAAA,CAAM,IAAI,OAAO,CAAA,CAAA;AAE1B,IAAM,cAAN,MAAkB;AAAA,EASvB,WAAY,CAAA,KAAA,EAA8B,IAA2B,GAAA,EAAI,EAAA;AARzE,IAAa,IAAA,CAAA,UAAA,GAAA,KAAA,CAAA;AAEb,IAAA,IAAA,CAAA,OAAA,GAAmB,EAAC,CAAA;AAEpB,IAAA,IAAA,CAAA,QAAA,GAAsB,EAAC,CAAA;AAEvB,IAAA,IAAA,CAAA,OAAA,GAA8B,EAAC,CAAA;AAG7B,IAAA,IAAA,CAAK,OAAU,GAAA;AAAA,MACb,mBAAqB,EAAA,KAAA;AAAA,MACrB,GAAG,IAAA;AAAA,KACL,CAAA;AAGA,IAAA,IAAA,CAAK,WAAW,EAAC,CAAA;AAGjB,IAAI,IAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AACrB,MAAK,IAAA,CAAA,OAAA,GAAU,MAAM,GAAI,CAAA,OAAA,CAAA;AAAA,KACpB,MAAA;AACL,MAAA,IAAA,CAAK,OAAU,GAAA;AAAA,QACb;AAAA,UACE,OAAS,EAAA,KAAA;AAAA,SACX;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACF;AAAA,EAEA,IAAO,GAAA;AACL,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAElB,IAAA,IAAA,CAAK,WAAW,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAC,EAAE,SAAc,KAAA;AAEhD,MAAA,MAAM,GAAM,GAAA;AAAA,QACV,QAAU,EAAA,CAAA;AAAA,QACV,WAAa,EAAA,CAAA;AAAA,QACb,SAAS,EAAC;AAAA,QACV,SAAS,EAAC;AAAA,QACV,WAAa,EAAA,UAAA;AAAA,QACb,aAAa,EAAC;AAAA,QACd,QAAU,EAAA;AAAA,UACR,QAAA,EAAU,OAAQ,CAAA,QAAA,EAAU,QAAY,IAAA,0BAAA;AAAA,SAC1C;AAAA,QACA,GAAG,OAAA;AAAA,OACL,CAAA;AAGA,MAAA,IAAI,GAAI,CAAA,QAAA,IAAY,CAAC,GAAA,CAAI,SAAS,QAAU,EAAA;AAC1C,QAAA,GAAA,CAAI,SAAS,QAAW,GAAA,0BAAA,CAAA;AAAA,OAC1B;AAEA,MAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,GAAmB,EAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,KACpD,CAAA,CAAA;AAED,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAA,CAAQ,YAAwB,OAA6B,EAAA;AAC3D,IAAA,MAAM,OAAmB,GAAA;AAAA,MACvB,GAAG,UAAA;AAAA,MACH,OAAS,EAAA,EAAA;AAAA,MACT,QAAQ,EAAC;AAAA,MACT,UAAU,EAAC;AAAA,MACX,YAAY,EAAC;AAAA,MACb,YAAY,EAAC;AAAA,MACb,YAAY,EAAC;AAAA,KACf,CAAA;AAGA,IAAA,IAAI,OAAQ,CAAA,WAAA,IAAe,OAAQ,CAAA,WAAA,CAAY,MAAQ,EAAA;AACrD,MAAA,OAAA,CAAQ,WAAW,OAAQ,CAAA,WAAA,CAAY,MAAO,CAAA,OAAA,EAAS,EAAE,CAAA,CAAA;AAAA,KAC3D;AAGA,IAAA,IAAI,OAAQ,CAAA,OAAA,IAAW,OAAQ,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAC7C,MAAA,MAAM,iBAAoB,GAAA,UAAA,CAAA;AAC1B,MAAQ,OAAA,CAAA,UAAA,GAAa,QAAQ,OAAQ,CAAA,MAAA,CAAO,CAAC,WAAa,EAAA,EAAE,IAAM,EAAA,KAAA,EAAY,KAAA;AAC5E,QAAM,MAAA,UAAA,GAAa,kBAAkB,IAAK,CAAA,OAAA,CAAQ,WAAW,CAAI,GAAA,IAAA,CAAK,mBAAsB,GAAA,IAAA,CAAA;AAC5F,QAAO,OAAA;AAAA,UACL,GAAG,WAAA;AAAA,UACH,CAAC,UAAU,GAAG,KAAA;AAAA,SAChB,CAAA;AAAA,OACF,EAAG,EAAE,CAAA,CAAA;AAAA,KACP;AAGA,IAAA,IAAI,OAAQ,CAAA,OAAA,IAAW,OAAQ,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAC7C,MAAQ,OAAA,CAAA,UAAA,GAAa,QAAQ,OAAQ,CAAA,WAAA;AAAA,QACnC,CAAC,WAAA,EAAa,EAAE,IAAA,EAAM,OAAa,MAAA;AAAA,UACjC,GAAG,WAAA;AAAA,UACH,CAAC,IAAI,GAAG,KAAA;AAAA,SACV,CAAA;AAAA,QACA,EAAC;AAAA,OACH,CAAA;AAAA,KACF;AAGA,IAAM,MAAA,OAAA,GAAU,QAAQ,OAAS,EAAA,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAY,KAAA;AACxD,MAAA,IAAI,QAAQ,mBAAqB,EAAA;AAC/B,QAAO,OAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAAA,OACzB;AAEA,MAAA,OAAO,GAAG,kBAAmB,CAAA,IAAI,CAAC,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,KAChE,CAAA,CAAA;AAED,IAAA,IAAI,SAAS,MAAQ,EAAA;AACnB,MAAA,OAAA,CAAQ,UAAW,CAAA,MAAA,GAAS,OAAQ,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,KAC/C;AAEA,IAAQ,QAAA,OAAA,CAAQ,SAAS,QAAU;AAAA,MACjC,KAAK,iBAAA,CAAA;AAAA,MACL,KAAK,mBAAA,CAAA;AAAA,MACL,KAAK,qBAAA,CAAA;AAAA,MACL,KAAK,uBAAA;AAEH,QAAA,OAAA,CAAQ,SAAS,IAAO,GAAA,EAAA,CAAA;AACxB,QAAA,OAAA,CAAQ,SAAS,QAAW,GAAA,qBAAA,CAAA;AAE5B,QAAI,IAAA,OAAA,CAAQ,UAAU,MAAQ,EAAA;AAC5B,UAAA,MAAM,QAAW,GAAA,6BAAA,CAAA;AACjB,UAAM,MAAA,QAAA,GAAW,GAAG,QAAQ,CAAA,EAAA,CAAA,CAAA;AAC5B,UAAA,MAAM,EAAK,GAAA,MAAA,CAAA;AAGX,UAAA,MAAM,MAAS,GAAA,CAAC,GAAgB,KAAA,GAAA,CAAI,QAAQ,KAAO,EAAA,KAAK,CAAE,CAAA,OAAA,CAAQ,KAAO,EAAA,KAAK,CAAE,CAAA,OAAA,CAAQ,MAAM,KAAK,CAAA,CAAA;AACnG,UAAA,MAAM,qBAAqB,CAAC,KAAA,KAAkB,KAAM,CAAA,OAAA,CAAQ,aAAa,MAAM,CAAA,CAAA;AAE/E,UAAA,MAAM,OAAU,GAAA,CAAC,CAAK,EAAA,EAAA,QAAQ,CAAE,CAAA,CAAA,CAAA;AAChC,UAAA,OAAA,CAAQ,QAAU,EAAA,MAAA,CAAO,OAAQ,CAAA,CAAC,OAAO,CAAM,KAAA;AAC7C,YAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAA;AACnB,YAAM,MAAA,KAAA,GAAQ,MAAM,KAAS,IAAA,EAAA,CAAA;AAC7B,YAAM,MAAA,QAAA,GAAW,MAAM,QAAY,IAAA,IAAA,CAAA;AACnC,YAAM,MAAA,WAAA,GAAc,MAAM,WAAe,IAAA,0BAAA,CAAA;AAEzC,YAAA,IAAI,QAAU,EAAA;AACZ,cAAQ,OAAA,CAAA,IAAA;AAAA,gBACN,yCAAyC,MAAO,CAAA,kBAAA,CAAmB,IAAI,CAAC,CAAC,gBAAgB,QAAQ,CAAA,CAAA,CAAA;AAAA,eACnG,CAAA;AACA,cAAQ,OAAA,CAAA,IAAA,CAAK,CAAiB,cAAA,EAAA,WAAW,CAAE,CAAA,CAAA,CAAA;AAAA,aACtC,MAAA;AACL,cAAA,OAAA,CAAQ,KAAK,CAAyC,sCAAA,EAAA,MAAA,CAAO,mBAAmB,IAAI,CAAC,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,aAC3F;AAEA,YAAA,OAAA,CAAQ,KAAK,EAAE,CAAA,CAAA;AACf,YAAQ,OAAA,CAAA,IAAA,CAAK,kBAAmB,CAAA,KAAK,CAAC,CAAA,CAAA;AAEtC,YAAA,IAAI,CAAO,KAAA,OAAA,CAAQ,QAAS,CAAA,MAAA,CAAmB,SAAS,CAAG,EAAA;AACzD,cAAQ,OAAA,CAAA,IAAA,CAAK,CAAK,EAAA,EAAA,QAAQ,CAAE,CAAA,CAAA,CAAA;AAAA,aAC9B;AAAA,WACD,CAAA,CAAA;AAED,UAAQ,OAAA,CAAA,IAAA,CAAK,CAAK,EAAA,EAAA,QAAQ,CAAE,CAAA,CAAA,CAAA;AAE5B,UAAA,OAAA,CAAQ,SAAS,QAAW,GAAA,QAAA,CAAA;AAC5B,UAAA,OAAA,CAAQ,QAAS,CAAA,IAAA,GAAO,OAAQ,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAGvC,UAAA,MAAM,iBAAoB,GAAA,aAAA,CAAc,OAAQ,CAAA,UAAA,EAAY,cAAc,CAAK,IAAA,cAAA,CAAA;AAE/E,UAAA,OAAA,CAAQ,UAAW,CAAA,iBAAiB,CAAI,GAAA,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,CAAA;AAAA,SACnF;AACA,QAAA,MAAA;AAAA,MAEF,KAAK,mCAAA;AACH,QAAI,IAAA,CAAC,OAAQ,CAAA,QAAA,CAAS,MAAQ,EAAA;AAC5B,UAAA,OAAA,CAAQ,SAAS,IAAO,GAAA,EAAA,CAAA;AAAA,SACnB,MAAA;AAEL,UAAQ,OAAA,CAAA,QAAA,CAAS,YAAY,OAAQ,CAAA,QAAA,CAAS,OAAO,MAAO,CAAA,OAAA,EAAS,EAAE,CAAA,CAAA;AAGvE,UAAA,OAAA,CAAQ,QAAS,CAAA,IAAA,GAAOA,SAAe,CAAA,OAAA,CAAQ,SAAS,SAAS,CAAA,CAAA;AAAA,SACnE;AACA,QAAA,MAAA;AAAA,MAEF,KAAK,WAAA,CAAA;AAAA,MACL,KAAK,aAAA,CAAA;AAAA,MACL,KAAK,kBAAA,CAAA;AAAA,MACL,KAAK,oBAAA;AACH,QAAA,OAAA,CAAQ,SAAS,QAAW,GAAA,kBAAA,CAAA;AAE5B,QAAI,IAAA,OAAA,CAAQ,SAAS,IAAM,EAAA;AACzB,UAAI,IAAA;AACF,YAAA,OAAA,CAAQ,SAAS,OAAU,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,SAAS,IAAI,CAAA,CAAA;AAAA,mBACpD,CAAG,EAAA;AAEV,YAAA,OAAA,CAAQ,SAAS,QAAW,GAAA,YAAA,CAAA;AAAA,WAC9B;AAAA,SACF;AACA,QAAA,MAAA;AAAA,KACJ;AAGA,IAAA,MAAM,UAAa,GAAA;AAAA,MACjB,GAAG,OAAQ,CAAA,UAAA;AAAA,MACX,GAAG,OAAQ,CAAA,UAAA;AAAA,KACb,CAAA;AAEA,IAAA,MAAM,kBAAqB,GAAAC,KAAA,CAAS,OAAQ,CAAA,GAAA,EAAK,MAAM,IAAI,CAAA,CAAA;AAG3D,IAAA,OAAA,CAAQ,QAAW,GAAA;AAAA,MACjB,GAAG,OAAQ,CAAA,QAAA;AAAA,MACX,GAAI,kBAAmB,CAAA,KAAA;AAAA,KACzB,CAAA;AAGA,IAAI,IAAA,MAAA,CAAA;AACJ,IAAA,IAAI,QAAQ,mBAAqB,EAAA;AAC/B,MAAS,MAAA,GAAAD,SAAA,CAAe,QAAQ,QAAU,EAAA;AAAA,QACxC,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,KAAA;AAAA,OACV,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAS,MAAA,GAAAA,SAAA,CAAe,QAAQ,QAAU,EAAA;AAAA,QACxC,OAAS,EAAA,KAAA;AAAA,OACV,CAAA,CAAA;AAAA,KACH;AAEA,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,GAAG,kBAAA;AAAA,MACH,OAAO,OAAQ,CAAA,QAAA;AAAA,MACf,MAAA;AAAA,MACA,IAAA,EAAM,SAAS,CAAG,EAAA,kBAAA,CAAmB,QAAQ,CAAI,CAAA,EAAA,MAAM,KAAK,kBAAmB,CAAA,QAAA;AAAA,KACjF,CAAA;AAGA,IAAA,MAAM,MAAME,MAAU,CAAA;AAAA,MACpB,GAAG,kBAAA;AAAA,MACH,KAAO,EAAA,IAAA;AAAA,MACP,MAAQ,EAAA,IAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAA,MAAM,UAAUA,MAAU,CAAA;AAAA,MACxB,GAAG,kBAAA;AAAA,MACH,GAAG,MAAA;AAAA,KACJ,CAAA,CAAA;AAED,IAAO,OAAA;AAAA,MACL,GAAG,OAAA;AAAA,MACH,UAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,OAAA,CAAQ,QAAoB,EAAA,QAAA,EAAqB,OAAe,EAAA;AAC9D,IAAI,IAAA,CAAC,KAAK,UAAY,EAAA;AACpB,MAAA,IAAA,CAAK,IAAK,EAAA,CAAA;AAAA,KACZ;AAEA,IAAI,IAAA,CAAC,WAAW,QAAU,EAAA;AACxB,MAAU,OAAA,GAAA,QAAA,CAAA;AAAA,KACZ;AAEA,IAAM,MAAA,MAAA,GAAS,QAAQ,QAAQ,CAAA,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,EAAE,SAAY,GAAA,MAAA,CAAO,YAAY,QAAY,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA,CAAA;AACtE,IAAM,MAAA,OAAA,GAAU,KAAK,QAAS,CAAA,GAAA,CAAI,aAAW,OAAQ,CAAA,OAAA,EAAS,OAAO,CAAC,CAAA,CAAA;AACtE,IAAO,OAAA,OAAA,CAAA;AAAA,GACT;AACF,EAAA","file":"index.js","sourcesContent":["import type { ClientId, ClientInfo, TargetId, TargetInfo } from '../targets/index.js';\n\nimport { targets } from '../targets/index.js';\n\nexport interface AvailableTarget extends TargetInfo {\n clients: ClientInfo[];\n}\n\nexport const availableTargets = () =>\n Object.keys(targets).map<AvailableTarget>(targetId => ({\n ...targets[targetId as TargetId].info,\n clients: Object.keys(targets[targetId as TargetId].clientsById).map(\n clientId => targets[targetId as TargetId].clientsById[clientId].info,\n ),\n }));\n\nexport const extname = (targetId: TargetId, clientId: ClientId) => {\n const target = targets[targetId];\n if (!target) {\n return '';\n }\n\n return target.clientsById[clientId]?.info.extname || '';\n};\n","import type { ReducedHelperObject } from './helpers/reducer.js';\nimport type { ClientId, TargetId } from './targets/index.js';\nimport type { Param, PostDataCommon, Request as NpmHarRequest } from 'har-format';\nimport type { UrlWithParsedQuery } from 'node:url';\n\nimport { format as urlFormat, parse as urlParse } from 'node:url';\n\nimport { stringify as queryStringify } from 'qs';\n\nimport { getHeaderName } from './helpers/headers.js';\nimport { reducer } from './helpers/reducer.js';\nimport { targets } from './targets/index.js';\n\nexport { availableTargets, extname } from './helpers/utils.js';\nexport { addTarget, addTargetClient, addClientPlugin } from './targets/index.js';\n\n/** is this wrong? yes. according to the spec (http://www.softwareishard.com/blog/har-12-spec/#postData) it's technically wrong since `params` and `text` are (by the spec) mutually exclusive. However, in practice, this is not what is often the case.\n *\n * In general, this library takes a _descriptive_ rather than _perscriptive_ approach (see https://amyrey.web.unc.edu/classes/ling-101-online/tutorials/understanding-prescriptive-vs-descriptive-grammar/).\n *\n * Then, in addition to that, it really adds to complexity with TypeScript (TypeScript takes this constraint very very seriously) in a way that's not actually super useful. So, we treat this object as though it could have both or either of `params` and/or `text`.\n */\ntype PostDataBase = PostDataCommon & {\n params?: Param[];\n text?: string;\n};\n\nexport type HarRequest = Omit<NpmHarRequest, 'postData'> & { postData: PostDataBase };\n\nexport interface RequestExtras {\n allHeaders: ReducedHelperObject;\n cookiesObj: ReducedHelperObject;\n fullUrl: string;\n headersObj: ReducedHelperObject;\n postData: PostDataBase & {\n boundary?: string;\n jsonObj?: ReducedHelperObject;\n paramsObj?: ReducedHelperObject;\n };\n queryObj: ReducedHelperObject;\n uriObj: UrlWithParsedQuery;\n}\n\nexport type Request = HarRequest & RequestExtras;\n\ninterface Entry {\n request: Partial<HarRequest>;\n}\n\ninterface HarEntry {\n log: {\n creator: {\n name: string;\n version: string;\n };\n entries: Entry[];\n version: string;\n };\n}\n\nexport interface HTTPSnippetOptions {\n harIsAlreadyEncoded?: boolean;\n}\n\nconst isHarEntry = (value: any): value is HarEntry =>\n typeof value === 'object' &&\n 'log' in value &&\n typeof value.log === 'object' &&\n 'entries' in value.log &&\n Array.isArray(value.log.entries);\n\nexport class HTTPSnippet {\n initCalled = false;\n\n entries: Entry[] = [];\n\n requests: Request[] = [];\n\n options: HTTPSnippetOptions = {};\n\n constructor(input: HarEntry | HarRequest, opts: HTTPSnippetOptions = {}) {\n this.options = {\n harIsAlreadyEncoded: false,\n ...opts,\n };\n\n // prep the main container\n this.requests = [];\n\n // is it har?\n if (isHarEntry(input)) {\n this.entries = input.log.entries;\n } else {\n this.entries = [\n {\n request: input,\n },\n ];\n }\n }\n\n init() {\n this.initCalled = true;\n\n this.requests = this.entries.map(({ request }) => {\n // add optional properties to make validation successful\n const req = {\n bodySize: 0,\n headersSize: 0,\n headers: [],\n cookies: [],\n httpVersion: 'HTTP/1.1',\n queryString: [],\n postData: {\n mimeType: request.postData?.mimeType || 'application/octet-stream',\n },\n ...request,\n };\n\n // Per the HAR spec `mimeType` needs to always be present if we have a `postData` object.\n if (req.postData && !req.postData.mimeType) {\n req.postData.mimeType = 'application/octet-stream';\n }\n\n return this.prepare(req as HarRequest, this.options);\n });\n\n return this;\n }\n\n prepare(harRequest: HarRequest, options: HTTPSnippetOptions) {\n const request: Request = {\n ...harRequest,\n fullUrl: '',\n uriObj: {} as UrlWithParsedQuery,\n queryObj: {},\n headersObj: {},\n cookiesObj: {},\n allHeaders: {},\n };\n\n // construct query objects\n if (request.queryString && request.queryString.length) {\n request.queryObj = request.queryString.reduce(reducer, {});\n }\n\n // construct headers objects\n if (request.headers && request.headers.length) {\n const http2VersionRegex = /^HTTP\\/2/;\n request.headersObj = request.headers.reduce((accumulator, { name, value }) => {\n const headerName = http2VersionRegex.exec(request.httpVersion) ? name.toLocaleLowerCase() : name;\n return {\n ...accumulator,\n [headerName]: value,\n };\n }, {});\n }\n\n // construct headers objects\n if (request.cookies && request.cookies.length) {\n request.cookiesObj = request.cookies.reduceRight(\n (accumulator, { name, value }) => ({\n ...accumulator,\n [name]: value,\n }),\n {},\n );\n }\n\n // construct Cookie header\n const cookies = request.cookies?.map(({ name, value }) => {\n if (options.harIsAlreadyEncoded) {\n return `${name}=${value}`;\n }\n\n return `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n });\n\n if (cookies?.length) {\n request.allHeaders.cookie = cookies.join('; ');\n }\n\n switch (request.postData.mimeType) {\n case 'multipart/mixed':\n case 'multipart/related':\n case 'multipart/form-data':\n case 'multipart/alternative':\n // reset values\n request.postData.text = '';\n request.postData.mimeType = 'multipart/form-data';\n\n if (request.postData?.params) {\n const boundary = '---011000010111000001101001'; // this is binary for \"api\" (easter egg)\n const carriage = `${boundary}--`;\n const rn = '\\r\\n';\n\n /*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */\n const escape = (str: string) => str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22');\n const normalizeLinefeeds = (value: string) => value.replace(/\\r?\\n|\\r/g, '\\r\\n');\n\n const payload = [`--${boundary}`];\n request.postData?.params.forEach((param, i) => {\n const name = param.name;\n const value = param.value || '';\n const filename = param.fileName || null;\n const contentType = param.contentType || 'application/octet-stream';\n\n if (filename) {\n payload.push(\n `Content-Disposition: form-data; name=\"${escape(normalizeLinefeeds(name))}\"; filename=\"${filename}\"`,\n );\n payload.push(`Content-Type: ${contentType}`);\n } else {\n payload.push(`Content-Disposition: form-data; name=\"${escape(normalizeLinefeeds(name))}\"`);\n }\n\n payload.push('');\n payload.push(normalizeLinefeeds(value));\n\n if (i !== (request.postData.params as Param[]).length - 1) {\n payload.push(`--${boundary}`);\n }\n });\n\n payload.push(`--${carriage}`);\n\n request.postData.boundary = boundary;\n request.postData.text = payload.join(rn);\n\n // Since headers are case-sensitive we need to see if there's an existing `Content-Type` header that we can override.\n const contentTypeHeader = getHeaderName(request.headersObj, 'content-type') || 'content-type';\n\n request.headersObj[contentTypeHeader] = `multipart/form-data; boundary=${boundary}`;\n }\n break;\n\n case 'application/x-www-form-urlencoded':\n if (!request.postData.params) {\n request.postData.text = '';\n } else {\n // @ts-expect-error the `har-format` types make this challenging\n request.postData.paramsObj = request.postData.params.reduce(reducer, {});\n\n // always overwrite\n request.postData.text = queryStringify(request.postData.paramsObj);\n }\n break;\n\n case 'text/json':\n case 'text/x-json':\n case 'application/json':\n case 'application/x-json':\n request.postData.mimeType = 'application/json';\n\n if (request.postData.text) {\n try {\n request.postData.jsonObj = JSON.parse(request.postData.text);\n } catch (e) {\n // force back to `text/plain` if headers have proper content-type value, then this should also work\n request.postData.mimeType = 'text/plain';\n }\n }\n break;\n }\n\n // create allHeaders object\n const allHeaders = {\n ...request.allHeaders,\n ...request.headersObj,\n };\n\n const urlWithParsedQuery = urlParse(request.url, true, true); //?\n\n // query string key/value pairs in with literal querystrings containd within the url\n request.queryObj = {\n ...request.queryObj,\n ...(urlWithParsedQuery.query as ReducedHelperObject),\n }; //?\n\n // reset uriObj values for a clean url\n let search;\n if (options.harIsAlreadyEncoded) {\n search = queryStringify(request.queryObj, {\n encode: false,\n indices: false,\n });\n } else {\n search = queryStringify(request.queryObj, {\n indices: false,\n });\n }\n\n const uriObj = {\n ...urlWithParsedQuery,\n query: request.queryObj,\n search,\n path: search ? `${urlWithParsedQuery.pathname}?${search}` : urlWithParsedQuery.pathname,\n };\n\n // keep the base url clean of queryString\n const url = urlFormat({\n ...urlWithParsedQuery,\n query: null,\n search: null,\n }); //?\n\n const fullUrl = urlFormat({\n ...urlWithParsedQuery,\n ...uriObj,\n }); //?\n\n return {\n ...request,\n allHeaders,\n fullUrl,\n url,\n uriObj,\n };\n }\n\n convert(targetId: TargetId, clientId?: ClientId, options?: any) {\n if (!this.initCalled) {\n this.init();\n }\n\n if (!options && clientId) {\n options = clientId;\n }\n\n const target = targets[targetId];\n if (!target) {\n return false;\n }\n\n const { convert } = target.clientsById[clientId || target.info.default];\n const results = this.requests.map(request => convert(request, options));\n return results;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/helpers/utils.ts","../src/index.ts"],"names":["queryStringify","urlParse","urlFormat"],"mappings":"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","file":"index.js","sourcesContent":["import type { ClientId, ClientInfo, TargetId, TargetInfo } from '../targets/index.js';\n\nimport { targets } from '../targets/index.js';\n\nexport interface AvailableTarget extends TargetInfo {\n clients: ClientInfo[];\n}\n\nexport const availableTargets = (): AvailableTarget[] =>\n Object.keys(targets).map<AvailableTarget>(targetId => ({\n ...targets[targetId as TargetId].info,\n clients: Object.keys(targets[targetId as TargetId].clientsById).map(\n clientId => targets[targetId as TargetId].clientsById[clientId].info,\n ),\n }));\n\nexport const extname = (targetId: TargetId, clientId: ClientId): '' | `.${string}` => {\n const target = targets[targetId];\n if (!target) {\n return '';\n }\n\n return target.clientsById[clientId]?.info.extname || '';\n};\n","/** biome-ignore-all lint/performance/noBarrelFile: This doesn't really have the aspects of being a barrel file. */\nimport type { UrlWithParsedQuery } from 'node:url';\nimport type { Request as NpmHarRequest, Param, PostDataCommon } from 'har-format';\nimport type { Merge } from 'type-fest';\nimport type { CodeBuilderOptions } from './helpers/code-builder.js';\nimport type { ReducedHelperObject } from './helpers/reducer.js';\nimport type { ClientId, TargetId } from './targets/index.js';\n\nimport { format as urlFormat, parse as urlParse } from 'node:url';\n\nimport { stringify as queryStringify } from 'qs';\n\nimport { getHeaderName } from './helpers/headers.js';\nimport { reducer } from './helpers/reducer.js';\nimport { targets } from './targets/index.js';\n\nexport { availableTargets, extname } from './helpers/utils.js';\nexport { addClientPlugin, addTarget, addTargetClient } from './targets/index.js';\n\n/** is this wrong? yes. according to the spec (http://www.softwareishard.com/blog/har-12-spec/#postData) it's technically wrong since `params` and `text` are (by the spec) mutually exclusive. However, in practice, this is not what is often the case.\n *\n * In general, this library takes a _descriptive_ rather than _perscriptive_ approach (see https://amyrey.web.unc.edu/classes/ling-101-online/tutorials/understanding-prescriptive-vs-descriptive-grammar/).\n *\n * Then, in addition to that, it really adds to complexity with TypeScript (TypeScript takes this constraint very very seriously) in a way that's not actually super useful. So, we treat this object as though it could have both or either of `params` and/or `text`.\n */\ntype PostDataBase = PostDataCommon & {\n params?: Param[];\n text?: string;\n};\n\nexport type { Client } from './targets/index.js';\n\nexport type HarRequest = Omit<NpmHarRequest, 'postData'> & { postData: PostDataBase };\n\nexport interface RequestExtras {\n allHeaders: ReducedHelperObject;\n cookiesObj: ReducedHelperObject;\n fullUrl: string;\n headersObj: ReducedHelperObject;\n postData: PostDataBase & {\n boundary?: string;\n jsonObj?: ReducedHelperObject;\n paramsObj?: ReducedHelperObject;\n };\n queryObj: ReducedHelperObject;\n uriObj: UrlWithParsedQuery;\n}\n\nexport type Request = HarRequest & RequestExtras;\n\ninterface Entry {\n request: Partial<HarRequest>;\n}\n\ninterface HarEntry {\n log: {\n creator: {\n name: string;\n version: string;\n };\n entries: Entry[];\n version: string;\n };\n}\n\nexport type Options = Merge<CodeBuilderOptions, Record<string, any>>;\n\nexport interface HTTPSnippetOptions {\n harIsAlreadyEncoded?: boolean;\n}\n\nconst isHarEntry = (value: any): value is HarEntry =>\n typeof value === 'object' &&\n 'log' in value &&\n typeof value.log === 'object' &&\n 'entries' in value.log &&\n Array.isArray(value.log.entries);\n\nexport class HTTPSnippet {\n initCalled = false;\n\n entries: Entry[] = [];\n\n requests: Request[] = [];\n\n options: HTTPSnippetOptions = {};\n\n constructor(input: HarEntry | HarRequest, opts: HTTPSnippetOptions = {}) {\n this.options = {\n harIsAlreadyEncoded: false,\n ...opts,\n };\n\n // prep the main container\n this.requests = [];\n\n // is it har?\n if (isHarEntry(input)) {\n this.entries = input.log.entries;\n } else {\n this.entries = [\n {\n request: input,\n },\n ];\n }\n }\n\n init(): HTTPSnippet {\n this.initCalled = true;\n\n this.requests = this.entries.map(({ request }) => {\n // add optional properties to make validation successful\n const req = {\n bodySize: 0,\n headersSize: 0,\n headers: [],\n cookies: [],\n httpVersion: 'HTTP/1.1',\n queryString: [],\n postData: {\n mimeType: request.postData?.mimeType || 'application/octet-stream',\n },\n ...request,\n };\n\n // Per the HAR spec `mimeType` needs to always be present if we have a `postData` object.\n if (req.postData && !req.postData.mimeType) {\n req.postData.mimeType = 'application/octet-stream';\n }\n\n return this.prepare(req as HarRequest, this.options);\n });\n\n return this;\n }\n\n prepare(\n harRequest: HarRequest,\n options: HTTPSnippetOptions,\n ): Request & {\n allHeaders: Record<string, string[] | string>;\n fullUrl: string;\n url: string;\n uriObj: {\n query: ReducedHelperObject;\n search: string;\n path: string | null;\n auth: string | null;\n hash: string | null;\n host: string | null;\n hostname: string | null;\n href: string;\n pathname: string | null;\n protocol: string | null;\n slashes: boolean | null;\n port: string | null;\n };\n } {\n const request: Request = {\n ...harRequest,\n fullUrl: '',\n uriObj: {} as UrlWithParsedQuery,\n queryObj: {},\n headersObj: {},\n cookiesObj: {},\n allHeaders: {},\n };\n\n // construct query objects\n if (request?.queryString.length) {\n request.queryObj = request.queryString.reduce(reducer, {});\n }\n\n // construct headers objects\n if (request?.headers.length) {\n const http2VersionRegex = /^HTTP\\/2/;\n request.headersObj = request.headers.reduce((accumulator, { name, value }) => {\n const headerName = http2VersionRegex.exec(request.httpVersion) ? name.toLocaleLowerCase() : name;\n return {\n ...accumulator,\n [headerName]: value,\n };\n }, {});\n }\n\n // construct headers objects\n if (request?.cookies.length) {\n request.cookiesObj = request.cookies.reduceRight(\n (accumulator, { name, value }) => ({\n ...accumulator,\n [name]: value,\n }),\n {},\n );\n }\n\n // construct Cookie header\n const cookies = request.cookies?.map(({ name, value }) => {\n if (options.harIsAlreadyEncoded) {\n return `${name}=${value}`;\n }\n\n return `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n });\n\n if (cookies?.length) {\n request.allHeaders.cookie = cookies.join('; ');\n }\n\n switch (request.postData.mimeType) {\n case 'multipart/mixed':\n case 'multipart/related':\n case 'multipart/form-data':\n case 'multipart/alternative':\n // reset values\n request.postData.text = '';\n request.postData.mimeType = 'multipart/form-data';\n\n if (request.postData?.params) {\n const boundary = '---011000010111000001101001'; // this is binary for \"api\" (easter egg)\n const carriage = `${boundary}--`;\n const rn = '\\r\\n';\n\n /*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */\n const escapeStr = (str: string) => str.replace(/\\n/g, '%0A').replace(/\\r/g, '%0D').replace(/\"/g, '%22');\n const normalizeLinefeeds = (value: string) => value.replace(/\\r?\\n|\\r/g, '\\r\\n');\n\n const payload = [`--${boundary}`];\n request.postData?.params.forEach((param, i) => {\n const name = param.name;\n const value = param.value || '';\n const filename = param.fileName || null;\n const contentType = param.contentType || 'application/octet-stream';\n\n if (filename) {\n payload.push(\n `Content-Disposition: form-data; name=\"${escapeStr(normalizeLinefeeds(name))}\"; filename=\"${filename}\"`,\n );\n payload.push(`Content-Type: ${contentType}`);\n } else {\n payload.push(`Content-Disposition: form-data; name=\"${escape(normalizeLinefeeds(name))}\"`);\n }\n\n payload.push('');\n payload.push(normalizeLinefeeds(value));\n\n if (i !== (request.postData.params as Param[]).length - 1) {\n payload.push(`--${boundary}`);\n }\n });\n\n payload.push(`--${carriage}`);\n\n request.postData.boundary = boundary;\n request.postData.text = payload.join(rn);\n\n // Since headers are case-sensitive we need to see if there's an existing `Content-Type` header that we can override.\n const contentTypeHeader = getHeaderName(request.headersObj, 'content-type') || 'content-type';\n\n request.headersObj[contentTypeHeader] = `multipart/form-data; boundary=${boundary}`;\n }\n break;\n\n case 'application/x-www-form-urlencoded':\n if (!request.postData.params) {\n request.postData.text = '';\n } else {\n // @ts-expect-error the `har-format` types make this challenging\n request.postData.paramsObj = request.postData.params.reduce(reducer, {});\n\n // always overwrite\n request.postData.text = queryStringify(request.postData.paramsObj);\n }\n break;\n\n case 'text/json':\n case 'text/x-json':\n case 'application/json':\n case 'application/x-json':\n request.postData.mimeType = 'application/json';\n\n if (request.postData.text) {\n try {\n request.postData.jsonObj = JSON.parse(request.postData.text);\n } catch {\n // force back to `text/plain` if headers have proper content-type value, then this should also work\n request.postData.mimeType = 'text/plain';\n }\n }\n break;\n }\n\n // create allHeaders object\n const allHeaders = {\n ...request.allHeaders,\n ...request.headersObj,\n };\n\n const urlWithParsedQuery = urlParse(request.url, true, true); //?\n\n // query string key/value pairs in with literal querystrings containd within the url\n request.queryObj = {\n ...request.queryObj,\n ...(urlWithParsedQuery.query as ReducedHelperObject),\n }; //?\n\n // reset uriObj values for a clean url\n let search: string;\n if (options.harIsAlreadyEncoded) {\n search = queryStringify(request.queryObj, {\n encode: false,\n indices: false,\n });\n } else {\n search = queryStringify(request.queryObj, {\n indices: false,\n });\n }\n\n const uriObj = {\n ...urlWithParsedQuery,\n query: request.queryObj,\n search,\n path: search ? `${urlWithParsedQuery.pathname}?${search}` : urlWithParsedQuery.pathname,\n };\n\n // keep the base url clean of queryString\n const url = urlFormat({\n ...urlWithParsedQuery,\n query: null,\n search: null,\n });\n\n const fullUrl = urlFormat({\n ...urlWithParsedQuery,\n ...uriObj,\n });\n\n return {\n ...request,\n allHeaders,\n fullUrl,\n url,\n uriObj,\n };\n }\n\n convert(targetId: TargetId, clientId?: ClientId, options?: Options): (string | false)[] {\n if (!this.initCalled) {\n this.init();\n }\n\n if (!options && clientId) {\n options = { clientId };\n }\n\n const target = targets[targetId];\n if (!target) {\n return [false];\n }\n\n const { convert } = target.clientsById[clientId || target.info.default];\n const results = this.requests.map(request => convert(request, options));\n return results;\n }\n\n installation(targetId: TargetId, clientId?: ClientId, options?: Options): (string | false)[] {\n if (!this.initCalled) {\n this.init();\n }\n\n if (!options && clientId) {\n options = { clientId };\n }\n\n const target = targets[targetId];\n if (!target) {\n return [false];\n }\n\n const { info } = target.clientsById[clientId || target.info.default];\n const results = this.requests.map(request => (info?.installation ? info.installation(request, options) : false));\n return results;\n }\n}\n"]}