@fin.cx/einvoice 5.0.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.
Files changed (171) hide show
  1. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  2. package/dist_ts/00_commitinfo_data.js +9 -0
  3. package/dist_ts/classes.decoder.d.ts +40 -0
  4. package/dist_ts/classes.decoder.js +320 -0
  5. package/dist_ts/classes.encoder.d.ts +51 -0
  6. package/dist_ts/classes.encoder.js +293 -0
  7. package/dist_ts/classes.xinvoice.d.ts +136 -0
  8. package/dist_ts/classes.xinvoice.js +352 -0
  9. package/dist_ts/einvoice.d.ts +217 -0
  10. package/dist_ts/einvoice.js +505 -0
  11. package/dist_ts/errors.d.ts +121 -0
  12. package/dist_ts/errors.js +241 -0
  13. package/dist_ts/formats/base/base.decoder.d.ts +32 -0
  14. package/dist_ts/formats/base/base.decoder.js +52 -0
  15. package/dist_ts/formats/base/base.encoder.d.ts +13 -0
  16. package/dist_ts/formats/base/base.encoder.js +7 -0
  17. package/dist_ts/formats/base/base.validator.d.ts +44 -0
  18. package/dist_ts/formats/base/base.validator.js +39 -0
  19. package/dist_ts/formats/base.decoder.d.ts +19 -0
  20. package/dist_ts/formats/base.decoder.js +130 -0
  21. package/dist_ts/formats/base.validator.d.ts +44 -0
  22. package/dist_ts/formats/base.validator.js +39 -0
  23. package/dist_ts/formats/cii/cii.decoder.d.ts +61 -0
  24. package/dist_ts/formats/cii/cii.decoder.js +111 -0
  25. package/dist_ts/formats/cii/cii.encoder.d.ts +43 -0
  26. package/dist_ts/formats/cii/cii.encoder.js +48 -0
  27. package/dist_ts/formats/cii/cii.types.d.ts +31 -0
  28. package/dist_ts/formats/cii/cii.types.js +40 -0
  29. package/dist_ts/formats/cii/cii.validator.d.ts +56 -0
  30. package/dist_ts/formats/cii/cii.validator.js +146 -0
  31. package/dist_ts/formats/cii/facturx/facturx.decoder.d.ts +43 -0
  32. package/dist_ts/formats/cii/facturx/facturx.decoder.js +207 -0
  33. package/dist_ts/formats/cii/facturx/facturx.encoder.d.ts +82 -0
  34. package/dist_ts/formats/cii/facturx/facturx.encoder.js +400 -0
  35. package/dist_ts/formats/cii/facturx/facturx.types.d.ts +10 -0
  36. package/dist_ts/formats/cii/facturx/facturx.types.js +15 -0
  37. package/dist_ts/formats/cii/facturx/facturx.validator.d.ts +32 -0
  38. package/dist_ts/formats/cii/facturx/facturx.validator.js +138 -0
  39. package/dist_ts/formats/cii/zugferd/zugferd.decoder.d.ts +43 -0
  40. package/dist_ts/formats/cii/zugferd/zugferd.decoder.js +218 -0
  41. package/dist_ts/formats/cii/zugferd/zugferd.encoder.d.ts +97 -0
  42. package/dist_ts/formats/cii/zugferd/zugferd.encoder.js +550 -0
  43. package/dist_ts/formats/cii/zugferd/zugferd.types.d.ts +10 -0
  44. package/dist_ts/formats/cii/zugferd/zugferd.types.js +15 -0
  45. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.d.ts +49 -0
  46. package/dist_ts/formats/cii/zugferd/zugferd.v1.decoder.js +229 -0
  47. package/dist_ts/formats/cii/zugferd/zugferd.validator.d.ts +16 -0
  48. package/dist_ts/formats/cii/zugferd/zugferd.validator.js +29 -0
  49. package/dist_ts/formats/decoder.factory.d.ts +15 -0
  50. package/dist_ts/formats/decoder.factory.js +46 -0
  51. package/dist_ts/formats/factories/decoder.factory.d.ts +13 -0
  52. package/dist_ts/formats/factories/decoder.factory.js +56 -0
  53. package/dist_ts/formats/factories/encoder.factory.d.ts +14 -0
  54. package/dist_ts/formats/factories/encoder.factory.js +40 -0
  55. package/dist_ts/formats/factories/validator.factory.d.ts +12 -0
  56. package/dist_ts/formats/factories/validator.factory.js +110 -0
  57. package/dist_ts/formats/factorx.decoder.d.ts +18 -0
  58. package/dist_ts/formats/factorx.decoder.js +178 -0
  59. package/dist_ts/formats/factorx.encoder.d.ts +51 -0
  60. package/dist_ts/formats/factorx.encoder.js +293 -0
  61. package/dist_ts/formats/facturx.decoder.d.ts +18 -0
  62. package/dist_ts/formats/facturx.decoder.js +210 -0
  63. package/dist_ts/formats/facturx.encoder.d.ts +51 -0
  64. package/dist_ts/formats/facturx.encoder.js +293 -0
  65. package/dist_ts/formats/facturx.validator.d.ts +67 -0
  66. package/dist_ts/formats/facturx.validator.js +266 -0
  67. package/dist_ts/formats/pdf/extractors/associated.extractor.d.ts +14 -0
  68. package/dist_ts/formats/pdf/extractors/associated.extractor.js +68 -0
  69. package/dist_ts/formats/pdf/extractors/base.extractor.d.ts +92 -0
  70. package/dist_ts/formats/pdf/extractors/base.extractor.js +319 -0
  71. package/dist_ts/formats/pdf/extractors/index.d.ts +4 -0
  72. package/dist_ts/formats/pdf/extractors/index.js +5 -0
  73. package/dist_ts/formats/pdf/extractors/standard.extractor.d.ts +13 -0
  74. package/dist_ts/formats/pdf/extractors/standard.extractor.js +74 -0
  75. package/dist_ts/formats/pdf/extractors/text.extractor.d.ts +45 -0
  76. package/dist_ts/formats/pdf/extractors/text.extractor.js +151 -0
  77. package/dist_ts/formats/pdf/pdf.embedder.d.ts +69 -0
  78. package/dist_ts/formats/pdf/pdf.embedder.js +183 -0
  79. package/dist_ts/formats/pdf/pdf.extractor.d.ts +49 -0
  80. package/dist_ts/formats/pdf/pdf.extractor.js +98 -0
  81. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +40 -0
  82. package/dist_ts/formats/pdf/robust-pdf.extractor.js +324 -0
  83. package/dist_ts/formats/ubl/en16931.ubl.validator.d.ts +18 -0
  84. package/dist_ts/formats/ubl/en16931.ubl.validator.js +169 -0
  85. package/dist_ts/formats/ubl/generic/ubl.encoder.d.ts +151 -0
  86. package/dist_ts/formats/ubl/generic/ubl.encoder.js +892 -0
  87. package/dist_ts/formats/ubl/ubl.decoder.d.ts +61 -0
  88. package/dist_ts/formats/ubl/ubl.decoder.js +95 -0
  89. package/dist_ts/formats/ubl/ubl.encoder.d.ts +38 -0
  90. package/dist_ts/formats/ubl/ubl.encoder.js +46 -0
  91. package/dist_ts/formats/ubl/ubl.types.d.ts +16 -0
  92. package/dist_ts/formats/ubl/ubl.types.js +21 -0
  93. package/dist_ts/formats/ubl/ubl.validator.d.ts +50 -0
  94. package/dist_ts/formats/ubl/ubl.validator.js +112 -0
  95. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.d.ts +34 -0
  96. package/dist_ts/formats/ubl/xrechnung/xrechnung.decoder.js +424 -0
  97. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.d.ts +75 -0
  98. package/dist_ts/formats/ubl/xrechnung/xrechnung.encoder.js +555 -0
  99. package/dist_ts/formats/ubl/xrechnung.validator.d.ts +15 -0
  100. package/dist_ts/formats/ubl/xrechnung.validator.js +107 -0
  101. package/dist_ts/formats/ubl.validator.d.ts +82 -0
  102. package/dist_ts/formats/ubl.validator.js +306 -0
  103. package/dist_ts/formats/utils/format.detector.d.ts +62 -0
  104. package/dist_ts/formats/utils/format.detector.js +249 -0
  105. package/dist_ts/formats/validation/en16931.validator.d.ts +23 -0
  106. package/dist_ts/formats/validation/en16931.validator.js +119 -0
  107. package/dist_ts/formats/validator.factory.d.ts +18 -0
  108. package/dist_ts/formats/validator.factory.js +78 -0
  109. package/dist_ts/formats/xinvoice.decoder.d.ts +28 -0
  110. package/dist_ts/formats/xinvoice.decoder.js +332 -0
  111. package/dist_ts/formats/xinvoice.encoder.d.ts +19 -0
  112. package/dist_ts/formats/xinvoice.encoder.js +282 -0
  113. package/dist_ts/index.d.ts +51 -0
  114. package/dist_ts/index.js +90 -0
  115. package/dist_ts/interfaces/common.d.ts +79 -0
  116. package/dist_ts/interfaces/common.js +24 -0
  117. package/dist_ts/interfaces.d.ts +87 -0
  118. package/dist_ts/interfaces.js +23 -0
  119. package/dist_ts/plugins.d.ts +14 -0
  120. package/dist_ts/plugins.js +31 -0
  121. package/npmextra.json +35 -0
  122. package/package.json +71 -0
  123. package/readme.hints.md +1107 -0
  124. package/readme.howtofixtests.md +38 -0
  125. package/readme.literature.md +1 -0
  126. package/readme.md +998 -0
  127. package/readme.plan.md +481 -0
  128. package/ts/00_commitinfo_data.ts +8 -0
  129. package/ts/einvoice.ts +603 -0
  130. package/ts/errors.ts +341 -0
  131. package/ts/formats/base/base.decoder.ts +68 -0
  132. package/ts/formats/base/base.encoder.ts +14 -0
  133. package/ts/formats/base/base.validator.ts +64 -0
  134. package/ts/formats/cii/cii.decoder.ts +139 -0
  135. package/ts/formats/cii/cii.encoder.ts +64 -0
  136. package/ts/formats/cii/cii.types.ts +44 -0
  137. package/ts/formats/cii/cii.validator.ts +171 -0
  138. package/ts/formats/cii/facturx/facturx.decoder.ts +243 -0
  139. package/ts/formats/cii/facturx/facturx.encoder.ts +483 -0
  140. package/ts/formats/cii/facturx/facturx.types.ts +18 -0
  141. package/ts/formats/cii/facturx/facturx.validator.ts +180 -0
  142. package/ts/formats/cii/zugferd/zugferd.decoder.ts +256 -0
  143. package/ts/formats/cii/zugferd/zugferd.encoder.ts +661 -0
  144. package/ts/formats/cii/zugferd/zugferd.types.ts +18 -0
  145. package/ts/formats/cii/zugferd/zugferd.v1.decoder.ts +267 -0
  146. package/ts/formats/cii/zugferd/zugferd.validator.ts +31 -0
  147. package/ts/formats/factories/decoder.factory.ts +62 -0
  148. package/ts/formats/factories/encoder.factory.ts +47 -0
  149. package/ts/formats/factories/validator.factory.ts +134 -0
  150. package/ts/formats/pdf/extractors/associated.extractor.ts +78 -0
  151. package/ts/formats/pdf/extractors/base.extractor.ts +355 -0
  152. package/ts/formats/pdf/extractors/index.ts +4 -0
  153. package/ts/formats/pdf/extractors/standard.extractor.ts +86 -0
  154. package/ts/formats/pdf/extractors/text.extractor.ts +162 -0
  155. package/ts/formats/pdf/pdf.embedder.ts +242 -0
  156. package/ts/formats/pdf/pdf.extractor.ts +141 -0
  157. package/ts/formats/ubl/en16931.ubl.validator.ts +216 -0
  158. package/ts/formats/ubl/generic/ubl.encoder.ts +1041 -0
  159. package/ts/formats/ubl/ubl.decoder.ts +121 -0
  160. package/ts/formats/ubl/ubl.encoder.ts +63 -0
  161. package/ts/formats/ubl/ubl.types.ts +22 -0
  162. package/ts/formats/ubl/ubl.validator.ts +133 -0
  163. package/ts/formats/ubl/xrechnung/xrechnung.decoder.ts +471 -0
  164. package/ts/formats/ubl/xrechnung/xrechnung.encoder.ts +619 -0
  165. package/ts/formats/ubl/xrechnung.validator.ts +185 -0
  166. package/ts/formats/utils/format.detector.ts +306 -0
  167. package/ts/formats/validation/en16931.validator.ts +135 -0
  168. package/ts/index.ts +164 -0
  169. package/ts/interfaces/common.ts +90 -0
  170. package/ts/interfaces.ts +98 -0
  171. package/ts/plugins.ts +61 -0
@@ -0,0 +1,49 @@
1
+ import { CIIBaseDecoder } from '../cii.decoder.js';
2
+ import type { TCreditNote, TDebitNote } from '../../../interfaces/common.js';
3
+ /**
4
+ * Decoder for ZUGFeRD v1 invoice format
5
+ */
6
+ export declare class ZUGFeRDV1Decoder extends CIIBaseDecoder {
7
+ /**
8
+ * Constructor
9
+ * @param xml XML string to decode
10
+ * @param skipValidation Whether to skip EN16931 validation
11
+ */
12
+ constructor(xml: string, skipValidation?: boolean);
13
+ /**
14
+ * Decodes a ZUGFeRD v1 credit note
15
+ * @returns Promise resolving to a TCreditNote object
16
+ */
17
+ protected decodeCreditNote(): Promise<TCreditNote>;
18
+ /**
19
+ * Decodes a ZUGFeRD v1 debit note (invoice)
20
+ * @returns Promise resolving to a TDebitNote object
21
+ */
22
+ protected decodeDebitNote(): Promise<TDebitNote>;
23
+ /**
24
+ * Extracts common invoice data from ZUGFeRD v1 XML
25
+ * @returns Common invoice data
26
+ */
27
+ private extractCommonData;
28
+ /**
29
+ * Extracts party information from ZUGFeRD v1 XML
30
+ * @param partyXPath XPath to the party node
31
+ * @returns Party information as TContact
32
+ */
33
+ private extractParty;
34
+ /**
35
+ * Extracts invoice items from ZUGFeRD v1 XML
36
+ * @returns Array of invoice items
37
+ */
38
+ private extractItems;
39
+ /**
40
+ * Extracts notes from ZUGFeRD v1 XML
41
+ * @returns Array of notes
42
+ */
43
+ private extractNotes;
44
+ /**
45
+ * Creates a default date for empty date fields
46
+ * @returns Default date object compatible with TContact
47
+ */
48
+ private createDefaultDate;
49
+ }
@@ -0,0 +1,229 @@
1
+ import { CIIBaseDecoder } from '../cii.decoder.js';
2
+ import { ZUGFERD_V1_NAMESPACES } from '../cii.types.js';
3
+ import { business, finance } from '../../../plugins.js';
4
+ import { EN16931Validator } from '../../validation/en16931.validator.js';
5
+ /**
6
+ * Decoder for ZUGFeRD v1 invoice format
7
+ */
8
+ export class ZUGFeRDV1Decoder extends CIIBaseDecoder {
9
+ /**
10
+ * Constructor
11
+ * @param xml XML string to decode
12
+ * @param skipValidation Whether to skip EN16931 validation
13
+ */
14
+ constructor(xml, skipValidation = false) {
15
+ super(xml, skipValidation);
16
+ // Override namespaces for ZUGFeRD v1
17
+ this.namespaces = {
18
+ rsm: ZUGFERD_V1_NAMESPACES.RSM,
19
+ ram: ZUGFERD_V1_NAMESPACES.RAM,
20
+ udt: ZUGFERD_V1_NAMESPACES.UDT
21
+ };
22
+ }
23
+ /**
24
+ * Decodes a ZUGFeRD v1 credit note
25
+ * @returns Promise resolving to a TCreditNote object
26
+ */
27
+ async decodeCreditNote() {
28
+ // Get common invoice data
29
+ const commonData = await this.extractCommonData();
30
+ // Create a credit note with the common data
31
+ return {
32
+ ...commonData,
33
+ accountingDocType: 'creditnote'
34
+ };
35
+ }
36
+ /**
37
+ * Decodes a ZUGFeRD v1 debit note (invoice)
38
+ * @returns Promise resolving to a TDebitNote object
39
+ */
40
+ async decodeDebitNote() {
41
+ // Get common invoice data
42
+ const commonData = await this.extractCommonData();
43
+ // Create a debit note with the common data
44
+ return {
45
+ ...commonData,
46
+ accountingDocType: 'debitnote'
47
+ };
48
+ }
49
+ /**
50
+ * Extracts common invoice data from ZUGFeRD v1 XML
51
+ * @returns Common invoice data
52
+ */
53
+ async extractCommonData() {
54
+ // Extract invoice ID
55
+ const invoiceId = this.getText('//ram:ID');
56
+ // Extract issue date
57
+ const issueDateStr = this.getText('//ram:IssueDateTime/udt:DateTimeString');
58
+ const issueDateFormat = this.getText('//ram:IssueDateTime/udt:DateTimeString/@format');
59
+ const issueDate = this.parseCIIDate(issueDateStr, issueDateFormat);
60
+ // Extract seller information
61
+ const seller = this.extractParty('//ram:SellerTradeParty');
62
+ // Extract buyer information
63
+ const buyer = this.extractParty('//ram:BuyerTradeParty');
64
+ // Extract items
65
+ const items = this.extractItems();
66
+ // Extract due date
67
+ const dueDateStr = this.getText('//ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString');
68
+ const dueDate = dueDateStr ? new Date(dueDateStr).getTime() : Date.now();
69
+ const dueInDays = Math.round((dueDate - issueDate) / (1000 * 60 * 60 * 24));
70
+ // Extract currency
71
+ const currencyCode = this.getText('//ram:InvoiceCurrencyCode') || 'EUR';
72
+ // Extract total amount (not used in this implementation but could be useful)
73
+ // const totalAmount = this.getNumber('//ram:GrandTotalAmount');
74
+ // Extract notes
75
+ const allNotes = this.extractNotes();
76
+ // Extract subject and notes separately
77
+ // If we have notes, the first one might be the subject
78
+ let subject = `Invoice ${invoiceId}`;
79
+ let notes = [...allNotes];
80
+ // If the first note doesn't look like a payment term or other standard note,
81
+ // treat it as the subject
82
+ if (allNotes.length > 0 && !allNotes[0].toLowerCase().includes('due in') &&
83
+ !allNotes[0].toLowerCase().includes('payment')) {
84
+ subject = allNotes[0];
85
+ notes = allNotes.slice(1); // Remove subject from notes
86
+ }
87
+ // Check for reverse charge
88
+ const reverseCharge = this.exists('//ram:SpecifiedTradeAllowanceCharge/ram:ReasonCode[text()="62"]');
89
+ // Create the common invoice data
90
+ const invoiceData = {
91
+ type: 'accounting-doc',
92
+ accountingDocType: 'invoice',
93
+ id: invoiceId,
94
+ accountingDocId: invoiceId,
95
+ date: issueDate,
96
+ accountingDocStatus: 'issued',
97
+ versionInfo: {
98
+ type: 'final',
99
+ version: '1.0.0'
100
+ },
101
+ language: 'en',
102
+ incidenceId: invoiceId,
103
+ from: seller,
104
+ to: buyer,
105
+ subject: subject,
106
+ items: items,
107
+ dueInDays: dueInDays,
108
+ reverseCharge: reverseCharge,
109
+ currency: currencyCode,
110
+ notes: notes,
111
+ deliveryDate: issueDate,
112
+ objectActions: []
113
+ };
114
+ return invoiceData;
115
+ }
116
+ /**
117
+ * Extracts party information from ZUGFeRD v1 XML
118
+ * @param partyXPath XPath to the party node
119
+ * @returns Party information as TContact
120
+ */
121
+ extractParty(partyXPath) {
122
+ // Extract name
123
+ const name = this.getText(`${partyXPath}/ram:Name`);
124
+ // Extract address
125
+ const streetName = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:LineOne`);
126
+ const city = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:CityName`);
127
+ const postalCode = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:PostcodeCode`);
128
+ const country = this.getText(`${partyXPath}/ram:PostalTradeAddress/ram:CountryID`);
129
+ // Try to extract house number from street if possible
130
+ let houseNumber = '';
131
+ const streetParts = streetName.match(/^(.*?)\s+(\d+.*)$/);
132
+ if (streetParts) {
133
+ // If we can split into street name and house number
134
+ houseNumber = streetParts[2];
135
+ }
136
+ // Create address object
137
+ const address = {
138
+ streetName: streetName,
139
+ houseNumber: houseNumber,
140
+ city: city,
141
+ postalCode: postalCode,
142
+ countryCode: country
143
+ };
144
+ // Extract VAT ID
145
+ const vatId = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"]`) || '';
146
+ // Extract registration ID
147
+ const registrationId = this.getText(`${partyXPath}/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="FC"]`) || '';
148
+ // Create contact object
149
+ return {
150
+ type: 'company',
151
+ name: name,
152
+ description: '',
153
+ address: address,
154
+ status: 'active',
155
+ foundedDate: this.createDefaultDate(),
156
+ registrationDetails: {
157
+ vatId: vatId,
158
+ registrationId: registrationId,
159
+ registrationName: ''
160
+ }
161
+ };
162
+ }
163
+ /**
164
+ * Extracts invoice items from ZUGFeRD v1 XML
165
+ * @returns Array of invoice items
166
+ */
167
+ extractItems() {
168
+ const items = [];
169
+ // Get all item nodes
170
+ const itemNodes = this.select('//ram:IncludedSupplyChainTradeLineItem', this.doc);
171
+ // Process each item
172
+ if (Array.isArray(itemNodes)) {
173
+ for (let i = 0; i < itemNodes.length; i++) {
174
+ const itemNode = itemNodes[i];
175
+ // Extract item data
176
+ const name = this.getText('ram:SpecifiedTradeProduct/ram:Name', itemNode);
177
+ const articleNumber = this.getText('ram:SpecifiedTradeProduct/ram:SellerAssignedID', itemNode);
178
+ const unitQuantity = this.getNumber('ram:SpecifiedLineTradeDelivery/ram:BilledQuantity', itemNode);
179
+ const unitType = this.getText('ram:SpecifiedLineTradeDelivery/ram:BilledQuantity/@unitCode', itemNode) || 'EA';
180
+ const unitNetPrice = this.getNumber('ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:ChargeAmount', itemNode);
181
+ const vatPercentage = this.getNumber('ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercent', itemNode);
182
+ // Create item object
183
+ items.push({
184
+ position: i + 1,
185
+ name: name,
186
+ articleNumber: articleNumber,
187
+ unitType: unitType,
188
+ unitQuantity: unitQuantity,
189
+ unitNetPrice: unitNetPrice,
190
+ vatPercentage: vatPercentage
191
+ });
192
+ }
193
+ }
194
+ return items;
195
+ }
196
+ /**
197
+ * Extracts notes from ZUGFeRD v1 XML
198
+ * @returns Array of notes
199
+ */
200
+ extractNotes() {
201
+ const notes = [];
202
+ // Get all note nodes
203
+ const noteNodes = this.select('//ram:IncludedNote', this.doc);
204
+ // Process each note
205
+ if (Array.isArray(noteNodes)) {
206
+ for (let i = 0; i < noteNodes.length; i++) {
207
+ const noteNode = noteNodes[i];
208
+ const noteText = this.getText('ram:Content', noteNode);
209
+ if (noteText) {
210
+ notes.push(noteText);
211
+ }
212
+ }
213
+ }
214
+ return notes;
215
+ }
216
+ /**
217
+ * Creates a default date for empty date fields
218
+ * @returns Default date object compatible with TContact
219
+ */
220
+ createDefaultDate() {
221
+ // Create a date object that will be compatible with TContact
222
+ return {
223
+ year: 2000,
224
+ month: 1,
225
+ day: 1
226
+ };
227
+ }
228
+ }
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVnZmVyZC52MS5kZWNvZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvZm9ybWF0cy9jaWkvenVnZmVyZC96dWdmZXJkLnYxLmRlY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFekU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsY0FBYztJQUNsRDs7OztPQUlHO0lBQ0gsWUFBWSxHQUFXLEVBQUUsaUJBQTBCLEtBQUs7UUFDdEQsS0FBSyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMzQixxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixHQUFHLEVBQUUscUJBQXFCLENBQUMsR0FBRztZQUM5QixHQUFHLEVBQUUscUJBQXFCLENBQUMsR0FBRztZQUM5QixHQUFHLEVBQUUscUJBQXFCLENBQUMsR0FBRztTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDOUIsMEJBQTBCO1FBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFbEQsNENBQTRDO1FBQzVDLE9BQU87WUFDTCxHQUFHLFVBQVU7WUFDYixpQkFBaUIsRUFBRSxZQUFxQjtTQUNmLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxlQUFlO1FBQzdCLDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIs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
@@ -0,0 +1,16 @@
1
+ import { CIIBaseValidator } from '../cii.validator.js';
2
+ /**
3
+ * Validator for ZUGFeRD invoice format
4
+ */
5
+ export declare class ZUGFeRDValidator extends CIIBaseValidator {
6
+ /**
7
+ * Validates ZUGFeRD XML structure
8
+ * @returns True if structure validation passed
9
+ */
10
+ protected validateStructure(): boolean;
11
+ /**
12
+ * Validates ZUGFeRD XML against business rules
13
+ * @returns True if business validation passed
14
+ */
15
+ protected validateBusinessRules(): boolean;
16
+ }
@@ -0,0 +1,29 @@
1
+ import { CIIBaseValidator } from '../cii.validator.js';
2
+ /**
3
+ * Validator for ZUGFeRD invoice format
4
+ */
5
+ export class ZUGFeRDValidator extends CIIBaseValidator {
6
+ /**
7
+ * Validates ZUGFeRD XML structure
8
+ * @returns True if structure validation passed
9
+ */
10
+ validateStructure() {
11
+ // Check for required elements in ZUGFeRD structure
12
+ const invoiceId = this.getText('//rsm:ExchangedDocument/ram:ID');
13
+ if (!invoiceId) {
14
+ this.addError('ZUGFERD-STRUCT-1', 'Invoice ID is required', '//rsm:ExchangedDocument/ram:ID');
15
+ return false;
16
+ }
17
+ return true;
18
+ }
19
+ /**
20
+ * Validates ZUGFeRD XML against business rules
21
+ * @returns True if business validation passed
22
+ */
23
+ validateBusinessRules() {
24
+ // Implement ZUGFeRD-specific business rules
25
+ // For now, we'll just use the base CII validation
26
+ return true;
27
+ }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienVnZmVyZC52YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9mb3JtYXRzL2NpaS96dWdmZXJkL3p1Z2ZlcmQudmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGdCQUFnQjtJQUNwRDs7O09BR0c7SUFDTyxpQkFBaUI7UUFDekIsbURBQW1EO1FBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLHdCQUF3QixFQUFFLGdDQUFnQyxDQUFDLENBQUM7WUFDOUYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08scUJBQXFCO1FBQzdCLDRDQUE0QztRQUM1QyxrREFBa0Q7UUFDbEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,15 @@
1
+ import { BaseDecoder } from './base.decoder.js';
2
+ /**
3
+ * Factory class for creating the appropriate decoder based on XML format.
4
+ * Analyzes XML content and returns the best decoder for the given format.
5
+ */
6
+ export declare class DecoderFactory {
7
+ /**
8
+ * Creates a decoder for the given XML content
9
+ */
10
+ static createDecoder(xmlString: string): BaseDecoder;
11
+ /**
12
+ * Detects the XML invoice format using string pattern matching
13
+ */
14
+ private static detectFormat;
15
+ }
@@ -0,0 +1,46 @@
1
+ import { BaseDecoder } from './base.decoder.js';
2
+ import { FacturXDecoder } from './facturx.decoder.js';
3
+ import { XInvoiceDecoder } from './xinvoice.decoder.js';
4
+ /**
5
+ * Factory class for creating the appropriate decoder based on XML format.
6
+ * Analyzes XML content and returns the best decoder for the given format.
7
+ */
8
+ export class DecoderFactory {
9
+ /**
10
+ * Creates a decoder for the given XML content
11
+ */
12
+ static createDecoder(xmlString) {
13
+ if (!xmlString) {
14
+ throw new Error('No XML string provided for decoder selection');
15
+ }
16
+ const format = DecoderFactory.detectFormat(xmlString);
17
+ switch (format) {
18
+ case 'XInvoice/UBL':
19
+ return new XInvoiceDecoder(xmlString);
20
+ case 'FacturX/ZUGFeRD':
21
+ default:
22
+ // Default to FacturX/ZUGFeRD decoder
23
+ return new FacturXDecoder(xmlString);
24
+ }
25
+ }
26
+ /**
27
+ * Detects the XML invoice format using string pattern matching
28
+ */
29
+ static detectFormat(xmlString) {
30
+ // XInvoice/UBL format
31
+ if (xmlString.includes('oasis:names:specification:ubl') ||
32
+ xmlString.includes('Invoice xmlns') ||
33
+ xmlString.includes('xrechnung')) {
34
+ return 'XInvoice/UBL';
35
+ }
36
+ // ZUGFeRD/Factur-X (CII format)
37
+ if (xmlString.includes('CrossIndustryInvoice') ||
38
+ xmlString.includes('un/cefact') ||
39
+ xmlString.includes('rsm:')) {
40
+ return 'FacturX/ZUGFeRD';
41
+ }
42
+ // Default to FacturX/ZUGFeRD
43
+ return 'FacturX/ZUGFeRD';
44
+ }
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2Rlci5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZm9ybWF0cy9kZWNvZGVyLmZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQzNDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV0RCxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxjQUFjO2dCQUNqQixPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXhDLEtBQUssaUJBQWlCLENBQUM7WUFDdkI7Z0JBQ0UscUNBQXFDO2dCQUNyQyxPQUFPLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQWlCO1FBQzNDLHNCQUFzQjtRQUN0QixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUM7WUFDbkQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFDbkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1lBQzFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMvQixPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,13 @@
1
+ import { BaseDecoder } from '../base/base.decoder.js';
2
+ /**
3
+ * Factory to create the appropriate decoder based on the XML format
4
+ */
5
+ export declare class DecoderFactory {
6
+ /**
7
+ * Creates a decoder for the specified XML content
8
+ * @param xml XML content to decode
9
+ * @param skipValidation Whether to skip EN16931 validation
10
+ * @returns Appropriate decoder instance
11
+ */
12
+ static createDecoder(xml: string, skipValidation?: boolean): BaseDecoder;
13
+ }
@@ -0,0 +1,56 @@
1
+ import { BaseDecoder } from '../base/base.decoder.js';
2
+ import { InvoiceFormat } from '../../interfaces/common.js';
3
+ import { FormatDetector } from '../utils/format.detector.js';
4
+ // Import specific decoders
5
+ import { XRechnungDecoder } from '../ubl/xrechnung/xrechnung.decoder.js';
6
+ import { FacturXDecoder } from '../cii/facturx/facturx.decoder.js';
7
+ import { ZUGFeRDDecoder } from '../cii/zugferd/zugferd.decoder.js';
8
+ import { ZUGFeRDV1Decoder } from '../cii/zugferd/zugferd.v1.decoder.js';
9
+ /**
10
+ * Factory to create the appropriate decoder based on the XML format
11
+ */
12
+ export class DecoderFactory {
13
+ /**
14
+ * Creates a decoder for the specified XML content
15
+ * @param xml XML content to decode
16
+ * @param skipValidation Whether to skip EN16931 validation
17
+ * @returns Appropriate decoder instance
18
+ */
19
+ static createDecoder(xml, skipValidation = false) {
20
+ const format = FormatDetector.detectFormat(xml);
21
+ switch (format) {
22
+ case InvoiceFormat.UBL:
23
+ case InvoiceFormat.XRECHNUNG:
24
+ return new XRechnungDecoder(xml, skipValidation);
25
+ case InvoiceFormat.CII:
26
+ // For now, use Factur-X decoder for generic CII
27
+ return new FacturXDecoder(xml, skipValidation);
28
+ case InvoiceFormat.ZUGFERD:
29
+ // Determine if it's ZUGFeRD v1 or v2 based on root element
30
+ if (xml.includes('CrossIndustryDocument') ||
31
+ xml.includes('urn:ferd:CrossIndustryDocument:invoice:1p0') ||
32
+ (xml.includes('ZUGFeRD') && !xml.includes('CrossIndustryInvoice'))) {
33
+ return new ZUGFeRDV1Decoder(xml, skipValidation);
34
+ }
35
+ else {
36
+ return new ZUGFeRDDecoder(xml, skipValidation);
37
+ }
38
+ case InvoiceFormat.FACTURX:
39
+ return new FacturXDecoder(xml, skipValidation);
40
+ case InvoiceFormat.FATTURAPA:
41
+ // return new FatturaPADecoder(xml);
42
+ throw new Error('FatturaPA decoder not yet implemented');
43
+ default:
44
+ // If format is unknown but contains CrossIndustryInvoice, try ZUGFeRD decoder
45
+ if (xml.includes('CrossIndustryInvoice')) {
46
+ return new ZUGFeRDDecoder(xml, skipValidation);
47
+ }
48
+ // If format is unknown but contains CrossIndustryDocument, try ZUGFeRD v1 decoder
49
+ if (xml.includes('CrossIndustryDocument')) {
50
+ return new ZUGFeRDV1Decoder(xml, skipValidation);
51
+ }
52
+ throw new Error(`Unsupported invoice format: ${format}`);
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2Rlci5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3JpZXMvZGVjb2Rlci5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXhFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQVcsRUFBRSxpQkFBMEIsS0FBSztRQUN0RSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWhELFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSyxhQUFhLENBQUMsU0FBUztnQkFDMUIsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUVuRCxLQUFLLGFBQWEsQ0FBQyxHQUFHO2dCQUNwQixnREFBZ0Q7Z0JBQ2hELE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRWpELEtBQUssYUFBYSxDQUFDLE9BQU87Z0JBQ3hCLDJEQUEyRDtnQkFDM0QsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO29CQUNyQyxHQUFHLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDO29CQUMxRCxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2RSxPQUFPLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFFSCxLQUFLLGFBQWEsQ0FBQyxPQUFPO2dCQUN4QixPQUFPLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUVqRCxLQUFLLGFBQWEsQ0FBQyxTQUFTO2dCQUMxQixvQ0FBb0M7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUUzRDtnQkFDRSw4RUFBOEU7Z0JBQzlFLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELGtGQUFrRjtnQkFDbEYsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,14 @@
1
+ import { BaseEncoder } from '../base/base.encoder.js';
2
+ import { InvoiceFormat } from '../../interfaces/common.js';
3
+ import type { ExportFormat } from '../../interfaces/common.js';
4
+ /**
5
+ * Factory to create the appropriate encoder based on the target format
6
+ */
7
+ export declare class EncoderFactory {
8
+ /**
9
+ * Creates an encoder for the specified format
10
+ * @param format Target format for encoding
11
+ * @returns Appropriate encoder instance
12
+ */
13
+ static createEncoder(format: ExportFormat | InvoiceFormat): BaseEncoder;
14
+ }
@@ -0,0 +1,40 @@
1
+ import { BaseEncoder } from '../base/base.encoder.js';
2
+ import { InvoiceFormat } from '../../interfaces/common.js';
3
+ // Import specific encoders
4
+ import { UBLEncoder } from '../ubl/generic/ubl.encoder.js';
5
+ import { XRechnungEncoder } from '../ubl/xrechnung/xrechnung.encoder.js';
6
+ import { FacturXEncoder } from '../cii/facturx/facturx.encoder.js';
7
+ import { ZUGFeRDEncoder } from '../cii/zugferd/zugferd.encoder.js';
8
+ /**
9
+ * Factory to create the appropriate encoder based on the target format
10
+ */
11
+ export class EncoderFactory {
12
+ /**
13
+ * Creates an encoder for the specified format
14
+ * @param format Target format for encoding
15
+ * @returns Appropriate encoder instance
16
+ */
17
+ static createEncoder(format) {
18
+ switch (format.toLowerCase()) {
19
+ case InvoiceFormat.UBL:
20
+ case 'ubl':
21
+ return new UBLEncoder();
22
+ case InvoiceFormat.XRECHNUNG:
23
+ case 'xrechnung':
24
+ return new XRechnungEncoder();
25
+ case InvoiceFormat.CII:
26
+ // For now, use Factur-X encoder for generic CII
27
+ return new FacturXEncoder();
28
+ case InvoiceFormat.ZUGFERD:
29
+ case 'zugferd':
30
+ // Use dedicated ZUGFeRD encoder
31
+ return new ZUGFeRDEncoder();
32
+ case InvoiceFormat.FACTURX:
33
+ case 'facturx':
34
+ return new FacturXEncoder();
35
+ default:
36
+ throw new Error(`Unsupported invoice format for encoding: ${format}`);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2Rlci5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZm9ybWF0cy9mYWN0b3JpZXMvZW5jb2Rlci5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHM0QsMkJBQTJCO0FBQzNCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBb0M7UUFDOUQsUUFBUSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUM3QixLQUFLLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUUxQixLQUFLLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFDN0IsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBRWhDLEtBQUssYUFBYSxDQUFDLEdBQUc7Z0JBQ3BCLGdEQUFnRDtnQkFDaEQsT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBRTlCLEtBQUssYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUMzQixLQUFLLFNBQVM7Z0JBQ1osZ0NBQWdDO2dCQUNoQyxPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7WUFFOUIsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQzNCLEtBQUssU0FBUztnQkFDWixPQUFPLElBQUksY0FBYyxFQUFFLENBQUM7WUFFOUI7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -0,0 +1,12 @@
1
+ import { BaseValidator } from '../base/base.validator.js';
2
+ /**
3
+ * Factory to create the appropriate validator based on the XML format
4
+ */
5
+ export declare class ValidatorFactory {
6
+ /**
7
+ * Creates a validator for the specified XML content
8
+ * @param xml XML content to validate
9
+ * @returns Appropriate validator instance
10
+ */
11
+ static createValidator(xml: string): BaseValidator;
12
+ }