@ripwords/myinvois-client 0.0.6 → 0.0.8
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 +25 -25
- package/dist/index.cjs +95 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2318 -464
- package/dist/index.js +24 -22
- package/package.json +17 -13
- package/rolldown.config.ts +1 -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 +20 -33
- package/src/utils/getBaseUrl.ts +5 -0
- package/test/{MyInvoiClientRealData.test.ts → MyInvoiClientWithRealData.test.ts} +13 -1
- package/test/MyInvoisClient.test.ts +14 -13
- package/dist/cjs/index.cjs +0 -70
- 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,12 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
expires_in: number
|
|
4
|
-
}
|
|
1
|
+
import { getBaseUrl } from './getBaseUrl'
|
|
2
|
+
import { taxpayerLogin } from 'src/api/platform/taxpayerLogin'
|
|
5
3
|
|
|
6
4
|
export class MyInvoisClient {
|
|
7
5
|
private readonly baseUrl: string
|
|
8
6
|
private readonly clientId: string
|
|
9
7
|
private readonly clientSecret: string
|
|
8
|
+
private readonly debug: boolean
|
|
10
9
|
private token = ''
|
|
11
10
|
private tokenExpiration: Date | undefined
|
|
12
11
|
|
|
@@ -14,45 +13,31 @@ export class MyInvoisClient {
|
|
|
14
13
|
clientId: string,
|
|
15
14
|
clientSecret: string,
|
|
16
15
|
environment: 'sandbox' | 'production',
|
|
16
|
+
debug: boolean = false,
|
|
17
17
|
) {
|
|
18
18
|
this.clientId = clientId
|
|
19
19
|
this.clientSecret = clientSecret
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this.baseUrl = 'https://preprod-api.myinvois.hasil.gov.my'
|
|
23
|
-
} else {
|
|
24
|
-
this.baseUrl = 'https://api.myinvois.hasil.gov.my'
|
|
25
|
-
}
|
|
20
|
+
this.baseUrl = getBaseUrl(environment)
|
|
21
|
+
this.debug = debug
|
|
26
22
|
}
|
|
27
23
|
|
|
28
24
|
private async refreshToken() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
body: new URLSearchParams({
|
|
36
|
-
grant_type: 'client_credentials',
|
|
37
|
-
client_id: this.clientId,
|
|
38
|
-
client_secret: this.clientSecret,
|
|
39
|
-
scope: 'InvoicingAPI',
|
|
40
|
-
}),
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
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
|
+
})
|
|
44
31
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
Date.now() + tokenResponse.expires_in * 1000,
|
|
48
|
-
)
|
|
49
|
-
} catch (error) {
|
|
50
|
-
console.error(error)
|
|
51
|
-
}
|
|
32
|
+
this.token = tokenResponse.token
|
|
33
|
+
this.tokenExpiration = tokenResponse.tokenExpiration
|
|
52
34
|
}
|
|
53
35
|
|
|
54
36
|
private async getToken() {
|
|
55
37
|
if (!this.tokenExpiration || this.tokenExpiration < new Date()) {
|
|
38
|
+
if (this.debug) {
|
|
39
|
+
console.log('Refreshing token')
|
|
40
|
+
}
|
|
56
41
|
await this.refreshToken()
|
|
57
42
|
}
|
|
58
43
|
|
|
@@ -90,7 +75,9 @@ export class MyInvoisClient {
|
|
|
90
75
|
|
|
91
76
|
return false
|
|
92
77
|
} catch (error) {
|
|
93
|
-
|
|
78
|
+
if (this.debug) {
|
|
79
|
+
console.error(error)
|
|
80
|
+
}
|
|
94
81
|
return false
|
|
95
82
|
}
|
|
96
83
|
}
|
|
@@ -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!,
|
|
@@ -12,15 +12,16 @@ describe('MyInvoisClient', () => {
|
|
|
12
12
|
|
|
13
13
|
beforeEach(() => {
|
|
14
14
|
vi.clearAllMocks()
|
|
15
|
-
client = new MyInvoisClient('test-id', 'test-secret', 'sandbox')
|
|
15
|
+
client = new MyInvoisClient('test-id', 'test-secret', 'sandbox', false)
|
|
16
16
|
})
|
|
17
17
|
|
|
18
18
|
describe('constructor', () => {
|
|
19
19
|
it('should set sandbox URL when environment is sandbox', () => {
|
|
20
20
|
const sandboxClient = new MyInvoisClient(
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
'test-id',
|
|
22
|
+
'test-secret',
|
|
23
23
|
'sandbox',
|
|
24
|
+
true,
|
|
24
25
|
)
|
|
25
26
|
expect((sandboxClient as any).baseUrl).toBe(
|
|
26
27
|
'https://preprod-api.myinvois.hasil.gov.my',
|
|
@@ -29,9 +30,10 @@ describe('MyInvoisClient', () => {
|
|
|
29
30
|
|
|
30
31
|
it('should set production URL when environment is production', () => {
|
|
31
32
|
const prodClient = new MyInvoisClient(
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
'test-id',
|
|
34
|
+
'test-secret',
|
|
34
35
|
'production',
|
|
36
|
+
true,
|
|
35
37
|
)
|
|
36
38
|
expect((prodClient as any).baseUrl).toBe(
|
|
37
39
|
'https://api.myinvois.hasil.gov.my',
|
|
@@ -64,7 +66,7 @@ describe('MyInvoisClient', () => {
|
|
|
64
66
|
access_token: 'test-token',
|
|
65
67
|
expires_in: 3600,
|
|
66
68
|
}
|
|
67
|
-
|
|
69
|
+
|
|
68
70
|
mockFetch
|
|
69
71
|
.mockResolvedValueOnce({
|
|
70
72
|
ok: true,
|
|
@@ -120,12 +122,12 @@ describe('MyInvoisClient', () => {
|
|
|
120
122
|
} as Response)
|
|
121
123
|
|
|
122
124
|
// First call to get token
|
|
123
|
-
await client.verifyTin(
|
|
125
|
+
await client.verifyTin('123', '456')
|
|
124
126
|
|
|
125
|
-
vi.
|
|
127
|
+
vi.setSystemTime(new Date(Date.now() + 1000))
|
|
126
128
|
|
|
127
129
|
// Second call should reuse token
|
|
128
|
-
await client.verifyTin(
|
|
130
|
+
await client.verifyTin('123', '456')
|
|
129
131
|
|
|
130
132
|
// Token endpoint should only be called once
|
|
131
133
|
expect(mockFetch).toHaveBeenCalledWith(
|
|
@@ -153,6 +155,8 @@ describe('MyInvoisClient', () => {
|
|
|
153
155
|
} as Response)
|
|
154
156
|
|
|
155
157
|
await client.verifyTin('123', '456')
|
|
158
|
+
vi.setSystemTime(new Date(Date.now() + 1000 * 8000))
|
|
159
|
+
await client.verifyTin('123', '456')
|
|
156
160
|
|
|
157
161
|
expect(mockFetch).toHaveBeenCalledWith(
|
|
158
162
|
`https://preprod-api.myinvois.hasil.gov.my/api/v1.0/taxpayer/validate/123?idType=NRIC&idValue=456`,
|
|
@@ -178,10 +182,7 @@ describe('MyInvoisClient', () => {
|
|
|
178
182
|
} as Response)
|
|
179
183
|
.mockRejectedValueOnce(new Error('Invalid TIN'))
|
|
180
184
|
|
|
181
|
-
const result = await client.verifyTin(
|
|
182
|
-
process.env.TIN_VALUE!,
|
|
183
|
-
process.env.NRIC_VALUE!,
|
|
184
|
-
)
|
|
185
|
+
const result = await client.verifyTin('123', '456')
|
|
185
186
|
|
|
186
187
|
expect(result).toBe(false)
|
|
187
188
|
})
|
package/dist/cjs/index.cjs
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/MyInvoisClient.ts
|
|
4
|
-
var MyInvoisClient = class {
|
|
5
|
-
baseUrl;
|
|
6
|
-
clientId;
|
|
7
|
-
clientSecret;
|
|
8
|
-
token = "";
|
|
9
|
-
tokenExpiration;
|
|
10
|
-
constructor(clientId, clientSecret, environment) {
|
|
11
|
-
this.clientId = clientId;
|
|
12
|
-
this.clientSecret = clientSecret;
|
|
13
|
-
if (environment === "sandbox") this.baseUrl = "https://preprod-api.myinvois.hasil.gov.my";
|
|
14
|
-
else this.baseUrl = "https://api.myinvois.hasil.gov.my";
|
|
15
|
-
}
|
|
16
|
-
async refreshToken() {
|
|
17
|
-
try {
|
|
18
|
-
const response = await fetch(`${this.baseUrl}/connect/token`, {
|
|
19
|
-
method: "POST",
|
|
20
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
21
|
-
body: new URLSearchParams({
|
|
22
|
-
grant_type: "client_credentials",
|
|
23
|
-
client_id: this.clientId,
|
|
24
|
-
client_secret: this.clientSecret,
|
|
25
|
-
scope: "InvoicingAPI"
|
|
26
|
-
})
|
|
27
|
-
});
|
|
28
|
-
const tokenResponse = await response.json();
|
|
29
|
-
this.token = tokenResponse.access_token;
|
|
30
|
-
this.tokenExpiration = new Date(Date.now() + tokenResponse.expires_in * 1e3);
|
|
31
|
-
} catch (error) {
|
|
32
|
-
console.error(error);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async getToken() {
|
|
36
|
-
if (!this.tokenExpiration || this.tokenExpiration < new Date()) await this.refreshToken();
|
|
37
|
-
return this.token;
|
|
38
|
-
}
|
|
39
|
-
async fetch(path, options = {}) {
|
|
40
|
-
const token = await this.getToken();
|
|
41
|
-
return fetch(`${this.baseUrl}${path}`, {
|
|
42
|
-
...options,
|
|
43
|
-
headers: {
|
|
44
|
-
...options.headers,
|
|
45
|
-
Authorization: `Bearer ${token}`
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Validates a TIN against a NRIC
|
|
51
|
-
*
|
|
52
|
-
* @param tin
|
|
53
|
-
* @param nric
|
|
54
|
-
* @returns
|
|
55
|
-
*/
|
|
56
|
-
async verifyTin(tin, nric) {
|
|
57
|
-
try {
|
|
58
|
-
const response = await this.fetch(`/api/v1.0/taxpayer/validate/${tin}?idType=NRIC&idValue=${nric}`, { method: "GET" });
|
|
59
|
-
if (response.status === 200) return true;
|
|
60
|
-
return false;
|
|
61
|
-
} catch (error) {
|
|
62
|
-
console.error(error);
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
//#endregion
|
|
69
|
-
exports.MyInvoisClient = MyInvoisClient
|
|
70
|
-
//# 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'","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 token = ''\n private tokenExpiration: Date | undefined\n\n constructor(\n clientId: string,\n clientSecret: string,\n environment: 'sandbox' | 'production',\n ) {\n this.clientId = clientId\n this.clientSecret = clientSecret\n\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 console.error(error)\n }\n }\n\n private async getToken() {\n if (!this.tokenExpiration || this.tokenExpiration < new Date()) {\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 console.error(error)\n return false\n }\n }\n}\n"],"mappings":";;;IAKa,iBAAN,MAAqB;CAC1B,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAQ,QAAQ;CAChB,AAAQ;CAER,YACEA,UACAC,cACAC,aACA;AACA,OAAK,WAAW;AAChB,OAAK,eAAe;AAEpB,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,WAAQ,MAAM,MAAM;EACrB;CACF;CAED,MAAc,WAAW;AACvB,OAAK,KAAK,mBAAmB,KAAK,kBAAkB,IAAI,OACtD,OAAM,KAAK,cAAc;AAG3B,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,WAAQ,MAAM,MAAM;AACpB,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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"}
|