@readme/httpsnippet 7.1.0 → 7.1.1
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-27be831e.d.ts → index-ae5e535e.d.ts} +1 -1
- package/dist/{index-e612cd58.d.ts → index-c415b193.d.ts} +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/dist/targets/index.d.mts +1 -1
- package/dist/targets/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { targets, getHeaderName } from './chunk-DTZD7L6R.mjs';
|
|
|
3
3
|
export { addTarget, addTargetClient } from './chunk-DTZD7L6R.mjs';
|
|
4
4
|
import './chunk-UEOS42PC.mjs';
|
|
5
5
|
import { parse, format } from 'url';
|
|
6
|
-
import
|
|
6
|
+
import * as eventStream from 'event-stream';
|
|
7
7
|
import FormData from 'form-data';
|
|
8
8
|
import { stringify } from 'qs';
|
|
9
9
|
|
|
@@ -46,6 +46,7 @@ var availableTargets = () => Object.keys(targets).map((targetId) => ({
|
|
|
46
46
|
var extname = (targetId) => targets[targetId]?.info.extname || "";
|
|
47
47
|
|
|
48
48
|
// src/index.ts
|
|
49
|
+
var { map: eventStreamMap } = eventStream;
|
|
49
50
|
var isHarEntry = (value) => typeof value === "object" && "log" in value && typeof value.log === "object" && "entries" in value.log && Array.isArray(value.log.entries);
|
|
50
51
|
var HTTPSnippet = class {
|
|
51
52
|
constructor(input, opts = {}) {
|
|
@@ -131,7 +132,7 @@ var HTTPSnippet = class {
|
|
|
131
132
|
} else {
|
|
132
133
|
form.pipe(
|
|
133
134
|
// @ts-expect-error TODO
|
|
134
|
-
|
|
135
|
+
eventStreamMap((data) => {
|
|
135
136
|
request.postData.text += data;
|
|
136
137
|
})
|
|
137
138
|
);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/helpers/form-data.ts","../src/helpers/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,SAAS,UAAU,WAAW,SAAS,gBAAgB;AAEvD,SAAS,OAAO,sBAAsB;AACtC,OAAO,cAAc;AACrB,SAAS,aAAa,sBAAsB;;;ACqB5C,IAAM,WAAW;AACjB,IAAM,SAAS,IAAI,OAAO,CAAC;AAE3B,IAAM,OAAO,OAAO;AAEb,IAAM,SAAS,CAAC,WACrB,OAAO,WAAW,YAClB,OAAO,OAAO,gBAAgB,cAC9B,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,WAAW,cACzB,OAAO,OAAO,gBAAgB,cAC9B,gBAAgB,KAAK,OAAO,IAAI,CAAC;AAEnC,IAAM,YAAY,CAAC,aAAqB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,OAAO,CAAC,CAAC;AAE1F,IAAM,YAAY,CAAC,UAAkB,MAAc,UAA0C;AAC3F,MAAI,SAAS;AAEb,YAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ;AACzC,YAAU,yCAAyC,IAAI;AAEvD,MAAI,OAAO,KAAK,GAAG;AACjB,cAAU,eAAe,MAAM,IAAI,IAAI,QAAQ;AAC/C,cAAU,iBAAiB,MAAM,QAAQ,0BAA0B;AAAA,EACrE;AAEA,SAAO,GAAG,MAAM,GAAG,SAAS,OAAO,CAAC,CAAC;AACvC;AAEO,IAAM,mBAAmB,WAAW,MAAgB,UAAkB;AAG3E,aAAW,CAAC,MAAM,KAAK,KAAK,MAAM;AAChC,UAAM,UAAU,UAAU,MAAM,KAAK;AAErC,QAAI,OAAO,KAAK,GAAG;AACjB,aAAO,MAAM,OAAO;AAAA,IACtB,OAAO;AACL,YAAM;AAAA,IACR;AAEA,UAAM;AAAA,EACR;AAEA,QAAM,UAAU,QAAQ;AAC1B;;;ACnEO,IAAM,mBAAmB,MAC9B,OAAO,KAAK,OAAO,EAAE,IAAqB,eAAa;AAAA,EACrD,GAAG,QAAQ,QAAoB,EAAE;AAAA,EACjC,SAAS,OAAO,KAAK,QAAQ,QAAoB,EAAE,WAAW,EAAE;AAAA,IAC9D,cAAY,QAAQ,QAAoB,EAAE,YAAY,QAAQ,EAAE;AAAA,EAClE;AACF,EAAE;AAEG,IAAM,UAAU,CAAC,aAAuB,QAAQ,QAAQ,GAAG,KAAK,WAAW;;;AFmDlF,IAAM,aAAa,CAAC,UAClB,OAAO,UAAU,YACjB,SAAS,SACT,OAAO,MAAM,QAAQ,YACrB,aAAa,MAAM,OACnB,MAAM,QAAQ,MAAM,IAAI,OAAO;AAE1B,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,OAA8B,OAA2B,CAAC,GAAG;AAFzE,oBAAsB,CAAC;AAgDvB,mBAAU,CAAC,YAAwB,YAAgC;AACjE,YAAM,UAAmB;AAAA,QACvB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,QAAQ,CAAC;AAAA,QACT,UAAU,CAAC;AAAA,QACX,YAAY,CAAC;AAAA,QACb,YAAY,CAAC;AAAA,QACb,YAAY,CAAC;AAAA,MACf;AAGA,UAAI,QAAQ,eAAe,QAAQ,YAAY,QAAQ;AACrD,gBAAQ,WAAW,QAAQ,YAAY,OAAO,SAAS,CAAC,CAAC;AAAA,MAC3D;AAGA,UAAI,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAC7C,cAAM,oBAAoB;AAC1B,gBAAQ,aAAa,QAAQ,QAAQ,OAAO,CAAC,aAAa,EAAE,MAAM,MAAM,MAAM;AAC5E,gBAAM,aAAa,kBAAkB,KAAK,QAAQ,WAAW,IAAI,KAAK,kBAAkB,IAAI;AAC5F,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,CAAC,UAAU,GAAG;AAAA,UAChB;AAAA,QACF,GAAG,CAAC,CAAC;AAAA,MACP;AAGA,UAAI,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAC7C,gBAAQ,aAAa,QAAQ,QAAQ;AAAA,UACnC,CAAC,aAAa,EAAE,MAAM,MAAM,OAAO;AAAA,YACjC,GAAG;AAAA,YACH,CAAC,IAAI,GAAG;AAAA,UACV;AAAA,UACA,CAAC;AAAA,QACH;AAAA,MACF;AAGA,YAAM,UAAU,QAAQ,SAAS,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM;AACxD,YAAI,QAAQ,qBAAqB;AAC/B,iBAAO,GAAG,IAAI,IAAI,KAAK;AAAA,QACzB;AAEA,eAAO,GAAG,mBAAmB,IAAI,CAAC,IAAI,mBAAmB,KAAK,CAAC;AAAA,MACjE,CAAC;AAED,UAAI,SAAS,QAAQ;AACnB,gBAAQ,WAAW,SAAS,QAAQ,KAAK,IAAI;AAAA,MAC/C;AAEA,cAAQ,QAAQ,SAAS,UAAU;AAAA,QACjC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAEH,kBAAQ,SAAS,OAAO;AACxB,kBAAQ,SAAS,WAAW;AAE5B,cAAI,QAAQ,UAAU,QAAQ;AAC5B,kBAAM,OAAO,IAAI,SAAS;AAa1B,kBAAM,mBAAmB,OAAO,KAAK,OAAO,QAAQ,MAAM;AAK1D,kBAAM,WAAW;AACjB,gBAAI,CAAC,kBAAkB;AAErB,mBAAK,YAAY;AAAA,YACnB;AAEA,oBAAQ,UAAU,OAAO,QAAQ,WAAS;AACxC,oBAAM,OAAO,MAAM;AACnB,oBAAM,QAAQ,MAAM,SAAS;AAC7B,oBAAM,WAAW,MAAM,YAAY;AAEnC,kBAAI,kBAAkB;AACpB,oBAAI,OAAO,KAAK,GAAG;AAEjB,uBAAK,OAAO,MAAM,OAAO,QAAQ;AAAA,gBACnC,OAAO;AACL,uBAAK,OAAO,MAAM,KAAK;AAAA,gBACzB;AAAA,cACF,OAAO;AACL,qBAAK,OAAO,MAAM,OAAO;AAAA;AAAA,kBAEvB;AAAA;AAAA,kBAEA,aAAa,MAAM,eAAe;AAAA,gBACpC,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAED,gBAAI,kBAAkB;AAEpB,yBAAW,QAAQ,iBAAiB,MAAM,QAAQ,GAAG;AACnD,wBAAQ,SAAS,QAAQ;AAAA,cAC3B;AAAA,YACF,OAAO;AACL,mBAAK;AAAA;AAAA,gBAEH,eAAe,UAAQ;AACrB,0BAAQ,SAAS,QAAQ;AAAA,gBAC3B,CAAC;AAAA,cACH;AAAA,YACF;AAEA,oBAAQ,SAAS,WAAW;AAG5B,kBAAM,oBAAoB,cAAc,QAAQ,YAAY,cAAc,KAAK;AAE/E,oBAAQ,WAAW,iBAAiB,IAAI,iCAAiC,QAAQ;AAAA,UACnF;AACA;AAAA,QAEF,KAAK;AACH,cAAI,CAAC,QAAQ,SAAS,QAAQ;AAC5B,oBAAQ,SAAS,OAAO;AAAA,UAC1B,OAAO;AAEL,oBAAQ,SAAS,YAAY,QAAQ,SAAS,OAAO,OAAO,SAAS,CAAC,CAAC;AAGvE,oBAAQ,SAAS,OAAO,eAAe,QAAQ,SAAS,SAAS;AAAA,UACnE;AACA;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,kBAAQ,SAAS,WAAW;AAE5B,cAAI,QAAQ,SAAS,MAAM;AACzB,gBAAI;AACF,sBAAQ,SAAS,UAAU,KAAK,MAAM,QAAQ,SAAS,IAAI;AAAA,YAC7D,SAAS,GAAG;AAEV,sBAAQ,SAAS,WAAW;AAAA,YAC9B;AAAA,UACF;AACA;AAAA,MACJ;AAGA,YAAM,aAAa;AAAA,QACjB,GAAG,QAAQ;AAAA,QACX,GAAG,QAAQ;AAAA,MACb;AAEA,YAAM,qBAAqB,SAAS,QAAQ,KAAK,MAAM,IAAI;AAG3D,cAAQ,WAAW;AAAA,QACjB,GAAG,QAAQ;AAAA,QACX,GAAI,mBAAmB;AAAA,MACzB;AAGA,UAAI;AACJ,UAAI,QAAQ,qBAAqB;AAC/B,iBAAS,eAAe,QAAQ,UAAU;AAAA,UACxC,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,eAAe,QAAQ,UAAU;AAAA,UACxC,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAEA,YAAM,SAAS;AAAA,QACb,GAAG;AAAA,QACH,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,MAAM,SAAS,GAAG,mBAAmB,QAAQ,IAAI,MAAM,KAAK,mBAAmB;AAAA,MACjF;AAGA,YAAM,MAAM,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,UAAU,UAAU;AAAA,QACxB,GAAG;AAAA,QACH,GAAG;AAAA,MACL,CAAC;AAED,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,mBAAU,CAAC,UAAoB,UAAqB,YAAkB;AACpE,UAAI,CAAC,WAAW,UAAU;AACxB,kBAAU;AAAA,MACZ;AAEA,YAAM,SAAS,QAAQ,QAAQ;AAC/B,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,QAAQ,IAAI,OAAO,YAAY,YAAY,OAAO,KAAK,OAAO;AACtE,YAAM,UAAU,KAAK,SAAS,IAAI,aAAW,QAAQ,SAAS,OAAO,CAAC;AACtE,aAAO,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,IAC7C;AAjRE,QAAI,UAAmB,CAAC;AAExB,UAAM,UAAU;AAAA,MACd,qBAAqB;AAAA,MACrB,GAAG;AAAA,IACL;AAGA,SAAK,WAAW,CAAC;AAGjB,QAAI,WAAW,KAAK,GAAG;AACrB,gBAAU,MAAM,IAAI;AAAA,IACtB,OAAO;AACL,gBAAU;AAAA,QACR;AAAA,UACE,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAE/B,YAAM,MAAM;AAAA,QACV,UAAU;AAAA,QACV,aAAa;AAAA,QACb,SAAS,CAAC;AAAA,QACV,SAAS,CAAC;AAAA,QACV,aAAa;AAAA,QACb,aAAa,CAAC;AAAA,QACd,UAAU;AAAA,UACR,UAAU,QAAQ,UAAU,YAAY;AAAA,QAC1C;AAAA,QACA,GAAG;AAAA,MACL;AAGA,UAAI,IAAI,YAAY,CAAC,IAAI,SAAS,UAAU;AAC1C,YAAI,SAAS,WAAW;AAAA,MAC1B;AAEA,WAAK,SAAS,KAAK,KAAK,QAAQ,KAAmB,OAAO,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAuOF","sourcesContent":["import type { ReducedHelperObject } from './helpers/reducer';\nimport type { ClientId, TargetId } from './targets';\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 { map as eventStreamMap } from 'event-stream';\nimport FormData from 'form-data';\nimport { stringify as queryStringify } from 'qs';\n\nimport { formDataIterator, isBlob } from './helpers/form-data';\nimport { getHeaderName } from './helpers/headers';\nimport { reducer } from './helpers/reducer';\nimport { targets } from './targets';\n\nexport { availableTargets, extname } from './helpers/utils';\nexport { addTarget, addTargetClient } from './targets';\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 requests: Request[] = [];\n\n constructor(input: HarEntry | HarRequest, opts: HTTPSnippetOptions = {}) {\n let entries: Entry[] = [];\n\n const 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 entries = input.log.entries;\n } else {\n entries = [\n {\n request: input,\n },\n ];\n }\n\n entries.forEach(({ 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 this.requests.push(this.prepare(req as HarRequest, options));\n });\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 form = new FormData();\n\n // The `form-data` module returns one of two things: a native FormData object, or its own polyfill\n // Since the polyfill does not support the full API of the native FormData object, when this library is running in a browser environment it'll fail on two things:\n //\n // 1. The API for `form.append()` has three arguments and the third should only be present when the second is a\n // Blob or USVString.\n // 1. `FormData.pipe()` isn't a function.\n //\n // Since the native FormData object is iterable, we easily detect what version of `form-data` we're working with here to allow `multipart/form-data` requests to be compiled under both browser and Node environments.\n //\n // This hack is pretty awful but it's the only way we can use this library in the browser as if we code this against just the native FormData object, we can't polyfill that back into Node because Blob and File objects, which something like `formdata-polyfill` requires, don't exist there.\n // @ts-expect-error TODO\n const isNativeFormData = typeof form[Symbol.iterator] === 'function';\n\n // TODO: THIS ABSOLUTELY MUST BE REMOVED.\n // IT BREAKS SOME USE-CASES FOR MULTIPART FORMS THAT DEPEND ON BEING ABLE TO SET THE BOUNDARY.\n // easter egg\n const boundary = '---011000010111000001101001'; // this is binary for \"api\". yep.\n if (!isNativeFormData) {\n // @ts-expect-error THIS IS WRONG. VERY WRONG.\n form._boundary = boundary;\n }\n\n request.postData?.params.forEach(param => {\n const name = param.name;\n const value = param.value || '';\n const filename = param.fileName || null;\n\n if (isNativeFormData) {\n if (isBlob(value)) {\n // @ts-expect-error TODO\n form.append(name, value, filename);\n } else {\n form.append(name, value);\n }\n } else {\n form.append(name, value, {\n // @ts-expect-error TODO\n filename,\n // @ts-expect-error TODO\n contentType: param.contentType || null,\n });\n }\n });\n\n if (isNativeFormData) {\n // eslint-disable-next-line no-restricted-syntax\n for (const data of formDataIterator(form, boundary)) {\n request.postData.text += data;\n }\n } else {\n form.pipe(\n // @ts-expect-error TODO\n eventStreamMap(data => {\n request.postData.text += data;\n }),\n );\n }\n\n request.postData.boundary = boundary;\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 (!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.length === 1 ? results[0] : results;\n };\n}\n","/**\n * @license https://raw.githubusercontent.com/node-fetch/node-fetch/master/LICENSE.md\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 - 2020 Node Fetch Team\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * Extracted from https://github.com/node-fetch/node-fetch/blob/64c5c296a0250b852010746c76144cb9e14698d9/src/utils/form-data.js\n */\n\nimport type FormData from 'form-data';\n\nconst carriage = '\\r\\n';\nconst dashes = '-'.repeat(2);\n\nconst NAME = Symbol.toStringTag;\n\nexport const isBlob = (object: any) =>\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function' &&\n /^(Blob|File)$/.test(object[NAME]);\n\nconst getFooter = (boundary: string) => `${dashes}${boundary}${dashes}${carriage.repeat(2)}`;\n\nconst getHeader = (boundary: string, name: string, field: { name: string; type: string }) => {\n let header = '';\n\n header += `${dashes}${boundary}${carriage}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n\n if (isBlob(field)) {\n header += `; filename=\"${field.name}\"${carriage}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n\n return `${header}${carriage.repeat(2)}`;\n};\n\nexport const formDataIterator = function* (form: FormData, boundary: string) {\n // @ts-expect-error not sure how this ever worked\n // eslint-disable-next-line no-restricted-syntax\n for (const [name, value] of form) {\n yield getHeader(boundary, name, value);\n\n if (isBlob(value)) {\n yield* value.stream();\n } else {\n yield value;\n }\n\n yield carriage;\n }\n\n yield getFooter(boundary);\n};\n","import type { ClientInfo, TargetId, TargetInfo } from '../targets';\n\nimport { targets } from '../targets';\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) => targets[targetId]?.info.extname || '';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/helpers/form-data.ts","../src/helpers/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReducedHelperObject } from './helpers/reducer';\nimport type { ClientId, TargetId } from './targets';\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 * as eventStream from 'event-stream';\nimport FormData from 'form-data';\nimport { stringify as queryStringify } from 'qs';\n\nimport { formDataIterator, isBlob } from './helpers/form-data';\nimport { getHeaderName } from './helpers/headers';\nimport { reducer } from './helpers/reducer';\nimport { targets } from './targets';\n\nexport { availableTargets, extname } from './helpers/utils';\nexport { addTarget, addTargetClient } from './targets';\n\nconst { map: eventStreamMap } = eventStream;\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 requests: Request[] = [];\n\n constructor(input: HarEntry | HarRequest, opts: HTTPSnippetOptions = {}) {\n let entries: Entry[] = [];\n\n const 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 entries = input.log.entries;\n } else {\n entries = [\n {\n request: input,\n },\n ];\n }\n\n entries.forEach(({ 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 this.requests.push(this.prepare(req as HarRequest, options));\n });\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 form = new FormData();\n\n // The `form-data` module returns one of two things: a native FormData object, or its own polyfill\n // Since the polyfill does not support the full API of the native FormData object, when this library is running in a browser environment it'll fail on two things:\n //\n // 1. The API for `form.append()` has three arguments and the third should only be present when the second is a\n // Blob or USVString.\n // 1. `FormData.pipe()` isn't a function.\n //\n // Since the native FormData object is iterable, we easily detect what version of `form-data` we're working with here to allow `multipart/form-data` requests to be compiled under both browser and Node environments.\n //\n // This hack is pretty awful but it's the only way we can use this library in the browser as if we code this against just the native FormData object, we can't polyfill that back into Node because Blob and File objects, which something like `formdata-polyfill` requires, don't exist there.\n // @ts-expect-error TODO\n const isNativeFormData = typeof form[Symbol.iterator] === 'function';\n\n // TODO: THIS ABSOLUTELY MUST BE REMOVED.\n // IT BREAKS SOME USE-CASES FOR MULTIPART FORMS THAT DEPEND ON BEING ABLE TO SET THE BOUNDARY.\n // easter egg\n const boundary = '---011000010111000001101001'; // this is binary for \"api\". yep.\n if (!isNativeFormData) {\n // @ts-expect-error THIS IS WRONG. VERY WRONG.\n form._boundary = boundary;\n }\n\n request.postData?.params.forEach(param => {\n const name = param.name;\n const value = param.value || '';\n const filename = param.fileName || null;\n\n if (isNativeFormData) {\n if (isBlob(value)) {\n // @ts-expect-error TODO\n form.append(name, value, filename);\n } else {\n form.append(name, value);\n }\n } else {\n form.append(name, value, {\n // @ts-expect-error TODO\n filename,\n // @ts-expect-error TODO\n contentType: param.contentType || null,\n });\n }\n });\n\n if (isNativeFormData) {\n // eslint-disable-next-line no-restricted-syntax\n for (const data of formDataIterator(form, boundary)) {\n request.postData.text += data;\n }\n } else {\n form.pipe(\n // @ts-expect-error TODO\n eventStreamMap(data => {\n request.postData.text += data;\n }),\n );\n }\n\n request.postData.boundary = boundary;\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 (!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.length === 1 ? results[0] : results;\n };\n}\n","/**\n * @license https://raw.githubusercontent.com/node-fetch/node-fetch/master/LICENSE.md\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 - 2020 Node Fetch Team\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * Extracted from https://github.com/node-fetch/node-fetch/blob/64c5c296a0250b852010746c76144cb9e14698d9/src/utils/form-data.js\n */\n\nimport type FormData from 'form-data';\n\nconst carriage = '\\r\\n';\nconst dashes = '-'.repeat(2);\n\nconst NAME = Symbol.toStringTag;\n\nexport const isBlob = (object: any) =>\n typeof object === 'object' &&\n typeof object.arrayBuffer === 'function' &&\n typeof object.type === 'string' &&\n typeof object.stream === 'function' &&\n typeof object.constructor === 'function' &&\n /^(Blob|File)$/.test(object[NAME]);\n\nconst getFooter = (boundary: string) => `${dashes}${boundary}${dashes}${carriage.repeat(2)}`;\n\nconst getHeader = (boundary: string, name: string, field: { name: string; type: string }) => {\n let header = '';\n\n header += `${dashes}${boundary}${carriage}`;\n header += `Content-Disposition: form-data; name=\"${name}\"`;\n\n if (isBlob(field)) {\n header += `; filename=\"${field.name}\"${carriage}`;\n header += `Content-Type: ${field.type || 'application/octet-stream'}`;\n }\n\n return `${header}${carriage.repeat(2)}`;\n};\n\nexport const formDataIterator = function* (form: FormData, boundary: string) {\n // @ts-expect-error not sure how this ever worked\n // eslint-disable-next-line no-restricted-syntax\n for (const [name, value] of form) {\n yield getHeader(boundary, name, value);\n\n if (isBlob(value)) {\n yield* value.stream();\n } else {\n yield value;\n }\n\n yield carriage;\n }\n\n yield getFooter(boundary);\n};\n","import type { ClientInfo, TargetId, TargetInfo } from '../targets';\n\nimport { targets } from '../targets';\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) => targets[targetId]?.info.extname || '';\n"]}
|
package/dist/targets/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { c as Client, C as ClientId, a as ClientInfo, b as Converter, E as Extension, e as Target, T as TargetId, d as TargetInfo, f as addTarget, h as addTargetClient, g as isClient, i as isTarget, t as targets } from '../index-
|
|
1
|
+
export { c as Client, C as ClientId, a as ClientInfo, b as Converter, E as Extension, e as Target, T as TargetId, d as TargetInfo, f as addTarget, h as addTargetClient, g as isClient, i as isTarget, t as targets } from '../index-ae5e535e.js';
|
|
2
2
|
import '../helpers/code-builder.mjs';
|
|
3
3
|
import 'type-fest';
|
|
4
4
|
import 'har-format';
|
package/dist/targets/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { c as Client, C as ClientId, a as ClientInfo, b as Converter, E as Extension, e as Target, T as TargetId, d as TargetInfo, f as addTarget, h as addTargetClient, g as isClient, i as isTarget, t as targets } from '../index-
|
|
1
|
+
export { c as Client, C as ClientId, a as ClientInfo, b as Converter, E as Extension, e as Target, T as TargetId, d as TargetInfo, f as addTarget, h as addTargetClient, g as isClient, i as isTarget, t as targets } from '../index-c415b193.js';
|
|
2
2
|
import '../helpers/code-builder.js';
|
|
3
3
|
import 'type-fest';
|
|
4
4
|
import 'har-format';
|