@cheqi/sdk 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cheqi-sdk.d.ts +7 -6
- package/dist/cheqi-sdk.js +7 -2
- package/dist/cheqi-sdk.js.map +1 -1
- package/dist/errors.d.ts +17 -1
- package/dist/errors.js +36 -1
- package/dist/errors.js.map +1 -1
- package/dist/http/client.js +46 -8
- package/dist/http/client.js.map +1 -1
- package/dist/http/retry.js +12 -5
- package/dist/http/retry.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/domain.js +9 -1
- package/dist/models/domain.js.map +1 -1
- package/dist/models/generated/AuthorizedCompanyDTO.d.ts +0 -6
- package/dist/models/generated/AuthorizedCompanyDTO.js +0 -2
- package/dist/models/generated/AuthorizedCompanyDTO.js.map +1 -1
- package/dist/models/generated/CompanyCreationRequest.d.ts +0 -6
- package/dist/models/generated/CompanyCreationRequest.js +0 -2
- package/dist/models/generated/CompanyCreationRequest.js.map +1 -1
- package/dist/models/generated/CompanyResponseBody.d.ts +0 -6
- package/dist/models/generated/CompanyResponseBody.js +0 -2
- package/dist/models/generated/CompanyResponseBody.js.map +1 -1
- package/dist/models/generated/EncryptedCreditNoteDto.d.ts +4 -13
- package/dist/models/generated/EncryptedCreditNoteDto.js +3 -11
- package/dist/models/generated/EncryptedCreditNoteDto.js.map +1 -1
- package/dist/models/generated/EncryptedReceipt.d.ts +109 -0
- package/dist/models/generated/{EncryptedReceiptDto.js → EncryptedReceipt.js} +12 -20
- package/dist/models/generated/EncryptedReceipt.js.map +1 -0
- package/dist/models/generated/ReceiverType.d.ts +27 -0
- package/dist/models/generated/ReceiverType.js +46 -0
- package/dist/models/generated/ReceiverType.js.map +1 -0
- package/dist/models/generated/WebhookEventDTO.d.ts +3 -3
- package/dist/models/generated/WebhookEventDTO.js +3 -3
- package/dist/models/generated/WebhookEventDTO.js.map +1 -1
- package/dist/models/generated/index.d.ts +2 -1
- package/dist/models/generated/index.js +2 -1
- package/dist/models/generated/index.js.map +1 -1
- package/dist/models.d.ts +21 -0
- package/dist/models.js +65 -7
- package/dist/models.js.map +1 -1
- package/dist/rfc8785.d.ts +17 -0
- package/dist/rfc8785.js +241 -9
- package/dist/rfc8785.js.map +1 -1
- package/dist/services/credit-note.d.ts +7 -4
- package/dist/services/credit-note.js +13 -2
- package/dist/services/credit-note.js.map +1 -1
- package/dist/services/decryption.js +2 -2
- package/dist/services/decryption.js.map +1 -1
- package/dist/services/encryption.js +17 -6
- package/dist/services/encryption.js.map +1 -1
- package/dist/services/matching.js +2 -2
- package/dist/services/matching.js.map +1 -1
- package/dist/services/receipt-processor.d.ts +27 -0
- package/dist/services/receipt-processor.js +111 -0
- package/dist/services/receipt-processor.js.map +1 -0
- package/dist/types.d.ts +42 -2
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +32 -1
- package/dist/utils.js.map +1 -1
- package/dist/xml.d.ts +6 -0
- package/dist/xml.js +155 -3
- package/dist/xml.js.map +1 -1
- package/package.json +4 -1
- package/dist/models/generated/EncryptedReceiptDto.d.ts +0 -118
- package/dist/models/generated/EncryptedReceiptDto.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { constants, createDecipheriv, createPrivateKey, privateDecrypt } from "n
|
|
|
2
2
|
import { AES_KEY_LENGTH, GCM_IV_LENGTH, GCM_TAG_LENGTH } from "../crypto.js";
|
|
3
3
|
import { DecryptionError } from "../errors.js";
|
|
4
4
|
import { CreditNoteContextEnvelopeFromJSON } from "../models/generated/CreditNoteContextEnvelope.js";
|
|
5
|
-
import {
|
|
5
|
+
import { decodeKey } from "../utils.js";
|
|
6
6
|
function rsaDecrypt(encryptedKeyBase64, privateKeyBase64) {
|
|
7
7
|
if (!encryptedKeyBase64) {
|
|
8
8
|
throw new DecryptionError("Encrypted key cannot be empty");
|
|
@@ -11,7 +11,7 @@ function rsaDecrypt(encryptedKeyBase64, privateKeyBase64) {
|
|
|
11
11
|
throw new DecryptionError("Private key is required for decryption");
|
|
12
12
|
}
|
|
13
13
|
const privateKey = createPrivateKey({
|
|
14
|
-
key:
|
|
14
|
+
key: decodeKey(privateKeyBase64),
|
|
15
15
|
format: "der",
|
|
16
16
|
type: "pkcs8"
|
|
17
17
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decryption.js","sourceRoot":"","sources":["../../src/services/decryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AAQrG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"decryption.js","sourceRoot":"","sources":["../../src/services/decryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,22 @@
|
|
|
1
1
|
import { constants, createCipheriv, createPublicKey, publicEncrypt, randomBytes } from "node:crypto";
|
|
2
2
|
import { AES_KEY_LENGTH, GCM_IV_LENGTH } from "../crypto.js";
|
|
3
3
|
import { EncryptionError } from "../errors.js";
|
|
4
|
-
import {
|
|
4
|
+
import { decodeKey } from "../utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* Parse an RSA public key, supporting both X.509 SubjectPublicKeyInfo (SPKI) and
|
|
7
|
+
* raw PKCS#1 RSAPublicKey DER (the format produced by iOS
|
|
8
|
+
* `SecKeyCopyExternalRepresentation`). Mirrors the Java SDK `RSAPublicKeyParser`.
|
|
9
|
+
*/
|
|
10
|
+
function parsePublicKey(publicKeyBase64) {
|
|
11
|
+
const der = decodeKey(publicKeyBase64);
|
|
12
|
+
try {
|
|
13
|
+
return createPublicKey({ key: der, format: "der", type: "spki" });
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fall back to raw PKCS#1 RSA public key (iOS SecKeyCopyExternalRepresentation).
|
|
17
|
+
return createPublicKey({ key: der, format: "der", type: "pkcs1" });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
5
20
|
function hybridEncrypt(plaintext, publicKeyBase64) {
|
|
6
21
|
if (!publicKeyBase64) {
|
|
7
22
|
throw new EncryptionError("Public key is required for encryption");
|
|
@@ -12,11 +27,7 @@ function hybridEncrypt(plaintext, publicKeyBase64) {
|
|
|
12
27
|
const ciphertext = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
|
|
13
28
|
const tag = cipher.getAuthTag();
|
|
14
29
|
const encryptedData = Buffer.concat([iv, ciphertext, tag]).toString("base64");
|
|
15
|
-
const publicKey =
|
|
16
|
-
key: parseBase64Der(publicKeyBase64),
|
|
17
|
-
format: "der",
|
|
18
|
-
type: "spki"
|
|
19
|
-
});
|
|
30
|
+
const publicKey = parsePublicKey(publicKeyBase64);
|
|
20
31
|
const encryptedKey = publicEncrypt({
|
|
21
32
|
key: publicKey,
|
|
22
33
|
oaepHash: "sha256",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/services/encryption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/services/encryption.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CheqiApiError, ErrorCodes } from "../errors.js";
|
|
1
|
+
import { CheqiApiError, CheqiSDKError, ErrorCodes } from "../errors.js";
|
|
2
2
|
import { coalesceString } from "../utils.js";
|
|
3
3
|
export class MatchingService {
|
|
4
4
|
apiClient;
|
|
@@ -7,7 +7,7 @@ export class MatchingService {
|
|
|
7
7
|
}
|
|
8
8
|
async matchCustomer(identificationDetails, accessToken) {
|
|
9
9
|
if (!this.hasValidIdentifiers(identificationDetails)) {
|
|
10
|
-
throw new
|
|
10
|
+
throw new CheqiSDKError("Identification details must contain at least one identifier (card details, payment account details, or email)", { errorCode: ErrorCodes.VALIDATION_ERROR, httpStatusCode: 400 });
|
|
11
11
|
}
|
|
12
12
|
try {
|
|
13
13
|
return await this.apiClient.matchCustomer(identificationDetails, accessToken);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/services/matching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"matching.js","sourceRoot":"","sources":["../../src/services/matching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,SAAgD;QAAhD,cAAS,GAAT,SAAS,CAAuC;IAAG,CAAC;IAEjF,KAAK,CAAC,aAAa,CACjB,qBAA4C,EAC5C,WAA2B;QAE3B,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,aAAa,CACrB,+GAA+G,EAC/G,EAAE,SAAS,EAAE,UAAU,CAAC,gBAAgB,EAAE,cAAc,EAAE,GAAG,EAAE,CAChE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;gBACnC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,aAAa,CAAC,6BAA6B,MAAM,CAAE,KAAe,CAAC,OAAO,CAAC,EAAE,EAAE;gBACvF,SAAS,EAAE,UAAU,CAAC,aAAa;gBACnC,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,qBAA+D;QACzF,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,OAAO,CACZ,cAAc,CACX,qBAAqB,CAAC,WAA6D,EAAE,oBAAoB,EAC1G,qBAAqB,CAAC,WAAW,EAAE,uBAAuB,EAC1D,qBAAqB,CAAC,qBAAqB,EAAE,UAAU,EACvD,qBAAqB,CAAC,cAAc,EACpC,qBAAqB,CAAC,cAAc,EACpC,qBAAqB,CAAC,WAAW,CAClC,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { DecryptedReceipt, EncryptedReceipt } from "../types.js";
|
|
2
|
+
import { DecryptionService } from "./decryption.js";
|
|
3
|
+
/**
|
|
4
|
+
* Decrypts an encrypted receipt and merges the receipt context (receiving party
|
|
5
|
+
* and payment means) into both the UBL XML and CheqiReceipt formats.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors the Java SDK `ReceiptProcessor` + `ReceiptMergeService`:
|
|
8
|
+
* - UBL XML: the `<cac:AccountingCustomerParty/>` placeholder is replaced with
|
|
9
|
+
* the `xmlReceivingParty` fragment.
|
|
10
|
+
* - UBL XML: `xmlPaymentMeans` is injected immediately after the
|
|
11
|
+
* AccountingCustomerParty element when present.
|
|
12
|
+
* - CheqiReceipt: the `receivingParty` is injected from the receipt context.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ReceiptProcessor {
|
|
15
|
+
private readonly decryptionService;
|
|
16
|
+
constructor(decryptionService: DecryptionService);
|
|
17
|
+
/**
|
|
18
|
+
* Decrypt an encrypted receipt and return a fully merged {@link DecryptedReceipt}.
|
|
19
|
+
* @param encryptedReceipt The encrypted receipt payload.
|
|
20
|
+
* @param privateKey Base64-encoded PKCS#8 DER private key.
|
|
21
|
+
*/
|
|
22
|
+
processEncryptedReceipt(encryptedReceipt: EncryptedReceipt, privateKey: string): DecryptedReceipt;
|
|
23
|
+
private merge;
|
|
24
|
+
private mergeXmlParty;
|
|
25
|
+
private mergeXmlPaymentMeans;
|
|
26
|
+
private mergeReceivingParty;
|
|
27
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { DecryptionError } from "../errors.js";
|
|
2
|
+
import { ReceiptContextEnvelopeFromJSON } from "../models/generated/ReceiptContextEnvelope.js";
|
|
3
|
+
import { ReceiptEnvelopeFromJSON } from "../models/generated/ReceiptEnvelope.js";
|
|
4
|
+
const CUSTOMER_PARTY_PLACEHOLDER = "<cac:AccountingCustomerParty/>";
|
|
5
|
+
const CUSTOMER_PARTY_CLOSING_TAG = "</cac:AccountingCustomerParty>";
|
|
6
|
+
/**
|
|
7
|
+
* Decrypts an encrypted receipt and merges the receipt context (receiving party
|
|
8
|
+
* and payment means) into both the UBL XML and CheqiReceipt formats.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the Java SDK `ReceiptProcessor` + `ReceiptMergeService`:
|
|
11
|
+
* - UBL XML: the `<cac:AccountingCustomerParty/>` placeholder is replaced with
|
|
12
|
+
* the `xmlReceivingParty` fragment.
|
|
13
|
+
* - UBL XML: `xmlPaymentMeans` is injected immediately after the
|
|
14
|
+
* AccountingCustomerParty element when present.
|
|
15
|
+
* - CheqiReceipt: the `receivingParty` is injected from the receipt context.
|
|
16
|
+
*/
|
|
17
|
+
export class ReceiptProcessor {
|
|
18
|
+
decryptionService;
|
|
19
|
+
constructor(decryptionService) {
|
|
20
|
+
this.decryptionService = decryptionService;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Decrypt an encrypted receipt and return a fully merged {@link DecryptedReceipt}.
|
|
24
|
+
* @param encryptedReceipt The encrypted receipt payload.
|
|
25
|
+
* @param privateKey Base64-encoded PKCS#8 DER private key.
|
|
26
|
+
*/
|
|
27
|
+
processEncryptedReceipt(encryptedReceipt, privateKey) {
|
|
28
|
+
const { receiptContent, customerDetails } = this.decryptionService.decryptReceipt(encryptedReceipt, privateKey);
|
|
29
|
+
let receiptEnvelope;
|
|
30
|
+
try {
|
|
31
|
+
receiptEnvelope = ReceiptEnvelopeFromJSON(JSON.parse(receiptContent));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new DecryptionError("Failed to deserialize decrypted receipt envelope", { cause: error });
|
|
35
|
+
}
|
|
36
|
+
let receiptContextEnvelope = null;
|
|
37
|
+
if (customerDetails && customerDetails.trim() !== "") {
|
|
38
|
+
try {
|
|
39
|
+
receiptContextEnvelope = ReceiptContextEnvelopeFromJSON(JSON.parse(customerDetails));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new DecryptionError("Failed to deserialize decrypted receipt context envelope", { cause: error });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const decrypted = {
|
|
46
|
+
receiptEnvelope,
|
|
47
|
+
receiptContextEnvelope,
|
|
48
|
+
rawReceiptJson: receiptContent,
|
|
49
|
+
rawReceiptContextJson: customerDetails
|
|
50
|
+
};
|
|
51
|
+
this.merge(decrypted);
|
|
52
|
+
return decrypted;
|
|
53
|
+
}
|
|
54
|
+
merge(decrypted) {
|
|
55
|
+
const context = decrypted.receiptContextEnvelope;
|
|
56
|
+
if (!context) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.mergeXmlParty(decrypted.receiptEnvelope, context);
|
|
60
|
+
this.mergeXmlPaymentMeans(decrypted.receiptEnvelope, context);
|
|
61
|
+
this.mergeReceivingParty(decrypted.receiptEnvelope, context);
|
|
62
|
+
}
|
|
63
|
+
mergeXmlParty(receiptEnvelope, context) {
|
|
64
|
+
const xmlReceivingParty = context.receivingParty?.xmlReceivingParty;
|
|
65
|
+
if (!xmlReceivingParty) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
receiptEnvelope.ublPurchaseReceipt = mergeXmlPayload(receiptEnvelope.ublPurchaseReceipt, xmlReceivingParty);
|
|
69
|
+
receiptEnvelope.ublInvoice = mergeXmlPayload(receiptEnvelope.ublInvoice, xmlReceivingParty);
|
|
70
|
+
}
|
|
71
|
+
mergeXmlPaymentMeans(receiptEnvelope, context) {
|
|
72
|
+
const xmlPaymentMeans = context.paymentMeans?.xmlPaymentMeans;
|
|
73
|
+
if (!xmlPaymentMeans) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
receiptEnvelope.ublPurchaseReceipt = injectPaymentMeans(receiptEnvelope.ublPurchaseReceipt, xmlPaymentMeans);
|
|
77
|
+
receiptEnvelope.ublInvoice = injectPaymentMeans(receiptEnvelope.ublInvoice, xmlPaymentMeans);
|
|
78
|
+
}
|
|
79
|
+
mergeReceivingParty(receiptEnvelope, context) {
|
|
80
|
+
const receivingParty = context.receivingParty?.receivingParty;
|
|
81
|
+
if (!receivingParty || !receiptEnvelope.cheqi) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
receiptEnvelope.cheqi = {
|
|
85
|
+
...receiptEnvelope.cheqi,
|
|
86
|
+
receivingParty
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function mergeXmlPayload(xml, xmlReceivingParty) {
|
|
91
|
+
if (xml == null) {
|
|
92
|
+
return xml;
|
|
93
|
+
}
|
|
94
|
+
if (!xml.includes(CUSTOMER_PARTY_PLACEHOLDER)) {
|
|
95
|
+
return xml;
|
|
96
|
+
}
|
|
97
|
+
return xml.replace(CUSTOMER_PARTY_PLACEHOLDER, xmlReceivingParty);
|
|
98
|
+
}
|
|
99
|
+
function injectPaymentMeans(xml, xmlPaymentMeans) {
|
|
100
|
+
if (xml == null) {
|
|
101
|
+
return xml;
|
|
102
|
+
}
|
|
103
|
+
if (xml.includes(CUSTOMER_PARTY_CLOSING_TAG)) {
|
|
104
|
+
return xml.replace(CUSTOMER_PARTY_CLOSING_TAG, CUSTOMER_PARTY_CLOSING_TAG + xmlPaymentMeans);
|
|
105
|
+
}
|
|
106
|
+
if (xml.includes(CUSTOMER_PARTY_PLACEHOLDER)) {
|
|
107
|
+
return xml.replace(CUSTOMER_PARTY_PLACEHOLDER, CUSTOMER_PARTY_PLACEHOLDER + xmlPaymentMeans);
|
|
108
|
+
}
|
|
109
|
+
return xml;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=receipt-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt-processor.js","sourceRoot":"","sources":["../../src/services/receipt-processor.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -4,22 +4,62 @@ export type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
|
|
|
4
4
|
export interface JsonObject {
|
|
5
5
|
[key: string]: JsonValue | undefined;
|
|
6
6
|
}
|
|
7
|
-
export type { AddressDTO, BarcodeType, BuyerType, CardDetails, CreditNoteContextEnvelope, Charge, CheqiCreditNote, CheqiReceipt, CreateStoreRequest, CreditNoteTemplateGenerationRequest, CreditNoteTemplateRequest, CreditNoteTemplateResponse, Discount, EncryptedCreditNote, EncryptedCreditNoteInitiationRequest, EncryptedReceiptRequest, EncryptedReceiptsRequest, IdentificationDetails, Identifier, MatchedRecipient, NotificationDisplayCode, PaymentAccountDetails, Period, Product, ReceiptCreatedResponse, ReceiptEnvelope, ReceiptFormat, ReceiptTemplateGenerationRequest, ReceiptTemplateRequest, ReceiptTemplateResponse, RecipientResolutionResponse, SellingParty, ReceivingParty, StoreDTO, Tax, VatMetadata, } from "./models/generated/index.js";
|
|
7
|
+
export type { AddressDTO, BarcodeType, BuyerType, CardDetails, CreditNoteContextEnvelope, ReceiptContextEnvelope, Charge, CheqiCreditNote, CheqiReceipt, CreateStoreRequest, CreditNoteTemplateGenerationRequest, CreditNoteTemplateRequest, CreditNoteTemplateResponse, Discount, EncryptedCreditNote, EncryptedCreditNoteInitiationRequest, EncryptedReceiptRequest, EncryptedReceiptsRequest, IdentificationDetails, Identifier, MatchedRecipient, NotificationDisplayCode, PaymentAccountDetails, Period, Product, ReceiptCreatedResponse, ReceiptEnvelope, ReceiptFormat, ReceiptTemplateGenerationRequest, ReceiptTemplateRequest, ReceiptTemplateResponse, RecipientResolutionResponse, SellingParty, ReceivingParty, StoreDTO, Tax, VatMetadata, } from "./models/generated/index.js";
|
|
8
8
|
export type CompanyDTO = import("./models/generated/index.js").CompanyCreationRequest;
|
|
9
9
|
export type IdentificationDetailsPaymentTypeEnum = import("./models/generated/index.js").PaymentType;
|
|
10
10
|
export type ProvisionCompanyRequest = import("./models/generated/index.js").CreateChildCompanyRequest;
|
|
11
11
|
export type ProvisionCompanyResponse = import("./models/generated/index.js").CompanyResponseBody;
|
|
12
|
-
export type ReceiverType = import("./models/generated/index.js").
|
|
12
|
+
export type ReceiverType = import("./models/generated/index.js").ReceiverType;
|
|
13
13
|
export interface CreditNoteEnvelope {
|
|
14
14
|
cheqiCreditNote?: import("./models/generated/index.js").CheqiCreditNote;
|
|
15
15
|
ublCreditNote?: string;
|
|
16
16
|
}
|
|
17
|
+
/** Condition of a returned line item. Mirrors the Java SDK `ReturnCondition`. */
|
|
18
|
+
export type ReturnCondition = "DEFECTIVE" | "DAMAGED" | "WRONG_ITEM" | "NOT_AS_DESCRIBED" | "UNWANTED" | "EXPIRED" | "INCOMPLETE";
|
|
19
|
+
/** Refund preference for a customer-initiated return. Mirrors the Java SDK `RefundPreference`. */
|
|
20
|
+
export type RefundPreference = "ORIGINAL_PAYMENT_METHOD" | "BANK_TRANSFER" | "STORE_CREDIT";
|
|
21
|
+
/** Bank account details for a bank-transfer refund. Mirrors the Java SDK `RefundBankAccount`. */
|
|
22
|
+
export interface RefundBankAccount {
|
|
23
|
+
iban?: string;
|
|
24
|
+
bic?: string;
|
|
25
|
+
accountHolder?: string;
|
|
26
|
+
}
|
|
27
|
+
/** A single returned line item. Mirrors the Java SDK `ReturnLineItem`. */
|
|
28
|
+
export interface ReturnLineItem {
|
|
29
|
+
lineItemId?: string;
|
|
30
|
+
quantityReturned?: number;
|
|
31
|
+
condition?: ReturnCondition;
|
|
32
|
+
conditionNotes?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A decrypted customer-initiated credit-note (return) request.
|
|
36
|
+
* Mirrors the Java SDK `CreditNoteInitiationRequest`.
|
|
37
|
+
*/
|
|
38
|
+
export interface CreditNoteInitiationRequest {
|
|
39
|
+
cheqiReceiptId?: string;
|
|
40
|
+
receiptId?: string;
|
|
41
|
+
returnReason?: string;
|
|
42
|
+
returnReasonDescription?: string;
|
|
43
|
+
lineItems?: ReturnLineItem[];
|
|
44
|
+
refundPreference?: RefundPreference;
|
|
45
|
+
refundBankAccount?: RefundBankAccount;
|
|
46
|
+
}
|
|
17
47
|
export interface DecryptedDeliveredCreditNote {
|
|
18
48
|
creditNoteEnvelope: CreditNoteEnvelope;
|
|
19
49
|
creditNoteContextEnvelope: import("./models/generated/index.js").CreditNoteContextEnvelope | null;
|
|
20
50
|
rawJson: string;
|
|
21
51
|
rawCreditNoteContextJson: string | null;
|
|
22
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* A decrypted receipt with its context merged into both receipt formats.
|
|
55
|
+
* Mirrors the Java SDK `DecryptedReceipt` returned by `ReceiptProcessor`.
|
|
56
|
+
*/
|
|
57
|
+
export interface DecryptedReceipt {
|
|
58
|
+
receiptEnvelope: import("./models/generated/index.js").ReceiptEnvelope;
|
|
59
|
+
receiptContextEnvelope: import("./models/generated/index.js").ReceiptContextEnvelope | null;
|
|
60
|
+
rawReceiptJson: string;
|
|
61
|
+
rawReceiptContextJson: string | null;
|
|
62
|
+
}
|
|
23
63
|
export interface EncryptedReceipt {
|
|
24
64
|
recipientId?: string;
|
|
25
65
|
receiptId?: string;
|
package/dist/utils.d.ts
CHANGED
|
@@ -7,5 +7,18 @@ export declare function sha256Hex(value: string): string;
|
|
|
7
7
|
export declare function toCamelCase(value: string): string;
|
|
8
8
|
export declare function normalizeValue<T>(value: T): unknown;
|
|
9
9
|
export declare function serializeJson<T>(value: T): string;
|
|
10
|
+
/**
|
|
11
|
+
* Decode a key string into raw DER bytes.
|
|
12
|
+
*
|
|
13
|
+
* Accepts:
|
|
14
|
+
* - raw base64-encoded DER (the common case),
|
|
15
|
+
* - PEM-wrapped keys (`-----BEGIN ... KEY-----`), and
|
|
16
|
+
* - base64-encoded PEM (a PEM document that was itself base64-encoded).
|
|
17
|
+
*
|
|
18
|
+
* Mirrors the Java SDK `PemUtils.decodeKey` so both PEM-wrapped and raw base64
|
|
19
|
+
* keys are accepted interchangeably.
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeKey(keyString: string): Buffer;
|
|
22
|
+
/** @deprecated Use {@link decodeKey}, which also handles PEM-wrapped keys. */
|
|
10
23
|
export declare function parseBase64Der(base64: string): Buffer;
|
|
11
24
|
export declare function sleep(ms: number): Promise<void>;
|
package/dist/utils.js
CHANGED
|
@@ -45,8 +45,39 @@ export function normalizeValue(value) {
|
|
|
45
45
|
export function serializeJson(value) {
|
|
46
46
|
return JSON.stringify(normalizeValue(value));
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Decode a key string into raw DER bytes.
|
|
50
|
+
*
|
|
51
|
+
* Accepts:
|
|
52
|
+
* - raw base64-encoded DER (the common case),
|
|
53
|
+
* - PEM-wrapped keys (`-----BEGIN ... KEY-----`), and
|
|
54
|
+
* - base64-encoded PEM (a PEM document that was itself base64-encoded).
|
|
55
|
+
*
|
|
56
|
+
* Mirrors the Java SDK `PemUtils.decodeKey` so both PEM-wrapped and raw base64
|
|
57
|
+
* keys are accepted interchangeably.
|
|
58
|
+
*/
|
|
59
|
+
export function decodeKey(keyString) {
|
|
60
|
+
// If the input doesn't contain PEM headers, it may be base64-encoded PEM.
|
|
61
|
+
if (!keyString.includes("-----BEGIN")) {
|
|
62
|
+
try {
|
|
63
|
+
const decoded = Buffer.from(keyString.replace(/\s+/g, ""), "base64").toString("latin1");
|
|
64
|
+
if (decoded.includes("-----BEGIN")) {
|
|
65
|
+
return decodeKey(decoded);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Not base64-encoded PEM — fall through to plain base64 handling.
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const cleanKey = keyString
|
|
73
|
+
.replace(/-+BEGIN [A-Z ]+KEY-+/g, "")
|
|
74
|
+
.replace(/-+END [A-Z ]+KEY-+/g, "")
|
|
75
|
+
.replace(/\s+/g, "");
|
|
76
|
+
return Buffer.from(cleanKey, "base64");
|
|
77
|
+
}
|
|
78
|
+
/** @deprecated Use {@link decodeKey}, which also handles PEM-wrapped keys. */
|
|
48
79
|
export function parseBase64Der(base64) {
|
|
49
|
-
return
|
|
80
|
+
return decodeKey(base64);
|
|
50
81
|
}
|
|
51
82
|
export function sleep(ms) {
|
|
52
83
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG,MAAiB;IACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,SAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,KAAQ;IACxC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,KAAQ;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG,MAAiB;IACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,SAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,KAAQ;IACxC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,KAAQ;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,0EAA0E;IAC1E,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS;SACvB,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;SACpC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/xml.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonicalizes an XML string using Exclusive XML Canonicalization 1.0 (comments omitted).
|
|
3
|
+
*
|
|
4
|
+
* @throws if `xml` is null/empty or cannot be parsed.
|
|
5
|
+
*/
|
|
1
6
|
export declare function canonicalizeXml(xml: string): string;
|
|
7
|
+
/** Canonicalize XML and return its SHA-256 hash as a lowercase hex string. */
|
|
2
8
|
export declare function canonicalizeAndHashXml(xml: string): string;
|
package/dist/xml.js
CHANGED
|
@@ -1,10 +1,162 @@
|
|
|
1
|
+
import { DOMParser } from "@xmldom/xmldom";
|
|
1
2
|
import { sha256Hex } from "./utils.js";
|
|
2
|
-
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* XML Exclusive Canonicalization (C14N) 1.0 — W3C `xml-exc-c14n#`, comments omitted.
|
|
5
|
+
*
|
|
6
|
+
* Produces byte-for-byte deterministic output matching:
|
|
7
|
+
* - iOS: libxml2 `xmlC14NDocDumpMemory` with `XML_C14N_EXCLUSIVE_1_0`
|
|
8
|
+
* - Java backend: Apache Santuario `Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS`
|
|
9
|
+
* - Cheqi Java SDK: `XMLCanonicalService` (javax.xml.crypto.dsig EXCLUSIVE)
|
|
10
|
+
*
|
|
11
|
+
* Mirrors the Java SDK behaviour of stripping whitespace-only text nodes before
|
|
12
|
+
* canonicalizing so formatting differences do not affect the resulting hash.
|
|
13
|
+
*/
|
|
14
|
+
const XMLNS_NS = "http://www.w3.org/2000/xmlns/";
|
|
15
|
+
const ELEMENT_NODE = 1;
|
|
16
|
+
const TEXT_NODE = 3;
|
|
17
|
+
const CDATA_SECTION_NODE = 4;
|
|
18
|
+
const PROCESSING_INSTRUCTION_NODE = 7;
|
|
19
|
+
const DOCUMENT_NODE = 9;
|
|
20
|
+
function escapeText(value) {
|
|
21
|
+
return value
|
|
22
|
+
.replace(/&/g, "&")
|
|
23
|
+
.replace(/</g, "<")
|
|
24
|
+
.replace(/>/g, ">")
|
|
25
|
+
.replace(/\r/g, "
");
|
|
4
26
|
}
|
|
27
|
+
function escapeAttr(value) {
|
|
28
|
+
return value
|
|
29
|
+
.replace(/&/g, "&")
|
|
30
|
+
.replace(/</g, "<")
|
|
31
|
+
.replace(/"/g, """)
|
|
32
|
+
.replace(/\t/g, "	")
|
|
33
|
+
.replace(/\n/g, "
")
|
|
34
|
+
.replace(/\r/g, "
");
|
|
35
|
+
}
|
|
36
|
+
function isWhitespaceOnly(value) {
|
|
37
|
+
return value.trim() === "";
|
|
38
|
+
}
|
|
39
|
+
function compare(a, b) {
|
|
40
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
41
|
+
}
|
|
42
|
+
function serializeElement(el, ancestorNamespaces, out) {
|
|
43
|
+
// Copy of the namespace declarations visible to children (output-ancestor context).
|
|
44
|
+
const rendered = new Map(ancestorNamespaces);
|
|
45
|
+
// Collect "visibly utilized" namespaces (element prefix + prefixed attributes).
|
|
46
|
+
const utilized = new Map();
|
|
47
|
+
utilized.set(el.prefix ?? "", el.namespaceURI ?? "");
|
|
48
|
+
const regularAttrs = [];
|
|
49
|
+
if (el.attributes) {
|
|
50
|
+
for (let i = 0; i < el.attributes.length; i++) {
|
|
51
|
+
const attr = el.attributes.item(i);
|
|
52
|
+
// Skip namespace declaration attributes — these are reconstructed from namespaceURI.
|
|
53
|
+
if (attr.nodeName === "xmlns" || attr.prefix === "xmlns" || attr.namespaceURI === XMLNS_NS) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
regularAttrs.push(attr);
|
|
57
|
+
if (attr.prefix) {
|
|
58
|
+
utilized.set(attr.prefix, attr.namespaceURI ?? "");
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Decide which namespace declarations must be emitted on this element.
|
|
63
|
+
const nsToRender = [];
|
|
64
|
+
for (const [prefix, value] of utilized) {
|
|
65
|
+
if (prefix === "") {
|
|
66
|
+
if (value !== "") {
|
|
67
|
+
if (rendered.get("") !== value) {
|
|
68
|
+
nsToRender.push(["", value]);
|
|
69
|
+
rendered.set("", value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Element is in no namespace — only emit xmlns="" to undeclare an inherited default.
|
|
74
|
+
const current = rendered.get("");
|
|
75
|
+
if (current !== undefined && current !== "") {
|
|
76
|
+
nsToRender.push(["", ""]);
|
|
77
|
+
rendered.set("", "");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else if (rendered.get(prefix) !== value) {
|
|
82
|
+
nsToRender.push([prefix, value]);
|
|
83
|
+
rendered.set(prefix, value);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Namespace declarations sorted by prefix (default namespace first).
|
|
87
|
+
nsToRender.sort((a, b) => compare(a[0], b[0]));
|
|
88
|
+
// Attributes sorted by namespace URI (empty first) then local name.
|
|
89
|
+
regularAttrs.sort((a, b) => {
|
|
90
|
+
const uriCmp = compare(a.namespaceURI ?? "", b.namespaceURI ?? "");
|
|
91
|
+
if (uriCmp !== 0) {
|
|
92
|
+
return uriCmp;
|
|
93
|
+
}
|
|
94
|
+
return compare(a.localName ?? a.nodeName, b.localName ?? b.nodeName);
|
|
95
|
+
});
|
|
96
|
+
const qname = el.nodeName;
|
|
97
|
+
out.push("<", qname);
|
|
98
|
+
for (const [prefix, value] of nsToRender) {
|
|
99
|
+
out.push(prefix === "" ? ` xmlns="${escapeAttr(value)}"` : ` xmlns:${prefix}="${escapeAttr(value)}"`);
|
|
100
|
+
}
|
|
101
|
+
for (const attr of regularAttrs) {
|
|
102
|
+
out.push(` ${attr.nodeName}="${escapeAttr(attr.value ?? "")}"`);
|
|
103
|
+
}
|
|
104
|
+
out.push(">");
|
|
105
|
+
serializeChildren(el, rendered, out);
|
|
106
|
+
out.push("</", qname, ">");
|
|
107
|
+
}
|
|
108
|
+
function serializeChildren(node, rendered, out) {
|
|
109
|
+
const children = node.childNodes;
|
|
110
|
+
if (!children) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
for (let i = 0; i < children.length; i++) {
|
|
114
|
+
serializeNode(children.item(i), rendered, out);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function serializeNode(node, rendered, out) {
|
|
118
|
+
switch (node.nodeType) {
|
|
119
|
+
case ELEMENT_NODE:
|
|
120
|
+
serializeElement(node, rendered, out);
|
|
121
|
+
break;
|
|
122
|
+
case TEXT_NODE:
|
|
123
|
+
case CDATA_SECTION_NODE: {
|
|
124
|
+
const text = node.nodeValue ?? "";
|
|
125
|
+
// Mirror the Java SDK: whitespace-only (formatting) text nodes are dropped.
|
|
126
|
+
if (!isWhitespaceOnly(text)) {
|
|
127
|
+
out.push(escapeText(text));
|
|
128
|
+
}
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case PROCESSING_INSTRUCTION_NODE: {
|
|
132
|
+
const data = node.data ?? "";
|
|
133
|
+
out.push(data ? `<?${node.target} ${data}?>` : `<?${node.target}?>`);
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
// Comments are omitted (exc-c14n#, OMIT_COMMENTS).
|
|
137
|
+
default:
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Canonicalizes an XML string using Exclusive XML Canonicalization 1.0 (comments omitted).
|
|
143
|
+
*
|
|
144
|
+
* @throws if `xml` is null/empty or cannot be parsed.
|
|
145
|
+
*/
|
|
5
146
|
export function canonicalizeXml(xml) {
|
|
6
|
-
|
|
147
|
+
if (xml == null || xml.trim() === "") {
|
|
148
|
+
throw new Error("XML string cannot be null or empty");
|
|
149
|
+
}
|
|
150
|
+
const doc = new DOMParser().parseFromString(xml, "text/xml");
|
|
151
|
+
const root = doc.nodeType === DOCUMENT_NODE ? doc.documentElement ?? null : doc;
|
|
152
|
+
if (!root) {
|
|
153
|
+
throw new Error("XML Exclusive C14N canonicalization failed: no document element");
|
|
154
|
+
}
|
|
155
|
+
const out = [];
|
|
156
|
+
serializeNode(root, new Map(), out);
|
|
157
|
+
return out.join("");
|
|
7
158
|
}
|
|
159
|
+
/** Canonicalize XML and return its SHA-256 hash as a lowercase hex string. */
|
|
8
160
|
export function canonicalizeAndHashXml(xml) {
|
|
9
161
|
return sha256Hex(canonicalizeXml(xml));
|
|
10
162
|
}
|
package/dist/xml.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,SAAS,
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../src/xml.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cheqi/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Cheqi TypeScript SDK for encrypted receipt and credit note processing",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Cheqi",
|
|
@@ -52,5 +52,8 @@
|
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/node": "^25.5.0",
|
|
54
54
|
"typescript": "^5.9.3"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"@xmldom/xmldom": "^0.9.10"
|
|
55
58
|
}
|
|
56
59
|
}
|