@fin.cx/einvoice 5.0.2 → 5.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.
Files changed (116) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/einvoice.d.ts +4 -8
  3. package/dist_ts/einvoice.js +46 -7
  4. package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
  5. package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
  6. package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
  7. package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
  8. package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
  9. package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
  10. package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
  11. package/dist_ts/formats/semantic/semantic.validator.js +596 -0
  12. package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
  13. package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
  14. package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
  15. package/dist_ts/formats/utils/currency.utils.js +250 -0
  16. package/dist_ts/formats/utils/decimal.d.ts +151 -0
  17. package/dist_ts/formats/utils/decimal.js +435 -0
  18. package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
  19. package/dist_ts/formats/validation/codelist.validator.js +188 -0
  20. package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
  21. package/dist_ts/formats/validation/conformance.harness.js +471 -0
  22. package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
  23. package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
  24. package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
  25. package/dist_ts/formats/validation/facturx.validator.js +522 -0
  26. package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
  27. package/dist_ts/formats/validation/integrated.validator.js +311 -0
  28. package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
  29. package/dist_ts/formats/validation/peppol.validator.js +529 -0
  30. package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
  31. package/dist_ts/formats/validation/schematron.downloader.js +254 -0
  32. package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
  33. package/dist_ts/formats/validation/schematron.integration.js +230 -0
  34. package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
  35. package/dist_ts/formats/validation/schematron.validator.js +288 -0
  36. package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
  37. package/dist_ts/formats/validation/schematron.worker.js +185 -0
  38. package/dist_ts/formats/validation/validation.types.d.ts +163 -0
  39. package/dist_ts/formats/validation/validation.types.js +181 -0
  40. package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
  41. package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
  42. package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
  43. package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
  44. package/dist_ts/interfaces/common.d.ts +1 -0
  45. package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
  46. package/dist_ts/interfaces/en16931-metadata.js +6 -0
  47. package/dist_ts/plugins.d.ts +3 -1
  48. package/dist_ts/plugins.js +7 -2
  49. package/dist_ts_install/download-schematron.d.ts +6 -0
  50. package/dist_ts_install/download-schematron.js +62 -0
  51. package/dist_ts_install/download-test-samples.d.ts +19 -0
  52. package/dist_ts_install/download-test-samples.js +169 -0
  53. package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
  54. package/dist_ts_install/download-xrechnung-rules.js +146 -0
  55. package/dist_ts_install/index.d.ts +8 -0
  56. package/dist_ts_install/index.js +246 -0
  57. package/package.json +13 -8
  58. package/readme.md +255 -810
  59. package/ts/00_commitinfo_data.ts +1 -1
  60. package/ts/einvoice.ts +63 -14
  61. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  62. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  63. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  64. package/ts/formats/semantic/semantic.validator.ts +654 -0
  65. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  66. package/ts/formats/utils/currency.utils.ts +299 -0
  67. package/ts/formats/utils/decimal.ts +509 -0
  68. package/ts/formats/validation/codelist.validator.ts +317 -0
  69. package/ts/formats/validation/conformance.harness.ts +591 -0
  70. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  71. package/ts/formats/validation/facturx.validator.ts +579 -0
  72. package/ts/formats/validation/integrated.validator.ts +405 -0
  73. package/ts/formats/validation/peppol.validator.ts +589 -0
  74. package/ts/formats/validation/schematron.downloader.ts +304 -0
  75. package/ts/formats/validation/schematron.integration.ts +285 -0
  76. package/ts/formats/validation/schematron.validator.ts +348 -0
  77. package/ts/formats/validation/schematron.worker.ts +221 -0
  78. package/ts/formats/validation/validation.types.ts +274 -0
  79. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  80. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  81. package/ts/interfaces/common.ts +1 -0
  82. package/ts/interfaces/en16931-metadata.ts +104 -0
  83. package/ts/plugins.ts +8 -0
  84. package/ts/tspublish.json +3 -0
  85. package/dist_ts/classes.decoder.d.ts +0 -40
  86. package/dist_ts/classes.decoder.js +0 -320
  87. package/dist_ts/classes.encoder.d.ts +0 -51
  88. package/dist_ts/classes.encoder.js +0 -293
  89. package/dist_ts/classes.xinvoice.d.ts +0 -136
  90. package/dist_ts/classes.xinvoice.js +0 -352
  91. package/dist_ts/formats/base.decoder.d.ts +0 -19
  92. package/dist_ts/formats/base.decoder.js +0 -130
  93. package/dist_ts/formats/base.validator.d.ts +0 -44
  94. package/dist_ts/formats/base.validator.js +0 -39
  95. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  96. package/dist_ts/formats/decoder.factory.js +0 -46
  97. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  98. package/dist_ts/formats/factorx.decoder.js +0 -178
  99. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  100. package/dist_ts/formats/factorx.encoder.js +0 -293
  101. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  102. package/dist_ts/formats/facturx.decoder.js +0 -210
  103. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  104. package/dist_ts/formats/facturx.encoder.js +0 -293
  105. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  106. package/dist_ts/formats/facturx.validator.js +0 -266
  107. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  109. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  110. package/dist_ts/formats/ubl.validator.js +0 -306
  111. package/dist_ts/formats/validator.factory.d.ts +0 -18
  112. package/dist_ts/formats/validator.factory.js +0 -78
  113. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  114. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  115. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  116. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Download official EN16931 and PEPPOL test samples for conformance testing
4
+ */
5
+ interface TestSampleSource {
6
+ name: string;
7
+ description: string;
8
+ repository: string;
9
+ branch: string;
10
+ paths: string[];
11
+ targetDir: string;
12
+ }
13
+ declare const TEST_SAMPLE_SOURCES: TestSampleSource[];
14
+ /**
15
+ * Main function
16
+ */
17
+ declare function main(): Promise<void>;
18
+ export default main;
19
+ export { TEST_SAMPLE_SOURCES };
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Download official EN16931 and PEPPOL test samples for conformance testing
4
+ */
5
+ import * as https from 'https';
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import { createWriteStream } from 'fs';
9
+ import { pipeline } from 'stream/promises';
10
+ import { fileURLToPath } from 'url';
11
+ const TEST_SAMPLE_SOURCES = [
12
+ {
13
+ name: 'PEPPOL BIS 3.0 Examples',
14
+ description: 'Official PEPPOL BIS Billing 3.0 example files',
15
+ repository: 'OpenPEPPOL/peppol-bis-invoice-3',
16
+ branch: 'master',
17
+ paths: [
18
+ 'rules/examples/Allowance-example.xml',
19
+ 'rules/examples/base-example.xml',
20
+ 'rules/examples/base-negative-inv-correction.xml',
21
+ 'rules/examples/vat-category-E.xml',
22
+ 'rules/examples/vat-category-O.xml',
23
+ 'rules/examples/vat-category-S.xml',
24
+ 'rules/examples/vat-category-Z.xml',
25
+ 'rules/examples/vat-category-AE.xml',
26
+ 'rules/examples/vat-category-K.xml',
27
+ 'rules/examples/vat-category-G.xml'
28
+ ],
29
+ targetDir: 'peppol-bis3'
30
+ },
31
+ {
32
+ name: 'CEN TC434 Test Files',
33
+ description: 'European Committee for Standardization test files',
34
+ repository: 'ConnectingEurope/eInvoicing-EN16931',
35
+ branch: 'master',
36
+ paths: [
37
+ 'ubl/examples/ubl-tc434-example1.xml',
38
+ 'ubl/examples/ubl-tc434-example2.xml',
39
+ 'ubl/examples/ubl-tc434-example3.xml',
40
+ 'ubl/examples/ubl-tc434-example4.xml',
41
+ 'ubl/examples/ubl-tc434-example5.xml',
42
+ 'ubl/examples/ubl-tc434-example6.xml',
43
+ 'ubl/examples/ubl-tc434-example7.xml',
44
+ 'ubl/examples/ubl-tc434-example8.xml',
45
+ 'ubl/examples/ubl-tc434-example9.xml',
46
+ 'cii/examples/cii-tc434-example1.xml',
47
+ 'cii/examples/cii-tc434-example2.xml',
48
+ 'cii/examples/cii-tc434-example3.xml',
49
+ 'cii/examples/cii-tc434-example4.xml',
50
+ 'cii/examples/cii-tc434-example5.xml',
51
+ 'cii/examples/cii-tc434-example6.xml',
52
+ 'cii/examples/cii-tc434-example7.xml',
53
+ 'cii/examples/cii-tc434-example8.xml',
54
+ 'cii/examples/cii-tc434-example9.xml'
55
+ ],
56
+ targetDir: 'cen-tc434'
57
+ },
58
+ {
59
+ name: 'PEPPOL Validation Artifacts',
60
+ description: 'PEPPOL validation test files',
61
+ repository: 'OpenPEPPOL/peppol-bis-invoice-3',
62
+ branch: 'master',
63
+ paths: [
64
+ 'rules/unit-UBL/PEPPOL-EN16931-UBL.xml'
65
+ ],
66
+ targetDir: 'peppol-validation'
67
+ }
68
+ ];
69
+ /**
70
+ * Download a file from GitHub
71
+ */
72
+ async function downloadFile(repo, branch, filePath, targetPath) {
73
+ const url = `https://raw.githubusercontent.com/${repo}/${branch}/${filePath}`;
74
+ return new Promise((resolve, reject) => {
75
+ https.get(url, (response) => {
76
+ if (response.statusCode === 404) {
77
+ console.warn(` ⚠️ File not found: ${filePath}`);
78
+ resolve();
79
+ return;
80
+ }
81
+ if (response.statusCode !== 200) {
82
+ reject(new Error(`Failed to download ${url}: ${response.statusCode}`));
83
+ return;
84
+ }
85
+ const dir = path.dirname(targetPath);
86
+ if (!fs.existsSync(dir)) {
87
+ fs.mkdirSync(dir, { recursive: true });
88
+ }
89
+ const file = createWriteStream(targetPath);
90
+ response.pipe(file);
91
+ file.on('finish', () => {
92
+ file.close();
93
+ console.log(` ✅ Downloaded: ${path.basename(filePath)}`);
94
+ resolve();
95
+ });
96
+ file.on('error', (err) => {
97
+ fs.unlink(targetPath, () => { }); // Delete incomplete file
98
+ reject(err);
99
+ });
100
+ }).on('error', reject);
101
+ });
102
+ }
103
+ /**
104
+ * Download test samples from a source
105
+ */
106
+ async function downloadTestSamples(source) {
107
+ console.log(`\n📦 ${source.name}`);
108
+ console.log(` ${source.description}`);
109
+ console.log(` Repository: ${source.repository}`);
110
+ const baseDir = path.join('test-samples', source.targetDir);
111
+ for (const filePath of source.paths) {
112
+ const fileName = path.basename(filePath);
113
+ const targetPath = path.join(baseDir, fileName);
114
+ try {
115
+ await downloadFile(source.repository, source.branch, filePath, targetPath);
116
+ }
117
+ catch (error) {
118
+ console.error(` ❌ Error downloading ${fileName}: ${error.message}`);
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Create metadata file for downloaded samples
124
+ */
125
+ function createMetadata(sources) {
126
+ const metadata = {
127
+ downloadDate: new Date().toISOString(),
128
+ sources: sources.map(s => ({
129
+ name: s.name,
130
+ repository: s.repository,
131
+ branch: s.branch,
132
+ fileCount: s.paths.length
133
+ })),
134
+ totalFiles: sources.reduce((sum, s) => sum + s.paths.length, 0)
135
+ };
136
+ const metadataPath = path.join('test-samples', 'metadata.json');
137
+ fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2));
138
+ console.log('\n📝 Created metadata.json');
139
+ }
140
+ /**
141
+ * Main function
142
+ */
143
+ async function main() {
144
+ console.log('🚀 Downloading official EN16931 test samples...\n');
145
+ // Create base directory
146
+ if (!fs.existsSync('test-samples')) {
147
+ fs.mkdirSync('test-samples');
148
+ }
149
+ // Download samples from each source
150
+ for (const source of TEST_SAMPLE_SOURCES) {
151
+ await downloadTestSamples(source);
152
+ }
153
+ // Create metadata file
154
+ createMetadata(TEST_SAMPLE_SOURCES);
155
+ console.log('\n✨ Test sample download complete!');
156
+ console.log('📁 Samples saved to: test-samples/');
157
+ // Count total files
158
+ const totalFiles = TEST_SAMPLE_SOURCES.reduce((sum, s) => sum + s.paths.length, 0);
159
+ console.log(`📊 Total files: ${totalFiles}`);
160
+ }
161
+ // Run if executed directly
162
+ const __filename = fileURLToPath(import.meta.url);
163
+ const __dirname = path.dirname(__filename);
164
+ if (import.meta.url === `file://${process.argv[1]}`) {
165
+ main().catch(console.error);
166
+ }
167
+ export default main;
168
+ export { TEST_SAMPLE_SOURCES };
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtdGVzdC1zYW1wbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfaW5zdGFsbC9kb3dubG9hZC10ZXN0LXNhbXBsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBOztHQUVHO0FBRUgsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBV3BDLE1BQU0sbUJBQW1CLEdBQXVCO0lBQzlDO1FBQ0UsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixXQUFXLEVBQUUsK0NBQStDO1FBQzVELFVBQVUsRUFBRSxpQ0FBaUM7UUFDN0MsTUFBTSxFQUFFLFFBQVE7UUFDaEIsS0FBSyxFQUFFO1lBQ0wsc0NBQXNDO1lBQ3RDLGlDQUFpQztZQUNqQyxpREFBaUQ7WUFDakQsbUNBQW1DO1lBQ25DLG1DQUFtQztZQUNuQyxtQ0FBbUM7WUFDbkMsbUNBQW1DO1lBQ25DLG9DQUFvQztZQUNwQyxtQ0FBbUM7WUFDbkMsbUNBQW1DO1NBQ3BDO1FBQ0QsU0FBUyxFQUFFLGFBQWE7S0FDekI7SUFDRDtRQUNFLElBQUksRUFBRSxzQkFBc0I7UUFDNUIsV0FBVyxFQUFFLG1EQUFtRDtRQUNoRSxVQUFVLEVBQUUscUNBQXFDO1FBQ2pELE1BQU0sRUFBRSxRQUFRO1FBQ2hCLEtBQUssRUFBRTtZQUNMLHFDQUFxQztZQUNyQyxxQ0FBcUM7WUFDckMscUNBQXFDO1lBQ3JDLHFDQUFxQztZQUNyQyxxQ0FBcUM7WUFDckMscUNBQXFDO1lBQ3JDLHFDQUFxQztZQUNyQyxxQ0FBcUM7WUFDckMs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
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Downloads official XRechnung Schematron validation rules
4
+ * from the KoSIT repositories
5
+ */
6
+ declare function downloadXRechnungRules(): Promise<void>;
7
+ export default downloadXRechnungRules;
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Downloads official XRechnung Schematron validation rules
4
+ * from the KoSIT repositories
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import { execSync } from 'child_process';
9
+ const XRECHNUNG_VERSION = '3.0.2'; // Latest version as of 2025
10
+ const VALIDATOR_VERSION = '2025-07-31'; // Next release date
11
+ const REPOS = {
12
+ schematron: {
13
+ url: 'https://github.com/itplr-kosit/xrechnung-schematron/archive/refs/tags/release-3.0.2.zip',
14
+ dir: 'xrechnung-schematron'
15
+ },
16
+ validator: {
17
+ url: 'https://github.com/itplr-kosit/validator-configuration-xrechnung/releases/download/release-2024-07-31/validator-configuration-xrechnung_3.0.1_2024-07-31.zip',
18
+ dir: 'xrechnung-validator'
19
+ }
20
+ };
21
+ const ASSETS_DIR = path.join(process.cwd(), 'assets', 'schematron', 'xrechnung');
22
+ async function downloadFile(url, destination) {
23
+ console.log(`Downloading ${url}...`);
24
+ try {
25
+ // Use curl to download the file
26
+ execSync(`curl -L -o "${destination}" "${url}"`, { stdio: 'inherit' });
27
+ console.log(`Downloaded to ${destination}`);
28
+ }
29
+ catch (error) {
30
+ console.error(`Failed to download ${url}:`, error);
31
+ throw error;
32
+ }
33
+ }
34
+ async function extractZip(zipFile, destination) {
35
+ console.log(`Extracting ${zipFile}...`);
36
+ try {
37
+ // Create destination directory if it doesn't exist
38
+ fs.mkdirSync(destination, { recursive: true });
39
+ // Extract using unzip
40
+ execSync(`unzip -o "${zipFile}" -d "${destination}"`, { stdio: 'inherit' });
41
+ console.log(`Extracted to ${destination}`);
42
+ }
43
+ catch (error) {
44
+ console.error(`Failed to extract ${zipFile}:`, error);
45
+ throw error;
46
+ }
47
+ }
48
+ async function downloadXRechnungRules() {
49
+ console.log('Starting XRechnung Schematron rules download...\n');
50
+ // Create assets directory
51
+ fs.mkdirSync(ASSETS_DIR, { recursive: true });
52
+ const tempDir = path.join(ASSETS_DIR, 'temp');
53
+ fs.mkdirSync(tempDir, { recursive: true });
54
+ // Download and extract Schematron rules
55
+ console.log('1. Downloading XRechnung Schematron rules...');
56
+ const schematronZip = path.join(tempDir, 'xrechnung-schematron.zip');
57
+ await downloadFile(REPOS.schematron.url, schematronZip);
58
+ const schematronDir = path.join(ASSETS_DIR, REPOS.schematron.dir);
59
+ await extractZip(schematronZip, schematronDir);
60
+ // Find the actual Schematron files
61
+ const schematronExtractedDir = path.join(schematronDir, `xrechnung-schematron-release-${XRECHNUNG_VERSION}`);
62
+ const schematronValidationDir = path.join(schematronExtractedDir, 'validation', 'schematron');
63
+ if (fs.existsSync(schematronValidationDir)) {
64
+ console.log('\nFound Schematron validation files:');
65
+ // List UBL Schematron files
66
+ const ublDir = path.join(schematronValidationDir, 'ubl-inv');
67
+ if (fs.existsSync(ublDir)) {
68
+ const ublFiles = fs.readdirSync(ublDir).filter(f => f.endsWith('.sch') || f.endsWith('.xsl'));
69
+ console.log(' UBL Invoice Schematron:', ublFiles.join(', '));
70
+ }
71
+ // List CII Schematron files
72
+ const ciiDir = path.join(schematronValidationDir, 'cii');
73
+ if (fs.existsSync(ciiDir)) {
74
+ const ciiFiles = fs.readdirSync(ciiDir).filter(f => f.endsWith('.sch') || f.endsWith('.xsl'));
75
+ console.log(' CII Schematron:', ciiFiles.join(', '));
76
+ }
77
+ // Copy to final location
78
+ const finalUblDir = path.join(ASSETS_DIR, 'ubl');
79
+ const finalCiiDir = path.join(ASSETS_DIR, 'cii');
80
+ fs.mkdirSync(finalUblDir, { recursive: true });
81
+ fs.mkdirSync(finalCiiDir, { recursive: true });
82
+ // Copy UBL files
83
+ if (fs.existsSync(ublDir)) {
84
+ const ublFiles = fs.readdirSync(ublDir);
85
+ for (const file of ublFiles) {
86
+ if (file.endsWith('.sch') || file.endsWith('.xsl')) {
87
+ fs.copyFileSync(path.join(ublDir, file), path.join(finalUblDir, file));
88
+ }
89
+ }
90
+ console.log(`\nCopied UBL Schematron files to ${finalUblDir}`);
91
+ }
92
+ // Copy CII files
93
+ if (fs.existsSync(ciiDir)) {
94
+ const ciiFiles = fs.readdirSync(ciiDir);
95
+ for (const file of ciiFiles) {
96
+ if (file.endsWith('.sch') || file.endsWith('.xsl')) {
97
+ fs.copyFileSync(path.join(ciiDir, file), path.join(finalCiiDir, file));
98
+ }
99
+ }
100
+ console.log(`Copied CII Schematron files to ${finalCiiDir}`);
101
+ }
102
+ }
103
+ // Download validator configuration (contains additional rules and scenarios)
104
+ console.log('\n2. Downloading XRechnung validator configuration...');
105
+ const validatorZip = path.join(tempDir, 'xrechnung-validator.zip');
106
+ await downloadFile(REPOS.validator.url, validatorZip);
107
+ const validatorDir = path.join(ASSETS_DIR, REPOS.validator.dir);
108
+ await extractZip(validatorZip, validatorDir);
109
+ // Create metadata file
110
+ const metadata = {
111
+ version: XRECHNUNG_VERSION,
112
+ validatorVersion: VALIDATOR_VERSION,
113
+ downloadDate: new Date().toISOString(),
114
+ sources: {
115
+ schematron: REPOS.schematron.url,
116
+ validator: REPOS.validator.url
117
+ },
118
+ files: {
119
+ ubl: fs.existsSync(path.join(ASSETS_DIR, 'ubl'))
120
+ ? fs.readdirSync(path.join(ASSETS_DIR, 'ubl')).filter(f => f.endsWith('.sch'))
121
+ : [],
122
+ cii: fs.existsSync(path.join(ASSETS_DIR, 'cii'))
123
+ ? fs.readdirSync(path.join(ASSETS_DIR, 'cii')).filter(f => f.endsWith('.sch'))
124
+ : []
125
+ }
126
+ };
127
+ fs.writeFileSync(path.join(ASSETS_DIR, 'metadata.json'), JSON.stringify(metadata, null, 2));
128
+ // Clean up temp directory
129
+ console.log('\n3. Cleaning up...');
130
+ fs.rmSync(tempDir, { recursive: true, force: true });
131
+ console.log('\n✅ XRechnung Schematron rules downloaded successfully!');
132
+ console.log(`📁 Files are located in: ${ASSETS_DIR}`);
133
+ console.log('\nNext steps:');
134
+ console.log('1. Run Saxon-JS to compile .sch files to SEF format');
135
+ console.log('2. Integrate with SchematronValidator');
136
+ console.log('3. Add XRechnung-specific TypeScript validators');
137
+ }
138
+ // Run if executed directly
139
+ if (import.meta.url === `file://${process.argv[1]}`) {
140
+ downloadXRechnungRules().catch(error => {
141
+ console.error('Failed to download XRechnung rules:', error);
142
+ process.exit(1);
143
+ });
144
+ }
145
+ export default downloadXRechnungRules;
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQteHJlY2hudW5nLXJ1bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfaW5zdGFsbC9kb3dubG9hZC14cmVjaG51bmctcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBOzs7R0FHRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsQ0FBQyw0QkFBNEI7QUFDL0QsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsQ0FBQyxvQkFBb0I7QUFFNUQsTUFBTSxLQUFLLEdBQUc7SUFDWixVQUFVLEVBQUU7UUFDVixHQUFHLEVBQUUseUZBQXlGO1FBQzlGLEdBQUcsRUFBRSxzQkFBc0I7S0FDNUI7SUFDRCxTQUFTLEVBQUU7UUFDVCxHQUFHLEVBQUUsOEpBQThKO1FBQ25LLEdBQUcsRUFBRSxxQkFBcUI7S0FDM0I7Q0FDRixDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUVqRixLQUFLLFVBQVUsWUFBWSxDQUFDLEdBQVcsRUFBRSxXQUFtQjtJQUMxRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUVyQyxJQUFJLENBQUM7UUFDSCxnQ0FBZ0M7UUFDaEMsUUFBUSxDQUFDLGVBQWUsV0FBVyxNQUFNLEdBQUcsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQUMsT0FBTyxL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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Post-install script to download required validation resources
4
+ * This script is automatically run after npm/pnpm install
5
+ * All users need validation capabilities, so this is mandatory
6
+ */
7
+ declare function main(): Promise<void>;
8
+ export default main;
@@ -0,0 +1,246 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Post-install script to download required validation resources
4
+ * This script is automatically run after npm/pnpm install
5
+ * All users need validation capabilities, so this is mandatory
6
+ */
7
+ import { SchematronDownloader } from '../dist_ts/formats/validation/schematron.downloader.js';
8
+ import * as path from 'path';
9
+ import * as fs from 'fs';
10
+ import * as crypto from 'crypto';
11
+ // Version for cache invalidation
12
+ const RESOURCES_VERSION = '1.0.0';
13
+ /**
14
+ * Check if we're in a proper npm install context
15
+ */
16
+ function isValidInstallContext() {
17
+ // Skip if we're in a git install or similar
18
+ if (process.env.npm_lifecycle_event !== 'postinstall') {
19
+ return false;
20
+ }
21
+ // Skip in CI if explicitly disabled
22
+ if (process.env.CI && process.env.EINVOICE_SKIP_RESOURCES) {
23
+ console.log('⏭️ Skipping resource download (EINVOICE_SKIP_RESOURCES set)');
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+ /**
29
+ * Create a checksum for a file
30
+ */
31
+ function getFileChecksum(filePath) {
32
+ try {
33
+ if (!fs.existsSync(filePath))
34
+ return null;
35
+ const content = fs.readFileSync(filePath);
36
+ return crypto.createHash('sha256').update(content).digest('hex');
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /**
43
+ * Check if resources are already downloaded and valid
44
+ */
45
+ function checkExistingResources() {
46
+ const versionFile = path.join('assets_downloaded', 'schematron', '.version');
47
+ try {
48
+ if (!fs.existsSync(versionFile))
49
+ return false;
50
+ const version = fs.readFileSync(versionFile, 'utf-8').trim();
51
+ if (version !== RESOURCES_VERSION) {
52
+ console.log('📦 Resource version mismatch, re-downloading...');
53
+ return false;
54
+ }
55
+ // Check if key files exist
56
+ const keyFiles = [
57
+ 'assets_downloaded/schematron/EN16931-UBL-v1.3.14.sch',
58
+ 'assets_downloaded/schematron/EN16931-CII-v1.3.14.sch',
59
+ 'assets_downloaded/schematron/PEPPOL-EN16931-UBL-v3.0.17.sch'
60
+ ];
61
+ for (const file of keyFiles) {
62
+ if (!fs.existsSync(file)) {
63
+ console.log(`📦 Missing ${file}, re-downloading resources...`);
64
+ return false;
65
+ }
66
+ }
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ /**
74
+ * Save version file after successful download
75
+ */
76
+ function saveVersionFile() {
77
+ const versionFile = path.join('assets_downloaded', 'schematron', '.version');
78
+ try {
79
+ fs.mkdirSync(path.dirname(versionFile), { recursive: true });
80
+ fs.writeFileSync(versionFile, RESOURCES_VERSION);
81
+ }
82
+ catch (error) {
83
+ console.warn('⚠️ Could not save version file:', error.message);
84
+ }
85
+ }
86
+ async function downloadSchematron() {
87
+ console.log('📥 Downloading Schematron validation files...\n');
88
+ const downloader = new SchematronDownloader('assets_downloaded/schematron');
89
+ await downloader.initialize();
90
+ let successCount = 0;
91
+ let failCount = 0;
92
+ // Download EN16931 Schematron files
93
+ console.log('🔵 Downloading EN16931 Schematron files...');
94
+ try {
95
+ const en16931Files = await downloader.downloadStandard('EN16931');
96
+ console.log(`✅ Downloaded ${en16931Files.length} EN16931 files`);
97
+ successCount += en16931Files.length;
98
+ }
99
+ catch (error) {
100
+ console.error(`⚠️ Failed to download EN16931: ${error.message}`);
101
+ failCount++;
102
+ }
103
+ // Download PEPPOL Schematron files
104
+ console.log('\n🔵 Downloading PEPPOL Schematron files...');
105
+ try {
106
+ const peppolFiles = await downloader.downloadStandard('PEPPOL');
107
+ console.log(`✅ Downloaded ${peppolFiles.length} PEPPOL files`);
108
+ successCount += peppolFiles.length;
109
+ }
110
+ catch (error) {
111
+ console.error(`⚠️ Failed to download PEPPOL: ${error.message}`);
112
+ failCount++;
113
+ }
114
+ // Download XRechnung Schematron files
115
+ console.log('\n🔵 Downloading XRechnung Schematron files...');
116
+ try {
117
+ const xrechnungFiles = await downloader.downloadStandard('XRECHNUNG');
118
+ console.log(`✅ Downloaded ${xrechnungFiles.length} XRechnung files`);
119
+ successCount += xrechnungFiles.length;
120
+ }
121
+ catch (error) {
122
+ console.error(`⚠️ Failed to download XRechnung: ${error.message}`);
123
+ failCount++;
124
+ }
125
+ // Report results
126
+ if (successCount > 0) {
127
+ saveVersionFile();
128
+ console.log(`\n✅ Successfully downloaded ${successCount} validation files`);
129
+ }
130
+ if (failCount > 0) {
131
+ console.log(`⚠️ Failed to download ${failCount} resource sets`);
132
+ console.log(' Some validation features may be limited');
133
+ }
134
+ return { successCount, failCount };
135
+ }
136
+ async function main() {
137
+ // Check if we should run
138
+ if (!isValidInstallContext()) {
139
+ return;
140
+ }
141
+ console.log('='.repeat(60));
142
+ console.log('🚀 @fin.cx/einvoice - Validation Resources Setup');
143
+ console.log('='.repeat(60));
144
+ console.log();
145
+ try {
146
+ // Check if resources already exist and are current
147
+ if (checkExistingResources()) {
148
+ console.log('✅ Validation resources already installed and up-to-date');
149
+ console.log();
150
+ return;
151
+ }
152
+ // Check if we're in the right directory
153
+ const packageJsonPath = path.join(process.cwd(), 'package.json');
154
+ if (!fs.existsSync(packageJsonPath)) {
155
+ console.error('❌ Error: package.json not found');
156
+ console.error(' Installation context issue - skipping resource download');
157
+ return;
158
+ }
159
+ // Check if dist_ts exists (module should be built)
160
+ const distPath = path.join(process.cwd(), 'dist_ts');
161
+ if (!fs.existsSync(distPath)) {
162
+ console.log('⚠️ Module not yet built - skipping resource download');
163
+ console.log(' Resources will be downloaded on first use');
164
+ return;
165
+ }
166
+ // Check network connectivity (simple DNS check)
167
+ try {
168
+ await import('dns').then(dns => new Promise((resolve, reject) => {
169
+ dns.lookup('github.com', (err) => {
170
+ if (err)
171
+ reject(err);
172
+ else
173
+ resolve(true);
174
+ });
175
+ }));
176
+ }
177
+ catch {
178
+ console.log('⚠️ No network connectivity detected');
179
+ console.log(' Validation resources will be downloaded on first use');
180
+ console.log(' when network is available');
181
+ return;
182
+ }
183
+ // Download resources with retry logic
184
+ let attempts = 0;
185
+ const maxAttempts = 3;
186
+ let lastError;
187
+ while (attempts < maxAttempts) {
188
+ attempts++;
189
+ if (attempts > 1) {
190
+ console.log(`\n🔄 Retry attempt ${attempts}/${maxAttempts}...`);
191
+ }
192
+ try {
193
+ const { successCount, failCount } = await downloadSchematron();
194
+ if (successCount > 0) {
195
+ console.log();
196
+ console.log('='.repeat(60));
197
+ console.log('✅ Validation resources installed successfully!');
198
+ console.log('='.repeat(60));
199
+ console.log();
200
+ return;
201
+ }
202
+ if (failCount > 0 && attempts < maxAttempts) {
203
+ console.log(`\n⚠️ Some downloads failed, retrying...`);
204
+ await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2s before retry
205
+ continue;
206
+ }
207
+ break;
208
+ }
209
+ catch (error) {
210
+ lastError = error;
211
+ if (attempts < maxAttempts) {
212
+ console.log(`\n⚠️ Download failed: ${error.message}`);
213
+ console.log(' Retrying...');
214
+ await new Promise(resolve => setTimeout(resolve, 3000)); // Wait 3s before retry
215
+ }
216
+ }
217
+ }
218
+ // If we get here, downloads failed after retries
219
+ console.error();
220
+ console.error('⚠️ Could not download all validation resources');
221
+ console.error(' The library will work but validation features may be limited');
222
+ console.error(' Resources will be attempted again on first use');
223
+ console.error();
224
+ if (lastError) {
225
+ console.error(' Last error:', lastError.message);
226
+ }
227
+ }
228
+ catch (error) {
229
+ // Catch-all for unexpected errors
230
+ console.error();
231
+ console.error('⚠️ Unexpected error during resource setup:', error.message);
232
+ console.error(' This won\'t affect library installation');
233
+ console.error(' Resources will be downloaded on first use');
234
+ console.error();
235
+ }
236
+ }
237
+ // Only run if this is the main module
238
+ if (import.meta.url === `file://${process.argv[1]}`) {
239
+ main().catch(error => {
240
+ console.error('⚠️ Resource setup error:', error.message);
241
+ // Never fail the install
242
+ process.exit(0);
243
+ });
244
+ }
245
+ export default main;
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbnN0YWxsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFDOUYsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFakMsaUNBQWlDO0FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBRWxDOztHQUVHO0FBQ0gsU0FBUyxxQkFBcUI7SUFDNUIsNENBQTRDO0lBQzVDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxhQUFhLEVBQUUsQ0FBQztRQUN0RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsUUFBZ0I7SUFDdkMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxL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