@ripwords/myinvois-client 0.2.9 → 0.2.10

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.
@@ -1,5 +1,5 @@
1
1
  import "../formatIdValue-qTxJqj9o.js";
2
2
  import "../document-D_3z-v5k.js";
3
- import { getSubmissionStatus, performDocumentAction, submitDocument } from "../documentSubmission-DGviQ6GN.js";
3
+ import { getSubmissionStatus, performDocumentAction, submitDocument } from "../documentSubmission-vPY3crsr.js";
4
4
 
5
5
  export { getSubmissionStatus, performDocumentAction, submitDocument };
@@ -1,3 +1,3 @@
1
- import { platformLogin } from "../platformLogin-2sZ4O_lY.js";
1
+ import { platformLogin } from "../platformLogin-CqI9OLYP.js";
2
2
 
3
3
  export { platformLogin };
@@ -1,4 +1,4 @@
1
1
  import "../formatIdValue-qTxJqj9o.js";
2
- import { taxpayerQRCode, tinSearch, verifyTin } from "../taxpayerValidation-Dpk228M0.js";
2
+ import { taxpayerQRCode, tinSearch, verifyTin } from "../taxpayerValidation-y6P-Es0S.js";
3
3
 
4
4
  export { taxpayerQRCode, tinSearch, verifyTin };
@@ -4,26 +4,24 @@ const require_document = require('./document-D7LLOhCD.cjs');
4
4
  async function submitDocument(context, documents) {
5
5
  const { fetch: fetch$1, debug, signingCredentials } = context;
6
6
  if (debug) console.log(`📦 Preparing to submit ${documents.length} document(s)...`);
7
- const completeDocument = require_document.generateCompleteDocument(documents, signingCredentials);
8
- if (debug) {
9
- console.log("✅ Documents signed successfully");
10
- console.log("📄 Document structure keys:", Object.keys(completeDocument));
11
- console.log("📊 Number of invoices:", completeDocument.Invoice.length);
12
- }
13
- const documentJson = JSON.stringify(completeDocument);
14
- if (debug) console.log(`📏 Document JSON size: ${documentJson.length} bytes`);
15
7
  const crypto = await import("crypto");
16
- const documentHash = crypto.createHash("sha256").update(documentJson, "utf8").digest("hex");
17
- const documentBase64 = Buffer.from(documentJson, "utf8").toString("base64");
18
- if (debug) {
19
- console.log(`🔒 Document hash: ${documentHash.substring(0, 16)}...`);
20
- console.log(`📦 Base64 size: ${documentBase64.length} bytes`);
21
- }
22
- const submissionPayload = { documents: documents.map((doc) => ({
23
- format: "JSON",
24
- document: documentBase64,
25
- documentHash,
26
- codeNumber: doc.eInvoiceCodeOrNumber
8
+ const submissionPayload = { documents: await Promise.all(documents.map(async (doc) => {
9
+ const signedDocument = require_document.generateCompleteDocument([doc], signingCredentials);
10
+ const docJson = JSON.stringify(signedDocument);
11
+ const docHash = crypto.createHash("sha256").update(docJson, "utf8").digest("hex");
12
+ const docBase64 = Buffer.from(docJson, "utf8").toString("base64");
13
+ if (debug) {
14
+ console.log("—".repeat(60));
15
+ console.log(`📄 Prepared document: ${doc.eInvoiceCodeOrNumber}`);
16
+ console.log(` • JSON size : ${docJson.length} bytes`);
17
+ console.log(` • Base64 size: ${docBase64.length} bytes`);
18
+ }
19
+ return {
20
+ format: "JSON",
21
+ document: docBase64,
22
+ documentHash: docHash,
23
+ codeNumber: doc.eInvoiceCodeOrNumber
24
+ };
27
25
  })) };
28
26
  if (debug) {
29
27
  console.log("🚀 Submission payload structure:");
@@ -33,7 +31,10 @@ async function submitDocument(context, documents) {
33
31
  const payloadSize = JSON.stringify(submissionPayload).length;
34
32
  if (payloadSize > 5 * 1024 * 1024) console.warn("⚠️ WARNING: Payload size exceeds 5MB limit");
35
33
  if (documents.length > 100) console.warn("⚠️ WARNING: Document count exceeds 100 document limit");
36
- if (documentJson.length > 300 * 1024) console.warn("⚠️ WARNING: Document size exceeds 300KB limit");
34
+ submissionPayload.documents.forEach((d) => {
35
+ const size = Buffer.from(d.document, "base64").length;
36
+ if (size > 300 * 1024) console.warn(`⚠️ WARNING: Document ${d.codeNumber} size (${size} bytes) exceeds 300KB limit`);
37
+ });
37
38
  }
38
39
  const response = await fetch$1("/api/v1.0/documentsubmissions", {
39
40
  method: "POST",
@@ -134,4 +135,4 @@ Object.defineProperty(exports, 'submitDocument', {
134
135
  return submitDocument;
135
136
  }
136
137
  });
137
- //# sourceMappingURL=documentSubmission-BzNsx6qa.cjs.map
138
+ //# sourceMappingURL=documentSubmission-l0FndSjm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentSubmission-l0FndSjm.cjs","names":["context: SubmissionContext","documents: AllDocumentsV1_1[]","context: Pick<SubmissionContext, 'fetch' | 'debug'>","submissionUid: string","pollInterval: number","maxRetries: number","documentUid: string","status: 'rejected' | 'cancelled'","reason: string"],"sources":["../src/api/documentSubmission.ts"],"sourcesContent":["import type {\n AllDocumentsV1_1,\n SubmissionResponse,\n SigningCredentials,\n SubmissionStatus,\n DocumentSummary,\n Fetch,\n StandardError,\n} from '../types'\nimport { generateCompleteDocument } from '../utils/document'\n\ninterface SubmissionContext {\n fetch: Fetch\n debug: boolean\n signingCredentials: SigningCredentials\n}\n\nexport async function submitDocument(\n context: SubmissionContext,\n documents: AllDocumentsV1_1[],\n): Promise<{\n data: SubmissionResponse\n status: number\n}> {\n const { fetch, debug, signingCredentials } = context\n\n if (debug) {\n console.log(`📦 Preparing to submit ${documents.length} document(s)...`)\n }\n\n // For batch submission, each document must be signed and encoded separately\n // Build the submission payload according to MyInvois API format\n const crypto = await import('crypto')\n\n const submissionPayload = {\n documents: await Promise.all(\n documents.map(async doc => {\n // 1️⃣ Sign the single document (generateCompleteDocument expects an array)\n const signedDocument = generateCompleteDocument(\n [doc],\n signingCredentials,\n )\n\n // 2️⃣ Serialize\n const docJson = JSON.stringify(signedDocument)\n\n // 3️⃣ Hash\n const docHash = crypto\n .createHash('sha256')\n .update(docJson, 'utf8')\n .digest('hex')\n\n // 4️⃣ Base64 encode\n const docBase64 = Buffer.from(docJson, 'utf8').toString('base64')\n\n if (debug) {\n console.log('—'.repeat(60))\n console.log(`📄 Prepared document: ${doc.eInvoiceCodeOrNumber}`)\n console.log(` • JSON size : ${docJson.length} bytes`)\n console.log(` • Base64 size: ${docBase64.length} bytes`)\n }\n\n return {\n format: 'JSON',\n document: docBase64,\n documentHash: docHash,\n codeNumber: doc.eInvoiceCodeOrNumber,\n }\n }),\n ),\n }\n\n if (debug) {\n console.log('🚀 Submission payload structure:')\n console.log('- Format: JSON')\n console.log('- Documents count:', submissionPayload.documents.length)\n console.log(\n '- Total payload size:',\n JSON.stringify(submissionPayload).length,\n 'bytes',\n )\n\n const payloadSize = JSON.stringify(submissionPayload).length\n if (payloadSize > 5 * 1024 * 1024) {\n // 5MB\n console.warn('⚠️ WARNING: Payload size exceeds 5MB limit')\n }\n\n if (documents.length > 100) {\n console.warn('⚠️ WARNING: Document count exceeds 100 document limit')\n }\n\n // Check each document's individual size (300 KB limit)\n submissionPayload.documents.forEach(d => {\n const size = Buffer.from(d.document, 'base64').length\n if (size > 300 * 1024) {\n console.warn(\n `⚠️ WARNING: Document ${d.codeNumber} size (${size} bytes) exceeds 300KB limit`,\n )\n }\n })\n }\n\n // Submit to MyInvois API with proper headers\n const response = await fetch('/api/v1.0/documentsubmissions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(submissionPayload),\n })\n\n if (debug) {\n console.log(`📡 API Response status: ${response.status}`)\n }\n\n const data = (await response.json()) as SubmissionResponse\n\n if (debug) {\n if (response.status !== 202) {\n console.error('❌ Submission failed with status:', response.status)\n console.error('❌ Response data:', data)\n } else {\n console.log('✅ Submission successful!')\n console.log(`📋 Submission UID: ${data.submissionUid}`)\n console.log(\n `✅ Accepted documents: ${data.acceptedDocuments?.length || 0}`,\n )\n console.log(\n `❌ Rejected documents: ${data.rejectedDocuments?.length || 0}`,\n )\n }\n }\n\n return {\n data,\n status: response.status,\n }\n}\n\nexport async function getSubmissionStatus(\n context: Pick<SubmissionContext, 'fetch' | 'debug'>,\n submissionUid: string,\n pollInterval: number = 1000,\n maxRetries: number = 10,\n): Promise<{\n status: SubmissionStatus\n documentSummary?: DocumentSummary[]\n error?: {\n code: string\n message: string | null\n target: string\n details: {\n code: string\n message: string\n target: string\n }[]\n }\n}> {\n const { fetch, debug } = context\n\n try {\n const response = await fetch(\n `/api/v1.0/documentsubmissions/${submissionUid}`,\n )\n\n const data = await response.json()\n\n if (debug) {\n console.log('Submission:', data)\n if (data.error) {\n console.log('Submission error details:', data.error.details)\n }\n }\n\n // If we have a successful response and status is completed, return success\n if (data.overallStatus === 'Valid') {\n return {\n status: data.overallStatus,\n documentSummary: data.documentSummary,\n }\n }\n if (data.overallStatus === 'Invalid') {\n return {\n status: 'Invalid',\n documentSummary: data.documentSummary,\n }\n }\n\n // If we have retries left, continue polling for any non-completed status or errors\n if (maxRetries > 0) {\n await new Promise(resolve => setTimeout(resolve, pollInterval))\n return await getSubmissionStatus(\n context,\n submissionUid,\n pollInterval,\n maxRetries - 1,\n )\n }\n\n // No retries left - return timeout\n return {\n status: 'Invalid',\n error: {\n code: 'Timeout',\n message: 'Submission timed out',\n target: 'submission',\n details: [],\n },\n }\n } catch (error) {\n // Handle any request errors by retrying if we have retries left\n if (maxRetries > 0) {\n if (debug) {\n console.log('Request error, retrying...', error)\n }\n await new Promise(resolve => setTimeout(resolve, pollInterval))\n return await getSubmissionStatus(\n context,\n submissionUid,\n pollInterval,\n maxRetries - 1,\n )\n }\n\n // No retries left - return timeout\n return {\n status: 'Invalid',\n error: {\n code: 'Timeout',\n message: 'Submission timed out after request errors',\n target: 'submission',\n details: [],\n },\n }\n }\n}\n\nexport async function performDocumentAction(\n documentUid: string,\n status: 'rejected' | 'cancelled',\n reason: string,\n): Promise<{\n uuid: string\n status: string\n error: StandardError\n}> {\n const response = await fetch(\n `/api/v1.0/documents/state/${documentUid}/state`,\n {\n method: 'POST',\n body: JSON.stringify({\n status,\n reason,\n }),\n },\n )\n\n const data = (await response.json()) as {\n uuid: string\n status: string\n error: StandardError\n }\n\n return data\n}\n"],"mappings":"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"}
@@ -4,26 +4,24 @@ import { generateCompleteDocument } from "./document-D_3z-v5k.js";
4
4
  async function submitDocument(context, documents) {
5
5
  const { fetch: fetch$1, debug, signingCredentials } = context;
6
6
  if (debug) console.log(`📦 Preparing to submit ${documents.length} document(s)...`);
7
- const completeDocument = generateCompleteDocument(documents, signingCredentials);
8
- if (debug) {
9
- console.log("✅ Documents signed successfully");
10
- console.log("📄 Document structure keys:", Object.keys(completeDocument));
11
- console.log("📊 Number of invoices:", completeDocument.Invoice.length);
12
- }
13
- const documentJson = JSON.stringify(completeDocument);
14
- if (debug) console.log(`📏 Document JSON size: ${documentJson.length} bytes`);
15
7
  const crypto = await import("crypto");
16
- const documentHash = crypto.createHash("sha256").update(documentJson, "utf8").digest("hex");
17
- const documentBase64 = Buffer.from(documentJson, "utf8").toString("base64");
18
- if (debug) {
19
- console.log(`🔒 Document hash: ${documentHash.substring(0, 16)}...`);
20
- console.log(`📦 Base64 size: ${documentBase64.length} bytes`);
21
- }
22
- const submissionPayload = { documents: documents.map((doc) => ({
23
- format: "JSON",
24
- document: documentBase64,
25
- documentHash,
26
- codeNumber: doc.eInvoiceCodeOrNumber
8
+ const submissionPayload = { documents: await Promise.all(documents.map(async (doc) => {
9
+ const signedDocument = generateCompleteDocument([doc], signingCredentials);
10
+ const docJson = JSON.stringify(signedDocument);
11
+ const docHash = crypto.createHash("sha256").update(docJson, "utf8").digest("hex");
12
+ const docBase64 = Buffer.from(docJson, "utf8").toString("base64");
13
+ if (debug) {
14
+ console.log("—".repeat(60));
15
+ console.log(`📄 Prepared document: ${doc.eInvoiceCodeOrNumber}`);
16
+ console.log(` • JSON size : ${docJson.length} bytes`);
17
+ console.log(` • Base64 size: ${docBase64.length} bytes`);
18
+ }
19
+ return {
20
+ format: "JSON",
21
+ document: docBase64,
22
+ documentHash: docHash,
23
+ codeNumber: doc.eInvoiceCodeOrNumber
24
+ };
27
25
  })) };
28
26
  if (debug) {
29
27
  console.log("🚀 Submission payload structure:");
@@ -33,7 +31,10 @@ async function submitDocument(context, documents) {
33
31
  const payloadSize = JSON.stringify(submissionPayload).length;
34
32
  if (payloadSize > 5 * 1024 * 1024) console.warn("⚠️ WARNING: Payload size exceeds 5MB limit");
35
33
  if (documents.length > 100) console.warn("⚠️ WARNING: Document count exceeds 100 document limit");
36
- if (documentJson.length > 300 * 1024) console.warn("⚠️ WARNING: Document size exceeds 300KB limit");
34
+ submissionPayload.documents.forEach((d) => {
35
+ const size = Buffer.from(d.document, "base64").length;
36
+ if (size > 300 * 1024) console.warn(`⚠️ WARNING: Document ${d.codeNumber} size (${size} bytes) exceeds 300KB limit`);
37
+ });
37
38
  }
38
39
  const response = await fetch$1("/api/v1.0/documentsubmissions", {
39
40
  method: "POST",
package/dist/index.cjs CHANGED
@@ -1,11 +1,11 @@
1
1
  const require_documentManagement = require('./documentManagement-DQ7JEcBq.cjs');
2
2
  require('./formatIdValue-i67o4kyD.cjs');
3
3
  require('./document-D7LLOhCD.cjs');
4
- const require_documentSubmission = require('./documentSubmission-BzNsx6qa.cjs');
4
+ const require_documentSubmission = require('./documentSubmission-l0FndSjm.cjs');
5
5
  const require_documentTypeManagement = require('./documentTypeManagement-D_-LiQVg.cjs');
6
6
  const require_notificationManagement = require('./notificationManagement-DLBDn77E.cjs');
7
- const require_platformLogin = require('./platformLogin-7RwW1qjT.cjs');
8
- const require_taxpayerValidation = require('./taxpayerValidation-B5548fbY.cjs');
7
+ const require_platformLogin = require('./platformLogin-Ch6hFKoU.cjs');
8
+ const require_taxpayerValidation = require('./taxpayerValidation-D_jGaVty.cjs');
9
9
  const require_certificate = require('./certificate-CLmh3bGS.cjs');
10
10
  const require_getBaseUrl = require('./getBaseUrl-D0G4GZmp.cjs');
11
11
 
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { getDocument, getDocumentDetails, searchDocuments } from "./documentManagement-CIQPkmyb.js";
2
2
  import "./formatIdValue-qTxJqj9o.js";
3
3
  import "./document-D_3z-v5k.js";
4
- import { getSubmissionStatus, performDocumentAction, submitDocument } from "./documentSubmission-DGviQ6GN.js";
4
+ import { getSubmissionStatus, performDocumentAction, submitDocument } from "./documentSubmission-vPY3crsr.js";
5
5
  import { getDocumentType, getDocumentTypeVersion, getDocumentTypes } from "./documentTypeManagement-cBtVCOY3.js";
6
6
  import { getNotifications } from "./notificationManagement-n4Z5e-My.js";
7
- import { platformLogin } from "./platformLogin-2sZ4O_lY.js";
8
- import { taxpayerQRCode, tinSearch, verifyTin } from "./taxpayerValidation-Dpk228M0.js";
7
+ import { platformLogin } from "./platformLogin-CqI9OLYP.js";
8
+ import { taxpayerQRCode, tinSearch, verifyTin } from "./taxpayerValidation-y6P-Es0S.js";
9
9
  import { extractCertificateInfo, validateKeyPair } from "./certificate-WSJT5L7T.js";
10
10
  import { getBaseUrl } from "./getBaseUrl-D7nUmoYb.js";
11
11
 
package/dist/index3.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  require('./formatIdValue-i67o4kyD.cjs');
2
2
  require('./document-D7LLOhCD.cjs');
3
- const require_documentSubmission = require('./documentSubmission-BzNsx6qa.cjs');
3
+ const require_documentSubmission = require('./documentSubmission-l0FndSjm.cjs');
4
4
 
5
5
  exports.getSubmissionStatus = require_documentSubmission.getSubmissionStatus;
6
6
  exports.performDocumentAction = require_documentSubmission.performDocumentAction;
package/dist/index6.cjs CHANGED
@@ -1,3 +1,3 @@
1
- const require_platformLogin = require('./platformLogin-7RwW1qjT.cjs');
1
+ const require_platformLogin = require('./platformLogin-Ch6hFKoU.cjs');
2
2
 
3
3
  exports.platformLogin = require_platformLogin.platformLogin;
package/dist/index7.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  require('./formatIdValue-i67o4kyD.cjs');
2
- const require_taxpayerValidation = require('./taxpayerValidation-B5548fbY.cjs');
2
+ const require_taxpayerValidation = require('./taxpayerValidation-D_jGaVty.cjs');
3
3
 
4
4
  exports.taxpayerQRCode = require_taxpayerValidation.taxpayerQRCode;
5
5
  exports.tinSearch = require_taxpayerValidation.tinSearch;
@@ -16,7 +16,16 @@ const platformLogin = async (client) => {
16
16
  scope: "InvoicingAPI"
17
17
  })
18
18
  });
19
+ if (!response.ok) {
20
+ let errorBody;
21
+ try {
22
+ errorBody = await response.json();
23
+ } catch {}
24
+ const errorMessage = typeof errorBody === "object" && errorBody !== null && "error_description" in errorBody ? errorBody.error_description : `Platform login failed with status ${response.status}`;
25
+ throw new Error(errorMessage);
26
+ }
19
27
  const tokenResponse = await response.json();
28
+ if (!tokenResponse.access_token) throw new Error("Platform login response did not include an access_token");
20
29
  return {
21
30
  token: tokenResponse.access_token,
22
31
  tokenExpiration: new Date(Date.now() + tokenResponse.expires_in * 1e3)
@@ -34,4 +43,4 @@ Object.defineProperty(exports, 'platformLogin', {
34
43
  return platformLogin;
35
44
  }
36
45
  });
37
- //# sourceMappingURL=platformLogin-7RwW1qjT.cjs.map
46
+ //# sourceMappingURL=platformLogin-Ch6hFKoU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platformLogin-Ch6hFKoU.cjs","names":["client: ClientCredentials","errorBody: unknown","tokenResponse: TokenResponse"],"sources":["../src/api/platformLogin.ts"],"sourcesContent":["import type { ClientCredentials, TokenResponse } from '../types'\n\nexport const platformLogin = async (\n client: ClientCredentials,\n): Promise<{\n token: string\n tokenExpiration: Date\n}> => {\n const { clientId, clientSecret, baseUrl, onBehalfOf, debug } = client\n try {\n const response = await fetch(`${baseUrl}/connect/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(onBehalfOf ? { onbehalfof: onBehalfOf } : {}),\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n scope: 'InvoicingAPI',\n }),\n })\n\n // If authentication fails, surface the error details immediately\n if (!response.ok) {\n let errorBody: unknown\n try {\n errorBody = await response.json()\n } catch {\n /* ignored */\n }\n\n const errorMessage =\n typeof errorBody === 'object' &&\n errorBody !== null &&\n 'error_description' in errorBody\n ? (errorBody as { error_description: string }).error_description\n : `Platform login failed with status ${response.status}`\n\n throw new Error(errorMessage)\n }\n\n const tokenResponse: TokenResponse = await response.json()\n\n if (!tokenResponse.access_token) {\n throw new Error('Platform login response did not include an access_token')\n }\n\n return {\n token: tokenResponse.access_token,\n tokenExpiration: new Date(Date.now() + tokenResponse.expires_in * 1000),\n }\n } catch (error) {\n if (debug) console.error(error)\n throw error\n }\n}\n"],"mappings":";;AAEA,MAAa,gBAAgB,OAC3BA,WAII;CACJ,MAAM,EAAE,UAAU,cAAc,SAAS,YAAY,OAAO,GAAG;AAC/D,KAAI;EACF,MAAM,WAAW,MAAM,OAAO,EAAE,QAAQ,iBAAiB;GACvD,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAI,aAAa,EAAE,YAAY,WAAY,IAAG,CAAE;GACjD;GACD,MAAM,IAAI,gBAAgB;IACxB,YAAY;IACZ,WAAW;IACX,eAAe;IACf,OAAO;GACR;EACF,EAAC;AAGF,OAAK,SAAS,IAAI;GAChB,IAAIC;AACJ,OAAI;AACF,gBAAY,MAAM,SAAS,MAAM;GAClC,QAAO,CAEP;GAED,MAAM,sBACG,cAAc,YACrB,cAAc,QACd,uBAAuB,YAClB,UAA4C,qBAC5C,oCAAoC,SAAS,OAAO;AAE3D,SAAM,IAAI,MAAM;EACjB;EAED,MAAMC,gBAA+B,MAAM,SAAS,MAAM;AAE1D,OAAK,cAAc,aACjB,OAAM,IAAI,MAAM;AAGlB,SAAO;GACL,OAAO,cAAc;GACrB,iBAAiB,IAAI,KAAK,KAAK,KAAK,GAAG,cAAc,aAAa;EACnE;CACF,SAAQ,OAAO;AACd,MAAI,MAAO,SAAQ,MAAM,MAAM;AAC/B,QAAM;CACP;AACF"}
@@ -15,7 +15,16 @@ const platformLogin = async (client) => {
15
15
  scope: "InvoicingAPI"
16
16
  })
17
17
  });
18
+ if (!response.ok) {
19
+ let errorBody;
20
+ try {
21
+ errorBody = await response.json();
22
+ } catch {}
23
+ const errorMessage = typeof errorBody === "object" && errorBody !== null && "error_description" in errorBody ? errorBody.error_description : `Platform login failed with status ${response.status}`;
24
+ throw new Error(errorMessage);
25
+ }
18
26
  const tokenResponse = await response.json();
27
+ if (!tokenResponse.access_token) throw new Error("Platform login response did not include an access_token");
19
28
  return {
20
29
  token: tokenResponse.access_token,
21
30
  tokenExpiration: new Date(Date.now() + tokenResponse.expires_in * 1e3)
@@ -25,7 +25,8 @@ async function verifyTin(context, tin, idType, idValue) {
25
25
  const { fetch, debug } = context;
26
26
  try {
27
27
  const response = await fetch(`/api/v1.0/taxpayer/validate/${tin}?idType=${idType}&idValue=${require_formatIdValue.formatIdValue(idValue)}`, { method: "GET" });
28
- if (response.status === 200) return true;
28
+ if (!response) return false;
29
+ if (response.ok || response.status === 200) return true;
29
30
  return false;
30
31
  } catch (error) {
31
32
  if (debug) console.error(error);
@@ -58,4 +59,4 @@ Object.defineProperty(exports, 'verifyTin', {
58
59
  return verifyTin;
59
60
  }
60
61
  });
61
- //# sourceMappingURL=taxpayerValidation-B5548fbY.cjs.map
62
+ //# sourceMappingURL=taxpayerValidation-D_jGaVty.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taxpayerValidation-B5548fbY.cjs","names":["context: TaxpayerContext","params: TinSearchParams","tin: string","idType: RegistrationType","idValue: string","qrCodeText: string"],"sources":["../src/api/taxpayerValidation.ts"],"sourcesContent":["import { formatIdValue } from 'src/utils/formatIdValue'\nimport type {\n Fetch,\n RegistrationType,\n TaxpayerQRCodeResponse,\n TinSearchParams,\n TinSearchResponse,\n} from '../types'\n\ninterface TaxpayerContext {\n fetch: Fetch\n debug: boolean\n}\n\nexport async function tinSearch(\n context: TaxpayerContext,\n params: TinSearchParams,\n): Promise<TinSearchResponse> {\n const { fetch, debug } = context\n const { taxpayerName, idType, idValue } = params\n\n // Validate input parameters according to API requirements\n if (!taxpayerName && (!idType || !idValue)) {\n throw new Error(\n 'Either taxpayerName must be provided, or both idType and idValue must be provided',\n )\n }\n\n if ((idType && !idValue) || (!idType && idValue)) {\n throw new Error('idType and idValue must be provided together')\n }\n\n // Build query parameters\n const queryParams = new URLSearchParams()\n\n if (taxpayerName) {\n queryParams.append('taxpayerName', taxpayerName)\n }\n\n if (idType && idValue) {\n queryParams.append('idType', idType)\n queryParams.append('idValue', formatIdValue(idValue))\n }\n\n const queryString = queryParams.toString()\n\n try {\n const response = await fetch(\n `/api/v1.0/taxpayer/search/tin?${queryString}`,\n {\n method: 'GET',\n },\n )\n return (await response.json()) as TinSearchResponse\n } catch (error) {\n if (debug) {\n console.error('TIN search error:', error)\n }\n throw error\n }\n}\n\nexport async function verifyTin(\n context: TaxpayerContext,\n tin: string,\n idType: RegistrationType,\n idValue: string,\n): Promise<boolean> {\n const { fetch, debug } = context\n\n try {\n const response = await fetch(\n `/api/v1.0/taxpayer/validate/${tin}?idType=${idType}&idValue=${formatIdValue(idValue)}`,\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 (debug) {\n console.error(error)\n }\n return false\n }\n}\n\nexport async function taxpayerQRCode(\n context: TaxpayerContext,\n qrCodeText: string,\n): Promise<TaxpayerQRCodeResponse> {\n const { fetch } = context\n\n const base64EncodedQRCodeText = Buffer.from(qrCodeText).toString('base64')\n\n const response = await fetch(\n `/api/v1.0/taxpayer/qrcodeinfo/${base64EncodedQRCodeText}`,\n )\n\n return response.json()\n}\n"],"mappings":";;;AAcA,eAAsB,UACpBA,SACAC,QAC4B;CAC5B,MAAM,EAAE,OAAO,OAAO,GAAG;CACzB,MAAM,EAAE,cAAc,QAAQ,SAAS,GAAG;AAG1C,MAAK,kBAAkB,WAAW,SAChC,OAAM,IAAI,MACR;AAIJ,KAAK,WAAW,YAAc,UAAU,QACtC,OAAM,IAAI,MAAM;CAIlB,MAAM,cAAc,IAAI;AAExB,KAAI,aACF,aAAY,OAAO,gBAAgB,aAAa;AAGlD,KAAI,UAAU,SAAS;AACrB,cAAY,OAAO,UAAU,OAAO;AACpC,cAAY,OAAO,WAAW,oCAAc,QAAQ,CAAC;CACtD;CAED,MAAM,cAAc,YAAY,UAAU;AAE1C,KAAI;EACF,MAAM,WAAW,MAAM,OACpB,gCAAgC,YAAY,GAC7C,EACE,QAAQ,MACT,EACF;AACD,SAAQ,MAAM,SAAS,MAAM;CAC9B,SAAQ,OAAO;AACd,MAAI,MACF,SAAQ,MAAM,qBAAqB,MAAM;AAE3C,QAAM;CACP;AACF;AAED,eAAsB,UACpBD,SACAE,KACAC,QACAC,SACkB;CAClB,MAAM,EAAE,OAAO,OAAO,GAAG;AAEzB,KAAI;EACF,MAAM,WAAW,MAAM,OACpB,8BAA8B,IAAI,UAAU,OAAO,WAAW,oCAAc,QAAQ,CAAC,GACtF,EACE,QAAQ,MACT,EACF;AAED,MAAI,SAAS,WAAW,IACtB,QAAO;AAGT,SAAO;CACR,SAAQ,OAAO;AACd,MAAI,MACF,SAAQ,MAAM,MAAM;AAEtB,SAAO;CACR;AACF;AAED,eAAsB,eACpBJ,SACAK,YACiC;CACjC,MAAM,EAAE,OAAO,GAAG;CAElB,MAAM,0BAA0B,OAAO,KAAK,WAAW,CAAC,SAAS,SAAS;CAE1E,MAAM,WAAW,MAAM,OACpB,gCAAgC,wBAAwB,EAC1D;AAED,QAAO,SAAS,MAAM;AACvB"}
1
+ {"version":3,"file":"taxpayerValidation-D_jGaVty.cjs","names":["context: TaxpayerContext","params: TinSearchParams","tin: string","idType: RegistrationType","idValue: string","qrCodeText: string"],"sources":["../src/api/taxpayerValidation.ts"],"sourcesContent":["import { formatIdValue } from 'src/utils/formatIdValue'\nimport type {\n Fetch,\n RegistrationType,\n TaxpayerQRCodeResponse,\n TinSearchParams,\n TinSearchResponse,\n} from '../types'\n\ninterface TaxpayerContext {\n fetch: Fetch\n debug: boolean\n}\n\nexport async function tinSearch(\n context: TaxpayerContext,\n params: TinSearchParams,\n): Promise<TinSearchResponse> {\n const { fetch, debug } = context\n const { taxpayerName, idType, idValue } = params\n\n // Validate input parameters according to API requirements\n if (!taxpayerName && (!idType || !idValue)) {\n throw new Error(\n 'Either taxpayerName must be provided, or both idType and idValue must be provided',\n )\n }\n\n if ((idType && !idValue) || (!idType && idValue)) {\n throw new Error('idType and idValue must be provided together')\n }\n\n // Build query parameters\n const queryParams = new URLSearchParams()\n\n if (taxpayerName) {\n queryParams.append('taxpayerName', taxpayerName)\n }\n\n if (idType && idValue) {\n queryParams.append('idType', idType)\n queryParams.append('idValue', formatIdValue(idValue))\n }\n\n const queryString = queryParams.toString()\n\n try {\n const response = await fetch(\n `/api/v1.0/taxpayer/search/tin?${queryString}`,\n {\n method: 'GET',\n },\n )\n return (await response.json()) as TinSearchResponse\n } catch (error) {\n if (debug) {\n console.error('TIN search error:', error)\n }\n throw error\n }\n}\n\nexport async function verifyTin(\n context: TaxpayerContext,\n tin: string,\n idType: RegistrationType,\n idValue: string,\n): Promise<boolean> {\n const { fetch, debug } = context\n\n try {\n const response = await fetch(\n `/api/v1.0/taxpayer/validate/${tin}?idType=${idType}&idValue=${formatIdValue(idValue)}`,\n {\n method: 'GET',\n },\n )\n\n if (!response) {\n // Fetch was stubbed to return undefined or network error occurred\n return false\n }\n\n if (response.ok || response.status === 200) {\n return true\n }\n\n return false\n } catch (error) {\n if (debug) {\n console.error(error)\n }\n return false\n }\n}\n\nexport async function taxpayerQRCode(\n context: TaxpayerContext,\n qrCodeText: string,\n): Promise<TaxpayerQRCodeResponse> {\n const { fetch } = context\n\n const base64EncodedQRCodeText = Buffer.from(qrCodeText).toString('base64')\n\n const response = await fetch(\n `/api/v1.0/taxpayer/qrcodeinfo/${base64EncodedQRCodeText}`,\n )\n\n return response.json()\n}\n"],"mappings":";;;AAcA,eAAsB,UACpBA,SACAC,QAC4B;CAC5B,MAAM,EAAE,OAAO,OAAO,GAAG;CACzB,MAAM,EAAE,cAAc,QAAQ,SAAS,GAAG;AAG1C,MAAK,kBAAkB,WAAW,SAChC,OAAM,IAAI,MACR;AAIJ,KAAK,WAAW,YAAc,UAAU,QACtC,OAAM,IAAI,MAAM;CAIlB,MAAM,cAAc,IAAI;AAExB,KAAI,aACF,aAAY,OAAO,gBAAgB,aAAa;AAGlD,KAAI,UAAU,SAAS;AACrB,cAAY,OAAO,UAAU,OAAO;AACpC,cAAY,OAAO,WAAW,oCAAc,QAAQ,CAAC;CACtD;CAED,MAAM,cAAc,YAAY,UAAU;AAE1C,KAAI;EACF,MAAM,WAAW,MAAM,OACpB,gCAAgC,YAAY,GAC7C,EACE,QAAQ,MACT,EACF;AACD,SAAQ,MAAM,SAAS,MAAM;CAC9B,SAAQ,OAAO;AACd,MAAI,MACF,SAAQ,MAAM,qBAAqB,MAAM;AAE3C,QAAM;CACP;AACF;AAED,eAAsB,UACpBD,SACAE,KACAC,QACAC,SACkB;CAClB,MAAM,EAAE,OAAO,OAAO,GAAG;AAEzB,KAAI;EACF,MAAM,WAAW,MAAM,OACpB,8BAA8B,IAAI,UAAU,OAAO,WAAW,oCAAc,QAAQ,CAAC,GACtF,EACE,QAAQ,MACT,EACF;AAED,OAAK,SAEH,QAAO;AAGT,MAAI,SAAS,MAAM,SAAS,WAAW,IACrC,QAAO;AAGT,SAAO;CACR,SAAQ,OAAO;AACd,MAAI,MACF,SAAQ,MAAM,MAAM;AAEtB,SAAO;CACR;AACF;AAED,eAAsB,eACpBJ,SACAK,YACiC;CACjC,MAAM,EAAE,OAAO,GAAG;CAElB,MAAM,0BAA0B,OAAO,KAAK,WAAW,CAAC,SAAS,SAAS;CAE1E,MAAM,WAAW,MAAM,OACpB,gCAAgC,wBAAwB,EAC1D;AAED,QAAO,SAAS,MAAM;AACvB"}
@@ -25,7 +25,8 @@ async function verifyTin(context, tin, idType, idValue) {
25
25
  const { fetch, debug } = context;
26
26
  try {
27
27
  const response = await fetch(`/api/v1.0/taxpayer/validate/${tin}?idType=${idType}&idValue=${formatIdValue(idValue)}`, { method: "GET" });
28
- if (response.status === 200) return true;
28
+ if (!response) return false;
29
+ if (response.ok || response.status === 200) return true;
29
30
  return false;
30
31
  } catch (error) {
31
32
  if (debug) console.error(error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ripwords/myinvois-client",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "description": "MyInvois client",
5
5
  "scripts": {
6
6
  "build": "tsdown",
@@ -1 +0,0 @@
1
- {"version":3,"file":"documentSubmission-BzNsx6qa.cjs","names":["context: SubmissionContext","documents: AllDocumentsV1_1[]","context: Pick<SubmissionContext, 'fetch' | 'debug'>","submissionUid: string","pollInterval: number","maxRetries: number","documentUid: string","status: 'rejected' | 'cancelled'","reason: string"],"sources":["../src/api/documentSubmission.ts"],"sourcesContent":["import type {\n AllDocumentsV1_1,\n SubmissionResponse,\n SigningCredentials,\n SubmissionStatus,\n DocumentSummary,\n Fetch,\n StandardError,\n} from '../types'\nimport { generateCompleteDocument } from '../utils/document'\n\ninterface SubmissionContext {\n fetch: Fetch\n debug: boolean\n signingCredentials: SigningCredentials\n}\n\nexport async function submitDocument(\n context: SubmissionContext,\n documents: AllDocumentsV1_1[],\n): Promise<{\n data: SubmissionResponse\n status: number\n}> {\n const { fetch, debug, signingCredentials } = context\n\n if (debug) {\n console.log(`📦 Preparing to submit ${documents.length} document(s)...`)\n }\n\n // Generate the complete signed document structure first\n const completeDocument = generateCompleteDocument(\n documents,\n signingCredentials,\n )\n\n if (debug) {\n console.log('✅ Documents signed successfully')\n console.log('📄 Document structure keys:', Object.keys(completeDocument))\n console.log('📊 Number of invoices:', completeDocument.Invoice.length)\n }\n\n // Convert the complete document to JSON string\n const documentJson = JSON.stringify(completeDocument)\n\n if (debug) {\n console.log(`📏 Document JSON size: ${documentJson.length} bytes`)\n }\n\n // Generate SHA256 hash of the JSON document\n const crypto = await import('crypto')\n const documentHash = crypto\n .createHash('sha256')\n .update(documentJson, 'utf8')\n .digest('hex')\n\n // Base64 encode the JSON document\n const documentBase64 = Buffer.from(documentJson, 'utf8').toString('base64')\n\n if (debug) {\n console.log(`🔒 Document hash: ${documentHash.substring(0, 16)}...`)\n console.log(`📦 Base64 size: ${documentBase64.length} bytes`)\n }\n\n // Build the submission payload according to MyInvois API format\n const submissionPayload = {\n documents: documents.map(doc => ({\n format: 'JSON', // We're submitting JSON format\n document: documentBase64, // Base64 encoded complete document\n documentHash: documentHash, // SHA256 hash of the JSON\n codeNumber: doc.eInvoiceCodeOrNumber, // Document reference number\n })),\n }\n\n if (debug) {\n console.log('🚀 Submission payload structure:')\n console.log('- Format: JSON')\n console.log('- Documents count:', submissionPayload.documents.length)\n console.log(\n '- Total payload size:',\n JSON.stringify(submissionPayload).length,\n 'bytes',\n )\n\n // Validate submission constraints\n const payloadSize = JSON.stringify(submissionPayload).length\n if (payloadSize > 5 * 1024 * 1024) {\n // 5MB\n console.warn('⚠️ WARNING: Payload size exceeds 5MB limit')\n }\n\n if (documents.length > 100) {\n console.warn('⚠️ WARNING: Document count exceeds 100 document limit')\n }\n\n if (documentJson.length > 300 * 1024) {\n // 300KB per document\n console.warn('⚠️ WARNING: Document size exceeds 300KB limit')\n }\n }\n\n // Submit to MyInvois API with proper headers\n const response = await fetch('/api/v1.0/documentsubmissions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(submissionPayload),\n })\n\n if (debug) {\n console.log(`📡 API Response status: ${response.status}`)\n }\n\n const data = (await response.json()) as SubmissionResponse\n\n if (debug) {\n if (response.status !== 202) {\n console.error('❌ Submission failed with status:', response.status)\n console.error('❌ Response data:', data)\n } else {\n console.log('✅ Submission successful!')\n console.log(`📋 Submission UID: ${data.submissionUid}`)\n console.log(\n `✅ Accepted documents: ${data.acceptedDocuments?.length || 0}`,\n )\n console.log(\n `❌ Rejected documents: ${data.rejectedDocuments?.length || 0}`,\n )\n }\n }\n\n return {\n data,\n status: response.status,\n }\n}\n\nexport async function getSubmissionStatus(\n context: Pick<SubmissionContext, 'fetch' | 'debug'>,\n submissionUid: string,\n pollInterval: number = 1000,\n maxRetries: number = 10,\n): Promise<{\n status: SubmissionStatus\n documentSummary?: DocumentSummary[]\n error?: {\n code: string\n message: string | null\n target: string\n details: {\n code: string\n message: string\n target: string\n }[]\n }\n}> {\n const { fetch, debug } = context\n\n try {\n const response = await fetch(\n `/api/v1.0/documentsubmissions/${submissionUid}`,\n )\n\n const data = await response.json()\n\n if (debug) {\n console.log('Submission:', data)\n if (data.error) {\n console.log('Submission error details:', data.error.details)\n }\n }\n\n // If we have a successful response and status is completed, return success\n if (data.overallStatus === 'Valid') {\n return {\n status: data.overallStatus,\n documentSummary: data.documentSummary,\n }\n }\n if (data.overallStatus === 'Invalid') {\n return {\n status: 'Invalid',\n documentSummary: data.documentSummary,\n }\n }\n\n // If we have retries left, continue polling for any non-completed status or errors\n if (maxRetries > 0) {\n await new Promise(resolve => setTimeout(resolve, pollInterval))\n return await getSubmissionStatus(\n context,\n submissionUid,\n pollInterval,\n maxRetries - 1,\n )\n }\n\n // No retries left - return timeout\n return {\n status: 'Invalid',\n error: {\n code: 'Timeout',\n message: 'Submission timed out',\n target: 'submission',\n details: [],\n },\n }\n } catch (error) {\n // Handle any request errors by retrying if we have retries left\n if (maxRetries > 0) {\n if (debug) {\n console.log('Request error, retrying...', error)\n }\n await new Promise(resolve => setTimeout(resolve, pollInterval))\n return await getSubmissionStatus(\n context,\n submissionUid,\n pollInterval,\n maxRetries - 1,\n )\n }\n\n // No retries left - return timeout\n return {\n status: 'Invalid',\n error: {\n code: 'Timeout',\n message: 'Submission timed out after request errors',\n target: 'submission',\n details: [],\n },\n }\n }\n}\n\nexport async function performDocumentAction(\n documentUid: string,\n status: 'rejected' | 'cancelled',\n reason: string,\n): Promise<{\n uuid: string\n status: string\n error: StandardError\n}> {\n const response = await fetch(\n `/api/v1.0/documents/state/${documentUid}/state`,\n {\n method: 'POST',\n body: JSON.stringify({\n status,\n reason,\n }),\n },\n )\n\n const data = (await response.json()) as {\n uuid: string\n status: string\n error: StandardError\n }\n\n return data\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"platformLogin-7RwW1qjT.cjs","names":["client: ClientCredentials","tokenResponse: TokenResponse"],"sources":["../src/api/platformLogin.ts"],"sourcesContent":["import type { ClientCredentials, TokenResponse } from '../types'\n\nexport const platformLogin = async (\n client: ClientCredentials,\n): Promise<{\n token: string\n tokenExpiration: Date\n}> => {\n const { clientId, clientSecret, baseUrl, onBehalfOf, debug } = client\n try {\n const response = await fetch(`${baseUrl}/connect/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(onBehalfOf ? { onbehalfof: onBehalfOf } : {}),\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n scope: 'InvoicingAPI',\n }),\n })\n\n const tokenResponse: TokenResponse = await response.json()\n return {\n token: tokenResponse.access_token,\n tokenExpiration: new Date(Date.now() + tokenResponse.expires_in * 1000),\n }\n } catch (error) {\n if (debug) console.error(error)\n throw error\n }\n}\n"],"mappings":";;AAEA,MAAa,gBAAgB,OAC3BA,WAII;CACJ,MAAM,EAAE,UAAU,cAAc,SAAS,YAAY,OAAO,GAAG;AAC/D,KAAI;EACF,MAAM,WAAW,MAAM,OAAO,EAAE,QAAQ,iBAAiB;GACvD,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAI,aAAa,EAAE,YAAY,WAAY,IAAG,CAAE;GACjD;GACD,MAAM,IAAI,gBAAgB;IACxB,YAAY;IACZ,WAAW;IACX,eAAe;IACf,OAAO;GACR;EACF,EAAC;EAEF,MAAMC,gBAA+B,MAAM,SAAS,MAAM;AAC1D,SAAO;GACL,OAAO,cAAc;GACrB,iBAAiB,IAAI,KAAK,KAAK,KAAK,GAAG,cAAc,aAAa;EACnE;CACF,SAAQ,OAAO;AACd,MAAI,MAAO,SAAQ,MAAM,MAAM;AAC/B,QAAM;CACP;AACF"}