@readme/httpsnippet 11.0.0 → 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-452Q5GGQ.js';
3
- export { addClientPlugin, addTarget, addTargetClient } from './chunk-452Q5GGQ.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":"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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 = () =>\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"]}
@@ -497,7 +497,7 @@ var restsharp = {
497
497
  link: "http://restsharp.org/",
498
498
  description: "Simple REST and HTTP API Client for .NET",
499
499
  extname: ".cs",
500
- installation: "dotnet add package RestSharp"
500
+ installation: () => "dotnet add package RestSharp"
501
501
  },
502
502
  convert: ({ method, fullUrl, headersObj, cookies, postData, uriObj }) => {
503
503
  const { push, join } = new CodeBuilder();
@@ -906,7 +906,7 @@ var axios = {
906
906
  link: "https://github.com/axios/axios",
907
907
  description: "Promise based HTTP client for the browser and node.js",
908
908
  extname: ".js",
909
- installation: "npm install axios --save"
909
+ installation: () => "npm install axios --save"
910
910
  },
911
911
  convert: ({ allHeaders, method, url, queryObj, postData }, options) => {
912
912
  const opts = {
@@ -1005,7 +1005,7 @@ var fetch = {
1005
1005
  options.body = postData.jsonObj;
1006
1006
  }
1007
1007
  break;
1008
- case "multipart/form-data":
1008
+ case "multipart/form-data": {
1009
1009
  if (!postData.params) {
1010
1010
  break;
1011
1011
  }
@@ -1019,6 +1019,7 @@ var fetch = {
1019
1019
  });
1020
1020
  blank();
1021
1021
  break;
1022
+ }
1022
1023
  default:
1023
1024
  if (postData.text) {
1024
1025
  options.body = postData.text;
@@ -1229,7 +1230,7 @@ var native2 = {
1229
1230
  payload = postData.jsonObj;
1230
1231
  }
1231
1232
  break;
1232
- case "multipart/form-data":
1233
+ case "multipart/form-data": {
1233
1234
  if (!postData.params) {
1234
1235
  break;
1235
1236
  }
@@ -1239,6 +1240,7 @@ var native2 = {
1239
1240
  });
1240
1241
  payload = multipartPayload;
1241
1242
  break;
1243
+ }
1242
1244
  default:
1243
1245
  if (postData.text) {
1244
1246
  payload = postData.text;
@@ -1335,7 +1337,7 @@ var axios2 = {
1335
1337
  link: "https://github.com/axios/axios",
1336
1338
  description: "Promise based HTTP client for the browser and node.js",
1337
1339
  extname: ".js",
1338
- installation: "npm install axios --save"
1340
+ installation: () => "npm install axios --save"
1339
1341
  },
1340
1342
  convert: ({ method, fullUrl, allHeaders, postData }, options) => {
1341
1343
  const opts = {
@@ -1420,7 +1422,7 @@ var fetch2 = {
1420
1422
  reqOpts.body = postData.jsonObj;
1421
1423
  }
1422
1424
  break;
1423
- case "multipart/form-data":
1425
+ case "multipart/form-data": {
1424
1426
  if (!postData.params) {
1425
1427
  break;
1426
1428
  }
@@ -1444,6 +1446,7 @@ var fetch2 = {
1444
1446
  reqOpts.body = "formData";
1445
1447
  blank();
1446
1448
  break;
1449
+ }
1447
1450
  default:
1448
1451
  if (postData.text) {
1449
1452
  reqOpts.body = postData.text;
@@ -1741,7 +1744,7 @@ var cohttp = {
1741
1744
  link: "https://github.com/mirage/ocaml-cohttp",
1742
1745
  description: "Cohttp is a very lightweight HTTP server using Lwt or Async for OCaml",
1743
1746
  extname: ".ml",
1744
- installation: "opam install cohttp-lwt-unix cohttp-async"
1747
+ installation: () => "opam install cohttp-lwt-unix cohttp-async"
1745
1748
  },
1746
1749
  convert: ({ fullUrl, allHeaders, postData, method }, options) => {
1747
1750
  const opts = {
@@ -1988,7 +1991,7 @@ var guzzle = {
1988
1991
  link: "http://docs.guzzlephp.org/en/stable/",
1989
1992
  description: "PHP with Guzzle",
1990
1993
  extname: ".php",
1991
- installation: "composer require guzzlehttp/guzzle"
1994
+ installation: () => "composer require guzzlehttp/guzzle"
1992
1995
  },
1993
1996
  convert: ({ postData, fullUrl, method, cookies, headersObj }, options) => {
1994
1997
  const opts = {
@@ -2049,9 +2052,7 @@ var guzzle = {
2049
2052
  requestPush(`'body' => ${convertType(postData.text)},`, 1);
2050
2053
  }
2051
2054
  }
2052
- const headers = Object.keys(headersObj).sort().map(function(key) {
2053
- return `${opts.indent}${opts.indent}'${key}' => '${escapeForSingleQuotes(headersObj[key])}',`;
2054
- });
2055
+ const headers = Object.keys(headersObj).sort().map((key) => `${opts.indent}${opts.indent}'${key}' => '${escapeForSingleQuotes(headersObj[key])}',`);
2055
2056
  const cookieString = cookies.map((cookie) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`).join("; ");
2056
2057
  if (cookieString.length) {
2057
2058
  headers.push(`${opts.indent}${opts.indent}'cookie' => '${escapeForSingleQuotes(cookieString)}',`);
@@ -2414,7 +2415,7 @@ var requests = {
2414
2415
  link: "http://docs.python-requests.org/en/latest/api/#requests.request",
2415
2416
  description: "Requests HTTP library",
2416
2417
  extname: ".py",
2417
- installation: "python -m pip install requests"
2418
+ installation: () => "python -m pip install requests"
2418
2419
  },
2419
2420
  convert: ({ fullUrl, postData, allHeaders, method }, options) => {
2420
2421
  const opts = {
@@ -2818,18 +2819,16 @@ ${indent}` : " "
2818
2819
  case "application/x-www-form-urlencoded":
2819
2820
  if (postData.params) {
2820
2821
  postData.params.forEach((param) => {
2821
- const unencoded = param.name;
2822
2822
  const encoded = encodeURIComponent(param.name);
2823
- const needsEncoding = encoded !== unencoded;
2824
- const name = needsEncoding ? encoded : unencoded;
2825
- const flag = binary ? "--data-binary" : needsEncoding ? "--data-urlencode" : arg("data");
2823
+ const name = encoded !== param.name ? encoded : param.name;
2824
+ const flag = binary ? "--data-binary" : "--data-urlencode";
2826
2825
  push(`${flag} ${quote(`${name}=${param.value}`)}`);
2827
2826
  });
2828
2827
  } else {
2829
2828
  push(`${binary ? "--data-binary" : arg("data")} ${quote(postData.text)}`);
2830
2829
  }
2831
2830
  break;
2832
- default:
2831
+ default: {
2833
2832
  if (!postData.text) {
2834
2833
  break;
2835
2834
  }
@@ -2856,13 +2855,14 @@ ${JSON.stringify(jsonPayload, null, indentJSON)}
2856
2855
  '`
2857
2856
  );
2858
2857
  }
2859
- } catch (err) {
2858
+ } catch {
2860
2859
  }
2861
2860
  }
2862
2861
  }
2863
2862
  if (!builtPayload) {
2864
2863
  push(`${binary ? "--data-binary" : arg("data")} ${quote(postData.text)}`);
2865
2864
  }
2865
+ }
2866
2866
  }
2867
2867
  return join();
2868
2868
  }
@@ -2876,7 +2876,7 @@ var httpie = {
2876
2876
  link: "http://httpie.org/",
2877
2877
  description: "a CLI, cURL-like tool for humans",
2878
2878
  extname: ".sh",
2879
- installation: "brew install httpie"
2879
+ installation: () => "brew install httpie"
2880
2880
  },
2881
2881
  convert: ({ allHeaders, postData, queryObj, fullUrl, method, url }, options) => {
2882
2882
  const opts = {
@@ -2945,7 +2945,7 @@ ${opts.indent}` : " "
2945
2945
  push(`${key}:${quote(allHeaders[key])}`);
2946
2946
  });
2947
2947
  if (postData.mimeType === "application/x-www-form-urlencoded") {
2948
- if (postData.params && postData.params.length) {
2948
+ if (postData.params?.length) {
2949
2949
  flags.push(opts.short ? "-f" : "--form");
2950
2950
  postData.params.forEach((param) => {
2951
2951
  push(`${param.name}=${quote(param.value)}`);
@@ -3101,7 +3101,9 @@ var urlsession = {
3101
3101
  const parameters = postData.params.map((p) => `"${p.name}": "${p.value}"`);
3102
3102
  if (opts.pretty) {
3103
3103
  push("let parameters = [");
3104
- parameters.forEach((param) => push(`${param},`, 1));
3104
+ parameters.forEach((param) => {
3105
+ push(`${param},`, 1);
3106
+ });
3105
3107
  push("]");
3106
3108
  } else {
3107
3109
  push(`let parameters = [${parameters.join(", ")}]`);