@ripwords/myinvois-client 0.0.7 → 0.0.9
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/bun.lock +110 -27
- package/dist/index.cjs +42 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2334 -481
- package/dist/index.js +42 -20
- package/package.json +19 -17
- package/rolldown.config.ts +5 -1
- package/src/api/platform/taxpayerLogin.ts +28 -0
- package/src/types/index.d.ts +12 -0
- package/src/types/unit/1X.d.ts +16 -0
- package/src/types/unit/2X.d.ts +62 -0
- package/src/types/unit/3X.d.ts +17 -0
- package/src/types/unit/4X.d.ts +44 -0
- package/src/types/unit/5X.d.ts +26 -0
- package/src/types/unit/6X.d.ts +12 -0
- package/src/types/unit/7X.d.ts +12 -0
- package/src/types/unit/8X.d.ts +15 -0
- package/src/types/unit/9X.d.ts +11 -0
- package/src/types/unit/AX.d.ts +202 -0
- package/src/types/unit/BX.d.ts +212 -0
- package/src/types/unit/CX.d.ts +238 -0
- package/src/types/unit/DX.d.ts +212 -0
- package/src/types/unit/EX.d.ts +196 -0
- package/src/types/unit/FX.d.ts +236 -0
- package/src/types/unit/GX.d.ts +254 -0
- package/src/types/unit/HX.d.ts +234 -0
- package/src/types/unit/IX.d.ts +28 -0
- package/src/types/unit/JX.d.ts +190 -0
- package/src/types/unit/KX.d.ts +284 -0
- package/src/types/unit/LX.d.ts +228 -0
- package/src/types/unit/MX.d.ts +288 -0
- package/src/types/unit/NX.d.ts +226 -0
- package/src/types/unit/OX.d.ts +34 -0
- package/src/types/unit/PX.d.ts +224 -0
- package/src/types/unit/QX.d.ts +94 -0
- package/src/types/unit/RX.d.ts +28 -0
- package/src/types/unit/SX.d.ts +56 -0
- package/src/types/unit/TX.d.ts +44 -0
- package/src/types/unit/UX.d.ts +14 -0
- package/src/types/unit/VX.d.ts +13 -0
- package/src/types/unit/WX.d.ts +34 -0
- package/src/types/unit/XX.d.ts +825 -0
- package/src/types/unit/YX.d.ts +17 -0
- package/src/types/unit/ZX.d.ts +19 -0
- package/src/types/unit-types.d.ts +71 -575
- package/src/utils/MyInvoisClient.ts +13 -35
- package/src/utils/getBaseUrl.ts +5 -0
- package/test/{MyInvoiClientRealData.test.ts → MyInvoiClientWithRealData.test.ts} +13 -1
- package/test/MyInvoisClient.test.ts +4 -7
- package/dist/cjs/index.cjs +0 -75
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/multipart-parser-Bu3ikqFQ.cjs +0 -182
- package/dist/cjs/multipart-parser-Bu3ikqFQ.cjs.map +0 -1
- package/dist/cjs/node-qs2pnN6F.cjs +0 -4124
- package/dist/cjs/node-qs2pnN6F.cjs.map +0 -1
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
expires_in: number
|
|
4
|
-
}
|
|
1
|
+
import { getBaseUrl } from './getBaseUrl'
|
|
2
|
+
import { taxpayerLogin } from '../api/platform/taxpayerLogin'
|
|
5
3
|
|
|
6
4
|
export class MyInvoisClient {
|
|
7
5
|
private readonly baseUrl: string
|
|
@@ -19,40 +17,20 @@ export class MyInvoisClient {
|
|
|
19
17
|
) {
|
|
20
18
|
this.clientId = clientId
|
|
21
19
|
this.clientSecret = clientSecret
|
|
20
|
+
this.baseUrl = getBaseUrl(environment)
|
|
22
21
|
this.debug = debug
|
|
23
|
-
if (environment === 'sandbox') {
|
|
24
|
-
this.baseUrl = 'https://preprod-api.myinvois.hasil.gov.my'
|
|
25
|
-
} else {
|
|
26
|
-
this.baseUrl = 'https://api.myinvois.hasil.gov.my'
|
|
27
|
-
}
|
|
28
22
|
}
|
|
29
23
|
|
|
30
24
|
private async refreshToken() {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
body: new URLSearchParams({
|
|
38
|
-
grant_type: 'client_credentials',
|
|
39
|
-
client_id: this.clientId,
|
|
40
|
-
client_secret: this.clientSecret,
|
|
41
|
-
scope: 'InvoicingAPI',
|
|
42
|
-
}),
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
const tokenResponse: TokenResponse = await response.json()
|
|
25
|
+
const tokenResponse = await taxpayerLogin({
|
|
26
|
+
clientId: this.clientId,
|
|
27
|
+
clientSecret: this.clientSecret,
|
|
28
|
+
baseUrl: this.baseUrl,
|
|
29
|
+
debug: this.debug,
|
|
30
|
+
})
|
|
46
31
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
Date.now() + tokenResponse.expires_in * 1000,
|
|
50
|
-
)
|
|
51
|
-
} catch (error) {
|
|
52
|
-
if (this.debug) {
|
|
53
|
-
console.error(error)
|
|
54
|
-
}
|
|
55
|
-
}
|
|
32
|
+
this.token = tokenResponse.token
|
|
33
|
+
this.tokenExpiration = tokenResponse.tokenExpiration
|
|
56
34
|
}
|
|
57
35
|
|
|
58
36
|
private async getToken() {
|
|
@@ -80,9 +58,9 @@ export class MyInvoisClient {
|
|
|
80
58
|
*
|
|
81
59
|
* @param tin
|
|
82
60
|
* @param nric
|
|
83
|
-
* @returns
|
|
61
|
+
* @returns true if the TIN is valid, false otherwise
|
|
84
62
|
*/
|
|
85
|
-
async verifyTin(tin: string, nric: string) {
|
|
63
|
+
async verifyTin(tin: string, nric: string): Promise<boolean> {
|
|
86
64
|
try {
|
|
87
65
|
const response = await this.fetch(
|
|
88
66
|
`/api/v1.0/taxpayer/validate/${tin}?idType=NRIC&idValue=${nric}`,
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
2
|
import { MyInvoisClient } from '../src/utils/MyInvoisClient'
|
|
3
3
|
|
|
4
|
-
describe('
|
|
4
|
+
describe('MyInvoisClientWithRealData', () => {
|
|
5
5
|
it('should verify TIN with real data', async () => {
|
|
6
|
+
// Skip the test if the environment variables are not set
|
|
7
|
+
if (
|
|
8
|
+
!process.env.CLIENT_ID ||
|
|
9
|
+
!process.env.CLIENT_SECRET ||
|
|
10
|
+
!process.env.TIN_VALUE ||
|
|
11
|
+
!process.env.NRIC_VALUE
|
|
12
|
+
) {
|
|
13
|
+
expect
|
|
14
|
+
.soft(false, 'Skipping test: Missing required environment variables')
|
|
15
|
+
.toBe(true)
|
|
16
|
+
return
|
|
17
|
+
}
|
|
6
18
|
const client = new MyInvoisClient(
|
|
7
19
|
process.env.CLIENT_ID!,
|
|
8
20
|
process.env.CLIENT_SECRET!,
|
|
@@ -122,12 +122,12 @@ describe('MyInvoisClient', () => {
|
|
|
122
122
|
} as Response)
|
|
123
123
|
|
|
124
124
|
// First call to get token
|
|
125
|
-
await client.verifyTin(
|
|
125
|
+
await client.verifyTin('123', '456')
|
|
126
126
|
|
|
127
|
-
vi.
|
|
127
|
+
vi.setSystemTime(new Date(Date.now() + 1000))
|
|
128
128
|
|
|
129
129
|
// Second call should reuse token
|
|
130
|
-
await client.verifyTin(
|
|
130
|
+
await client.verifyTin('123', '456')
|
|
131
131
|
|
|
132
132
|
// Token endpoint should only be called once
|
|
133
133
|
expect(mockFetch).toHaveBeenCalledWith(
|
|
@@ -182,10 +182,7 @@ describe('MyInvoisClient', () => {
|
|
|
182
182
|
} as Response)
|
|
183
183
|
.mockRejectedValueOnce(new Error('Invalid TIN'))
|
|
184
184
|
|
|
185
|
-
const result = await client.verifyTin(
|
|
186
|
-
process.env.TIN_VALUE!,
|
|
187
|
-
process.env.NRIC_VALUE!,
|
|
188
|
-
)
|
|
185
|
+
const result = await client.verifyTin('123', '456')
|
|
189
186
|
|
|
190
187
|
expect(result).toBe(false)
|
|
191
188
|
})
|
package/dist/cjs/index.cjs
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/MyInvoisClient.ts
|
|
4
|
-
var MyInvoisClient = class {
|
|
5
|
-
baseUrl;
|
|
6
|
-
clientId;
|
|
7
|
-
clientSecret;
|
|
8
|
-
debug;
|
|
9
|
-
token = "";
|
|
10
|
-
tokenExpiration;
|
|
11
|
-
constructor(clientId, clientSecret, environment, debug = false) {
|
|
12
|
-
this.clientId = clientId;
|
|
13
|
-
this.clientSecret = clientSecret;
|
|
14
|
-
this.debug = debug;
|
|
15
|
-
if (environment === "sandbox") this.baseUrl = "https://preprod-api.myinvois.hasil.gov.my";
|
|
16
|
-
else this.baseUrl = "https://api.myinvois.hasil.gov.my";
|
|
17
|
-
}
|
|
18
|
-
async refreshToken() {
|
|
19
|
-
try {
|
|
20
|
-
const response = await fetch(`${this.baseUrl}/connect/token`, {
|
|
21
|
-
method: "POST",
|
|
22
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
23
|
-
body: new URLSearchParams({
|
|
24
|
-
grant_type: "client_credentials",
|
|
25
|
-
client_id: this.clientId,
|
|
26
|
-
client_secret: this.clientSecret,
|
|
27
|
-
scope: "InvoicingAPI"
|
|
28
|
-
})
|
|
29
|
-
});
|
|
30
|
-
const tokenResponse = await response.json();
|
|
31
|
-
this.token = tokenResponse.access_token;
|
|
32
|
-
this.tokenExpiration = new Date(Date.now() + tokenResponse.expires_in * 1e3);
|
|
33
|
-
} catch (error) {
|
|
34
|
-
if (this.debug) console.error(error);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async getToken() {
|
|
38
|
-
if (!this.tokenExpiration || this.tokenExpiration < new Date()) {
|
|
39
|
-
if (this.debug) console.log("Refreshing token");
|
|
40
|
-
await this.refreshToken();
|
|
41
|
-
}
|
|
42
|
-
return this.token;
|
|
43
|
-
}
|
|
44
|
-
async fetch(path, options = {}) {
|
|
45
|
-
const token = await this.getToken();
|
|
46
|
-
return fetch(`${this.baseUrl}${path}`, {
|
|
47
|
-
...options,
|
|
48
|
-
headers: {
|
|
49
|
-
...options.headers,
|
|
50
|
-
Authorization: `Bearer ${token}`
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Validates a TIN against a NRIC
|
|
56
|
-
*
|
|
57
|
-
* @param tin
|
|
58
|
-
* @param nric
|
|
59
|
-
* @returns
|
|
60
|
-
*/
|
|
61
|
-
async verifyTin(tin, nric) {
|
|
62
|
-
try {
|
|
63
|
-
const response = await this.fetch(`/api/v1.0/taxpayer/validate/${tin}?idType=NRIC&idValue=${nric}`, { method: "GET" });
|
|
64
|
-
if (response.status === 200) return true;
|
|
65
|
-
return false;
|
|
66
|
-
} catch (error) {
|
|
67
|
-
if (this.debug) console.error(error);
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
//#endregion
|
|
74
|
-
exports.MyInvoisClient = MyInvoisClient
|
|
75
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["clientId: string","clientSecret: string","environment: 'sandbox' | 'production'","debug: boolean","tokenResponse: TokenResponse","path: string","options: Parameters<typeof fetch>[1]","tin: string","nric: string"],"sources":["../../src/utils/MyInvoisClient.ts"],"sourcesContent":["interface TokenResponse {\n access_token: string\n expires_in: number\n}\n\nexport class MyInvoisClient {\n private readonly baseUrl: string\n private readonly clientId: string\n private readonly clientSecret: string\n private readonly debug: boolean\n private token = ''\n private tokenExpiration: Date | undefined\n\n constructor(\n clientId: string,\n clientSecret: string,\n environment: 'sandbox' | 'production',\n debug: boolean = false,\n ) {\n this.clientId = clientId\n this.clientSecret = clientSecret\n this.debug = debug\n if (environment === 'sandbox') {\n this.baseUrl = 'https://preprod-api.myinvois.hasil.gov.my'\n } else {\n this.baseUrl = 'https://api.myinvois.hasil.gov.my'\n }\n }\n\n private async refreshToken() {\n try {\n const response = await fetch(`${this.baseUrl}/connect/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this.clientId,\n client_secret: this.clientSecret,\n scope: 'InvoicingAPI',\n }),\n })\n\n const tokenResponse: TokenResponse = await response.json()\n\n this.token = tokenResponse.access_token\n this.tokenExpiration = new Date(\n Date.now() + tokenResponse.expires_in * 1000,\n )\n } catch (error) {\n if (this.debug) {\n console.error(error)\n }\n }\n }\n\n private async getToken() {\n if (!this.tokenExpiration || this.tokenExpiration < new Date()) {\n if (this.debug) {\n console.log('Refreshing token')\n }\n await this.refreshToken()\n }\n\n return this.token\n }\n\n private async fetch(path: string, options: Parameters<typeof fetch>[1] = {}) {\n const token = await this.getToken()\n\n return fetch(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...options.headers, Authorization: `Bearer ${token}` },\n })\n }\n\n /**\n * Validates a TIN against a NRIC\n *\n * @param tin\n * @param nric\n * @returns\n */\n async verifyTin(tin: string, nric: string) {\n try {\n const response = await this.fetch(\n `/api/v1.0/taxpayer/validate/${tin}?idType=NRIC&idValue=${nric}`,\n {\n method: 'GET',\n },\n )\n\n if (response.status === 200) {\n return true\n }\n\n return false\n } catch (error) {\n if (this.debug) {\n console.error(error)\n }\n return false\n }\n }\n}\n"],"mappings":";;;IAKa,iBAAN,MAAqB;CAC1B,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAQ,QAAQ;CAChB,AAAQ;CAER,YACEA,UACAC,cACAC,aACAC,QAAiB,OACjB;AACA,OAAK,WAAW;AAChB,OAAK,eAAe;AACpB,OAAK,QAAQ;AACb,MAAI,gBAAgB,UAClB,MAAK,UAAU;MAEf,MAAK,UAAU;CAElB;CAED,MAAc,eAAe;AAC3B,MAAI;GACF,MAAM,WAAW,MAAM,OAAO,EAAE,KAAK,QAAQ,iBAAiB;IAC5D,QAAQ;IACR,SAAS,EACP,gBAAgB,oCACjB;IACD,MAAM,IAAI,gBAAgB;KACxB,YAAY;KACZ,WAAW,KAAK;KAChB,eAAe,KAAK;KACpB,OAAO;IACR;GACF,EAAC;GAEF,MAAMC,gBAA+B,MAAM,SAAS,MAAM;AAE1D,QAAK,QAAQ,cAAc;AAC3B,QAAK,kBAAkB,IAAI,KACzB,KAAK,KAAK,GAAG,cAAc,aAAa;EAE3C,SAAQ,OAAO;AACd,OAAI,KAAK,MACP,SAAQ,MAAM,MAAM;EAEvB;CACF;CAED,MAAc,WAAW;AACvB,OAAK,KAAK,mBAAmB,KAAK,kBAAkB,IAAI,QAAQ;AAC9D,OAAI,KAAK,MACP,SAAQ,IAAI,mBAAmB;AAEjC,SAAM,KAAK,cAAc;EAC1B;AAED,SAAO,KAAK;CACb;CAED,MAAc,MAAMC,MAAcC,UAAuC,CAAE,GAAE;EAC3E,MAAM,QAAQ,MAAM,KAAK,UAAU;AAEnC,SAAO,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,GAAG;GACrC,GAAG;GACH,SAAS;IAAE,GAAG,QAAQ;IAAS,gBAAgB,SAAS,MAAM;GAAG;EAClE,EAAC;CACH;;;;;;;;CASD,MAAM,UAAUC,KAAaC,MAAc;AACzC,MAAI;GACF,MAAM,WAAW,MAAM,KAAK,OACzB,8BAA8B,IAAI,uBAAuB,KAAK,GAC/D,EACE,QAAQ,MACT,EACF;AAED,OAAI,SAAS,WAAW,IACtB,QAAO;AAGT,UAAO;EACR,SAAQ,OAAO;AACd,OAAI,KAAK,MACP,SAAQ,MAAM,MAAM;AAEtB,UAAO;EACR;CACF;AACF"}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
const require_node = require('./node-qs2pnN6F.cjs');
|
|
3
|
-
const node_http = require_node.__toESM(require("node:http"));
|
|
4
|
-
const node_https = require_node.__toESM(require("node:https"));
|
|
5
|
-
const node_zlib = require_node.__toESM(require("node:zlib"));
|
|
6
|
-
const node_stream = require_node.__toESM(require("node:stream"));
|
|
7
|
-
const node_buffer = require_node.__toESM(require("node:buffer"));
|
|
8
|
-
const node_util = require_node.__toESM(require("node:util"));
|
|
9
|
-
const node_url = require_node.__toESM(require("node:url"));
|
|
10
|
-
const node_net = require_node.__toESM(require("node:net"));
|
|
11
|
-
const node_fs = require_node.__toESM(require("node:fs"));
|
|
12
|
-
const node_path = require_node.__toESM(require("node:path"));
|
|
13
|
-
|
|
14
|
-
//#region node_modules/node-fetch-native/dist/chunks/multipart-parser.mjs
|
|
15
|
-
var U = Object.defineProperty;
|
|
16
|
-
var E = (_, o) => U(_, "name", {
|
|
17
|
-
value: o,
|
|
18
|
-
configurable: !0
|
|
19
|
-
});
|
|
20
|
-
let D = 0;
|
|
21
|
-
const t = {
|
|
22
|
-
START_BOUNDARY: D++,
|
|
23
|
-
HEADER_FIELD_START: D++,
|
|
24
|
-
HEADER_FIELD: D++,
|
|
25
|
-
HEADER_VALUE_START: D++,
|
|
26
|
-
HEADER_VALUE: D++,
|
|
27
|
-
HEADER_VALUE_ALMOST_DONE: D++,
|
|
28
|
-
HEADERS_ALMOST_DONE: D++,
|
|
29
|
-
PART_DATA_START: D++,
|
|
30
|
-
PART_DATA: D++,
|
|
31
|
-
END: D++
|
|
32
|
-
};
|
|
33
|
-
let F = 1;
|
|
34
|
-
const u = {
|
|
35
|
-
PART_BOUNDARY: F,
|
|
36
|
-
LAST_BOUNDARY: F *= 2
|
|
37
|
-
}, g = 10, N = 13, V = 32, S = 45, Y = 58, x = 97, C = 122, I = E((_) => _ | 32, "lower"), p = E(() => {}, "noop");
|
|
38
|
-
var M = class {
|
|
39
|
-
static {
|
|
40
|
-
E(this, "MultipartParser");
|
|
41
|
-
}
|
|
42
|
-
constructor(o) {
|
|
43
|
-
this.index = 0, this.flags = 0, this.onHeaderEnd = p, this.onHeaderField = p, this.onHeadersEnd = p, this.onHeaderValue = p, this.onPartBegin = p, this.onPartData = p, this.onPartEnd = p, this.boundaryChars = {}, o = `\r
|
|
44
|
-
--` + o;
|
|
45
|
-
const n = new Uint8Array(o.length);
|
|
46
|
-
for (let r = 0; r < o.length; r++) n[r] = o.charCodeAt(r), this.boundaryChars[n[r]] = !0;
|
|
47
|
-
this.boundary = n, this.lookbehind = new Uint8Array(this.boundary.length + 8), this.state = t.START_BOUNDARY;
|
|
48
|
-
}
|
|
49
|
-
write(o) {
|
|
50
|
-
let n = 0;
|
|
51
|
-
const r = o.length;
|
|
52
|
-
let d = this.index, { lookbehind: l, boundary: c, boundaryChars: m, index: e, state: i, flags: A } = this;
|
|
53
|
-
const H = this.boundary.length, O = H - 1, y = o.length;
|
|
54
|
-
let a, L;
|
|
55
|
-
const f = E((h) => {
|
|
56
|
-
this[h + "Mark"] = n;
|
|
57
|
-
}, "mark"), s = E((h) => {
|
|
58
|
-
delete this[h + "Mark"];
|
|
59
|
-
}, "clear"), T = E((h, P, R, k) => {
|
|
60
|
-
(P === void 0 || P !== R) && this[h](k && k.subarray(P, R));
|
|
61
|
-
}, "callback"), b = E((h, P) => {
|
|
62
|
-
const R = h + "Mark";
|
|
63
|
-
R in this && (P ? (T(h, this[R], n, o), delete this[R]) : (T(h, this[R], o.length, o), this[R] = 0));
|
|
64
|
-
}, "dataCallback");
|
|
65
|
-
for (n = 0; n < r; n++) switch (a = o[n], i) {
|
|
66
|
-
case t.START_BOUNDARY:
|
|
67
|
-
if (e === c.length - 2) {
|
|
68
|
-
if (a === S) A |= u.LAST_BOUNDARY;
|
|
69
|
-
else if (a !== N) return;
|
|
70
|
-
e++;
|
|
71
|
-
break;
|
|
72
|
-
} else if (e - 1 === c.length - 2) {
|
|
73
|
-
if (A & u.LAST_BOUNDARY && a === S) i = t.END, A = 0;
|
|
74
|
-
else if (!(A & u.LAST_BOUNDARY) && a === g) e = 0, T("onPartBegin"), i = t.HEADER_FIELD_START;
|
|
75
|
-
else return;
|
|
76
|
-
break;
|
|
77
|
-
}
|
|
78
|
-
a !== c[e + 2] && (e = -2), a === c[e + 2] && e++;
|
|
79
|
-
break;
|
|
80
|
-
case t.HEADER_FIELD_START: i = t.HEADER_FIELD, f("onHeaderField"), e = 0;
|
|
81
|
-
case t.HEADER_FIELD:
|
|
82
|
-
if (a === N) {
|
|
83
|
-
s("onHeaderField"), i = t.HEADERS_ALMOST_DONE;
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
if (e++, a === S) break;
|
|
87
|
-
if (a === Y) {
|
|
88
|
-
if (e === 1) return;
|
|
89
|
-
b("onHeaderField", !0), i = t.HEADER_VALUE_START;
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
if (L = I(a), L < x || L > C) return;
|
|
93
|
-
break;
|
|
94
|
-
case t.HEADER_VALUE_START:
|
|
95
|
-
if (a === V) break;
|
|
96
|
-
f("onHeaderValue"), i = t.HEADER_VALUE;
|
|
97
|
-
case t.HEADER_VALUE:
|
|
98
|
-
a === N && (b("onHeaderValue", !0), T("onHeaderEnd"), i = t.HEADER_VALUE_ALMOST_DONE);
|
|
99
|
-
break;
|
|
100
|
-
case t.HEADER_VALUE_ALMOST_DONE:
|
|
101
|
-
if (a !== g) return;
|
|
102
|
-
i = t.HEADER_FIELD_START;
|
|
103
|
-
break;
|
|
104
|
-
case t.HEADERS_ALMOST_DONE:
|
|
105
|
-
if (a !== g) return;
|
|
106
|
-
T("onHeadersEnd"), i = t.PART_DATA_START;
|
|
107
|
-
break;
|
|
108
|
-
case t.PART_DATA_START: i = t.PART_DATA, f("onPartData");
|
|
109
|
-
case t.PART_DATA:
|
|
110
|
-
if (d = e, e === 0) {
|
|
111
|
-
for (n += O; n < y && !(o[n] in m);) n += H;
|
|
112
|
-
n -= O, a = o[n];
|
|
113
|
-
}
|
|
114
|
-
if (e < c.length) c[e] === a ? (e === 0 && b("onPartData", !0), e++) : e = 0;
|
|
115
|
-
else if (e === c.length) e++, a === N ? A |= u.PART_BOUNDARY : a === S ? A |= u.LAST_BOUNDARY : e = 0;
|
|
116
|
-
else if (e - 1 === c.length) if (A & u.PART_BOUNDARY) {
|
|
117
|
-
if (e = 0, a === g) {
|
|
118
|
-
A &= ~u.PART_BOUNDARY, T("onPartEnd"), T("onPartBegin"), i = t.HEADER_FIELD_START;
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
} else A & u.LAST_BOUNDARY && a === S ? (T("onPartEnd"), i = t.END, A = 0) : e = 0;
|
|
122
|
-
if (e > 0) l[e - 1] = a;
|
|
123
|
-
else if (d > 0) {
|
|
124
|
-
const h = new Uint8Array(l.buffer, l.byteOffset, l.byteLength);
|
|
125
|
-
T("onPartData", 0, d, h), d = 0, f("onPartData"), n--;
|
|
126
|
-
}
|
|
127
|
-
break;
|
|
128
|
-
case t.END: break;
|
|
129
|
-
default: throw new Error(`Unexpected state entered: ${i}`);
|
|
130
|
-
}
|
|
131
|
-
b("onHeaderField"), b("onHeaderValue"), b("onPartData"), this.index = e, this.state = i, this.flags = A;
|
|
132
|
-
}
|
|
133
|
-
end() {
|
|
134
|
-
if (this.state === t.HEADER_FIELD_START && this.index === 0 || this.state === t.PART_DATA && this.index === this.boundary.length) this.onPartEnd();
|
|
135
|
-
else if (this.state !== t.END) throw new Error("MultipartParser.end(): stream ended unexpectedly");
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
function $(_) {
|
|
139
|
-
const o = _.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);
|
|
140
|
-
if (!o) return;
|
|
141
|
-
const n = o[2] || o[3] || "";
|
|
142
|
-
let r = n.slice(n.lastIndexOf("\\") + 1);
|
|
143
|
-
return r = r.replace(/%22/g, "\""), r = r.replace(/&#(\d{4});/g, (d, l) => String.fromCharCode(l)), r;
|
|
144
|
-
}
|
|
145
|
-
E($, "_fileName");
|
|
146
|
-
async function v(_, o) {
|
|
147
|
-
if (!/multipart/i.test(o)) throw new TypeError("Failed to fetch");
|
|
148
|
-
const n = o.match(/boundary=(?:"([^"]+)"|([^;]+))/i);
|
|
149
|
-
if (!n) throw new TypeError("no or bad content-type header, no multipart boundary");
|
|
150
|
-
const r = new M(n[1] || n[2]);
|
|
151
|
-
let d, l, c, m, e, i;
|
|
152
|
-
const A = [], H = new require_node.Zt(), O = E((s) => {
|
|
153
|
-
c += f.decode(s, { stream: !0 });
|
|
154
|
-
}, "onPartData"), y = E((s) => {
|
|
155
|
-
A.push(s);
|
|
156
|
-
}, "appendToFile"), a = E(() => {
|
|
157
|
-
const s = new require_node.Yr(A, i, { type: e });
|
|
158
|
-
H.append(m, s);
|
|
159
|
-
}, "appendFileToFormData"), L = E(() => {
|
|
160
|
-
H.append(m, c);
|
|
161
|
-
}, "appendEntryToFormData"), f = new TextDecoder("utf-8");
|
|
162
|
-
f.decode(), r.onPartBegin = function() {
|
|
163
|
-
r.onPartData = O, r.onPartEnd = L, d = "", l = "", c = "", m = "", e = "", i = null, A.length = 0;
|
|
164
|
-
}, r.onHeaderField = function(s) {
|
|
165
|
-
d += f.decode(s, { stream: !0 });
|
|
166
|
-
}, r.onHeaderValue = function(s) {
|
|
167
|
-
l += f.decode(s, { stream: !0 });
|
|
168
|
-
}, r.onHeaderEnd = function() {
|
|
169
|
-
if (l += f.decode(), d = d.toLowerCase(), d === "content-disposition") {
|
|
170
|
-
const s = l.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);
|
|
171
|
-
s && (m = s[2] || s[3] || ""), i = $(l), i && (r.onPartData = y, r.onPartEnd = a);
|
|
172
|
-
} else d === "content-type" && (e = l);
|
|
173
|
-
l = "", d = "";
|
|
174
|
-
};
|
|
175
|
-
for await (const s of _) r.write(s);
|
|
176
|
-
return r.end(), H;
|
|
177
|
-
}
|
|
178
|
-
E(v, "toFormData");
|
|
179
|
-
|
|
180
|
-
//#endregion
|
|
181
|
-
exports.toFormData = v
|
|
182
|
-
//# sourceMappingURL=multipart-parser-Bu3ikqFQ.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multipart-parser-Bu3ikqFQ.cjs","names":["w","B"],"sources":["../../node_modules/node-fetch-native/dist/chunks/multipart-parser.mjs"],"sourcesContent":["var U=Object.defineProperty;var E=(_,o)=>U(_,\"name\",{value:o,configurable:!0});import\"node:fs\";import\"node:path\";import{FormData as w,File as B}from\"../node.mjs\";import\"node:http\";import\"node:https\";import\"node:zlib\";import\"node:stream\";import\"node:buffer\";import\"node:util\";import\"../shared/node-fetch-native.DfbY2q-x.mjs\";import\"node:url\";import\"node:net\";let D=0;const t={START_BOUNDARY:D++,HEADER_FIELD_START:D++,HEADER_FIELD:D++,HEADER_VALUE_START:D++,HEADER_VALUE:D++,HEADER_VALUE_ALMOST_DONE:D++,HEADERS_ALMOST_DONE:D++,PART_DATA_START:D++,PART_DATA:D++,END:D++};let F=1;const u={PART_BOUNDARY:F,LAST_BOUNDARY:F*=2},g=10,N=13,V=32,S=45,Y=58,x=97,C=122,I=E(_=>_|32,\"lower\"),p=E(()=>{},\"noop\");class M{static{E(this,\"MultipartParser\")}constructor(o){this.index=0,this.flags=0,this.onHeaderEnd=p,this.onHeaderField=p,this.onHeadersEnd=p,this.onHeaderValue=p,this.onPartBegin=p,this.onPartData=p,this.onPartEnd=p,this.boundaryChars={},o=`\\r\n--`+o;const n=new Uint8Array(o.length);for(let r=0;r<o.length;r++)n[r]=o.charCodeAt(r),this.boundaryChars[n[r]]=!0;this.boundary=n,this.lookbehind=new Uint8Array(this.boundary.length+8),this.state=t.START_BOUNDARY}write(o){let n=0;const r=o.length;let d=this.index,{lookbehind:l,boundary:c,boundaryChars:m,index:e,state:i,flags:A}=this;const H=this.boundary.length,O=H-1,y=o.length;let a,L;const f=E(h=>{this[h+\"Mark\"]=n},\"mark\"),s=E(h=>{delete this[h+\"Mark\"]},\"clear\"),T=E((h,P,R,k)=>{(P===void 0||P!==R)&&this[h](k&&k.subarray(P,R))},\"callback\"),b=E((h,P)=>{const R=h+\"Mark\";R in this&&(P?(T(h,this[R],n,o),delete this[R]):(T(h,this[R],o.length,o),this[R]=0))},\"dataCallback\");for(n=0;n<r;n++)switch(a=o[n],i){case t.START_BOUNDARY:if(e===c.length-2){if(a===S)A|=u.LAST_BOUNDARY;else if(a!==N)return;e++;break}else if(e-1===c.length-2){if(A&u.LAST_BOUNDARY&&a===S)i=t.END,A=0;else if(!(A&u.LAST_BOUNDARY)&&a===g)e=0,T(\"onPartBegin\"),i=t.HEADER_FIELD_START;else return;break}a!==c[e+2]&&(e=-2),a===c[e+2]&&e++;break;case t.HEADER_FIELD_START:i=t.HEADER_FIELD,f(\"onHeaderField\"),e=0;case t.HEADER_FIELD:if(a===N){s(\"onHeaderField\"),i=t.HEADERS_ALMOST_DONE;break}if(e++,a===S)break;if(a===Y){if(e===1)return;b(\"onHeaderField\",!0),i=t.HEADER_VALUE_START;break}if(L=I(a),L<x||L>C)return;break;case t.HEADER_VALUE_START:if(a===V)break;f(\"onHeaderValue\"),i=t.HEADER_VALUE;case t.HEADER_VALUE:a===N&&(b(\"onHeaderValue\",!0),T(\"onHeaderEnd\"),i=t.HEADER_VALUE_ALMOST_DONE);break;case t.HEADER_VALUE_ALMOST_DONE:if(a!==g)return;i=t.HEADER_FIELD_START;break;case t.HEADERS_ALMOST_DONE:if(a!==g)return;T(\"onHeadersEnd\"),i=t.PART_DATA_START;break;case t.PART_DATA_START:i=t.PART_DATA,f(\"onPartData\");case t.PART_DATA:if(d=e,e===0){for(n+=O;n<y&&!(o[n]in m);)n+=H;n-=O,a=o[n]}if(e<c.length)c[e]===a?(e===0&&b(\"onPartData\",!0),e++):e=0;else if(e===c.length)e++,a===N?A|=u.PART_BOUNDARY:a===S?A|=u.LAST_BOUNDARY:e=0;else if(e-1===c.length)if(A&u.PART_BOUNDARY){if(e=0,a===g){A&=~u.PART_BOUNDARY,T(\"onPartEnd\"),T(\"onPartBegin\"),i=t.HEADER_FIELD_START;break}}else A&u.LAST_BOUNDARY&&a===S?(T(\"onPartEnd\"),i=t.END,A=0):e=0;if(e>0)l[e-1]=a;else if(d>0){const h=new Uint8Array(l.buffer,l.byteOffset,l.byteLength);T(\"onPartData\",0,d,h),d=0,f(\"onPartData\"),n--}break;case t.END:break;default:throw new Error(`Unexpected state entered: ${i}`)}b(\"onHeaderField\"),b(\"onHeaderValue\"),b(\"onPartData\"),this.index=e,this.state=i,this.flags=A}end(){if(this.state===t.HEADER_FIELD_START&&this.index===0||this.state===t.PART_DATA&&this.index===this.boundary.length)this.onPartEnd();else if(this.state!==t.END)throw new Error(\"MultipartParser.end(): stream ended unexpectedly\")}}function $(_){const o=_.match(/\\bfilename=(\"(.*?)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))($|;\\s)/i);if(!o)return;const n=o[2]||o[3]||\"\";let r=n.slice(n.lastIndexOf(\"\\\\\")+1);return r=r.replace(/%22/g,'\"'),r=r.replace(/&#(\\d{4});/g,(d,l)=>String.fromCharCode(l)),r}E($,\"_fileName\");async function v(_,o){if(!/multipart/i.test(o))throw new TypeError(\"Failed to fetch\");const n=o.match(/boundary=(?:\"([^\"]+)\"|([^;]+))/i);if(!n)throw new TypeError(\"no or bad content-type header, no multipart boundary\");const r=new M(n[1]||n[2]);let d,l,c,m,e,i;const A=[],H=new w,O=E(s=>{c+=f.decode(s,{stream:!0})},\"onPartData\"),y=E(s=>{A.push(s)},\"appendToFile\"),a=E(()=>{const s=new B(A,i,{type:e});H.append(m,s)},\"appendFileToFormData\"),L=E(()=>{H.append(m,c)},\"appendEntryToFormData\"),f=new TextDecoder(\"utf-8\");f.decode(),r.onPartBegin=function(){r.onPartData=O,r.onPartEnd=L,d=\"\",l=\"\",c=\"\",m=\"\",e=\"\",i=null,A.length=0},r.onHeaderField=function(s){d+=f.decode(s,{stream:!0})},r.onHeaderValue=function(s){l+=f.decode(s,{stream:!0})},r.onHeaderEnd=function(){if(l+=f.decode(),d=d.toLowerCase(),d===\"content-disposition\"){const s=l.match(/\\bname=(\"([^\"]*)\"|([^()<>@,;:\\\\\"/[\\]?={}\\s\\t]+))/i);s&&(m=s[2]||s[3]||\"\"),i=$(l),i&&(r.onPartData=y,r.onPartEnd=a)}else d===\"content-type\"&&(e=l);l=\"\",d=\"\"};for await(const s of _)r.write(s);return r.end(),H}E(v,\"toFormData\");export{v as toFormData};\n"],"x_google_ignoreList":[0],"mappings":"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"}
|