@fin.cx/opendata 4.6.0 → 4.8.0

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 (67) hide show
  1. package/.smartconfig.json +6 -2
  2. package/dist_ts/00_commitinfo_data.js +3 -3
  3. package/dist_ts/financialstatements/amounts.d.ts +58 -0
  4. package/dist_ts/financialstatements/amounts.js +130 -0
  5. package/dist_ts/financialstatements/classes.financialstatementerror.d.ts +24 -0
  6. package/dist_ts/financialstatements/classes.financialstatementerror.js +10 -0
  7. package/dist_ts/financialstatements/constants.d.ts +16 -0
  8. package/dist_ts/financialstatements/constants.js +20 -0
  9. package/dist_ts/financialstatements/dates.d.ts +16 -0
  10. package/dist_ts/financialstatements/dates.js +72 -0
  11. package/dist_ts/financialstatements/html.d.ts +21 -0
  12. package/dist_ts/financialstatements/html.js +92 -0
  13. package/dist_ts/financialstatements/index.d.ts +6 -0
  14. package/dist_ts/financialstatements/index.js +11 -0
  15. package/dist_ts/financialstatements/interfaces.d.ts +258 -0
  16. package/dist_ts/financialstatements/interfaces.js +2 -0
  17. package/dist_ts/financialstatements/layout.d.ts +20 -0
  18. package/dist_ts/financialstatements/layout.html.d.ts +8 -0
  19. package/dist_ts/financialstatements/layout.html.js +125 -0
  20. package/dist_ts/financialstatements/layout.js +2 -0
  21. package/dist_ts/financialstatements/layout.pdf.d.ts +6 -0
  22. package/dist_ts/financialstatements/layout.pdf.js +229 -0
  23. package/dist_ts/financialstatements/mediatypes.d.ts +3 -0
  24. package/dist_ts/financialstatements/mediatypes.js +11 -0
  25. package/dist_ts/financialstatements/outline.d.ts +22 -0
  26. package/dist_ts/financialstatements/outline.js +26 -0
  27. package/dist_ts/financialstatements/parse.esef.d.ts +13 -0
  28. package/dist_ts/financialstatements/parse.esef.js +349 -0
  29. package/dist_ts/financialstatements/parse.hgb.d.ts +9 -0
  30. package/dist_ts/financialstatements/parse.hgb.js +1014 -0
  31. package/dist_ts/financialstatements/parse.statement.d.ts +8 -0
  32. package/dist_ts/financialstatements/parse.statement.js +25 -0
  33. package/dist_ts/financialstatements/plugins.d.ts +10 -0
  34. package/dist_ts/financialstatements/plugins.js +15 -0
  35. package/dist_ts/financialstatements/read.d.ts +10 -0
  36. package/dist_ts/financialstatements/read.js +113 -0
  37. package/dist_ts/handelsregister/classes.handelsregisterclient.d.ts +8 -2
  38. package/dist_ts/handelsregister/classes.handelsregisterclient.js +14 -5
  39. package/dist_ts/handelsregister/classes.handelsregistererror.d.ts +3 -1
  40. package/dist_ts/handelsregister/classes.handelsregistererror.js +1 -1
  41. package/dist_ts/handelsregister/classes.portalsession.d.ts +19 -3
  42. package/dist_ts/handelsregister/classes.portalsession.js +67 -9
  43. package/dist_ts/handelsregister/interfaces.d.ts +9 -2
  44. package/package.json +16 -6
  45. package/readme.md +86 -5
  46. package/ts/00_commitinfo_data.ts +2 -2
  47. package/ts/financialstatements/amounts.ts +181 -0
  48. package/ts/financialstatements/classes.financialstatementerror.ts +35 -0
  49. package/ts/financialstatements/constants.ts +24 -0
  50. package/ts/financialstatements/dates.ts +89 -0
  51. package/ts/financialstatements/html.ts +107 -0
  52. package/ts/financialstatements/index.ts +17 -0
  53. package/ts/financialstatements/interfaces.ts +268 -0
  54. package/ts/financialstatements/layout.html.ts +130 -0
  55. package/ts/financialstatements/layout.pdf.ts +268 -0
  56. package/ts/financialstatements/layout.ts +16 -0
  57. package/ts/financialstatements/mediatypes.ts +14 -0
  58. package/ts/financialstatements/outline.ts +44 -0
  59. package/ts/financialstatements/parse.esef.ts +394 -0
  60. package/ts/financialstatements/parse.hgb.ts +1235 -0
  61. package/ts/financialstatements/parse.statement.ts +26 -0
  62. package/ts/financialstatements/plugins.ts +29 -0
  63. package/ts/financialstatements/read.ts +135 -0
  64. package/ts/handelsregister/classes.handelsregisterclient.ts +18 -4
  65. package/ts/handelsregister/classes.handelsregistererror.ts +3 -0
  66. package/ts/handelsregister/classes.portalsession.ts +78 -9
  67. package/ts/handelsregister/interfaces.ts +9 -2
package/.smartconfig.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "githost": "gitlab.com",
6
6
  "gitscope": "fin.cx",
7
7
  "gitrepo": "opendata",
8
- "description": "Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, the base rate of § 247 BGB, the German consumer price index with the arithmetic of index clauses, and stock and crypto prices and fundamentals from several providers.",
8
+ "description": "Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, the base rate of § 247 BGB, the German consumer price index with the arithmetic of index clauses, published financial statements read from their HTML, PDF or ESEF documents, and stock and crypto prices and fundamentals from several providers.",
9
9
  "npmPackagename": "@fin.cx/opendata",
10
10
  "license": "MIT",
11
11
  "projectDomain": "fin.cx",
@@ -30,7 +30,11 @@
30
30
  "base rate",
31
31
  "consumer price index",
32
32
  "Verbraucherpreisindex",
33
- "index clause"
33
+ "index clause",
34
+ "Jahresabschluss",
35
+ "financial statements",
36
+ "HGB",
37
+ "ESEF"
34
38
  ]
35
39
  },
36
40
  "release": {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@fin.cx/opendata',
6
- version: '4.6.0',
7
- description: 'Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, the base rate of § 247 BGB, the German consumer price index with the arithmetic of index clauses, and stock and crypto prices and fundamentals from several providers.'
6
+ version: '4.8.0',
7
+ description: 'Open business and financial data for TypeScript: register lookups on the German register portal (handelsregister.de) without storage, the statutory public holidays of the German federal states, the base rate of § 247 BGB, the German consumer price index with the arithmetic of index clauses, published financial statements read from their HTML, PDF or ESEF documents, and stock and crypto prices and fundamentals from several providers.'
8
8
  };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBXQUEwVztDQUN4WCxDQUFBIn0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHNiQUFzYjtDQUNwYyxDQUFBIn0=
@@ -0,0 +1,58 @@
1
+ import type { IStatementUnit } from './interfaces.js';
2
+ /**
3
+ * An amount as this entry point computes with it: millionths of a euro, and the rounding it may
4
+ * carry. `slack` is twice the largest rounding error, also in millionths: zero for an amount printed
5
+ * to the cent, the step of the last printed digit for one printed rounded, and the sum of its terms'
6
+ * slack for a sum.
7
+ */
8
+ export interface IAmount {
9
+ micros: bigint;
10
+ slack: bigint;
11
+ /** the digits after the decimal point the amount is written with */
12
+ fractionDigits: number;
13
+ }
14
+ /** a number as printed, before its unit is applied */
15
+ export interface IPrintedAmount {
16
+ /** the printed digits as one integer: `1.234,5` is 12345 */
17
+ digits: bigint;
18
+ /** the digits after the decimal comma */
19
+ decimals: number;
20
+ /** the unit printed with the number, where one is */
21
+ unit: IStatementUnit | null;
22
+ }
23
+ export declare const unitEur: IStatementUnit;
24
+ export declare const unitTeur: IStatementUnit;
25
+ export declare const unitMioEur: IStatementUnit;
26
+ /** the units a text names, in the order it names them */
27
+ export declare const unitsIn: (textArg: string) => IStatementUnit[];
28
+ /** a text with the units it names blanked out */
29
+ export declare const withoutUnits: (textArg: string) => string;
30
+ /** whether a text names a currency other than the euro */
31
+ export declare const namesOtherCurrency: (textArg: string) => boolean;
32
+ /** a text with the currencies other than the euro it names blanked out */
33
+ export declare const withoutOtherCurrencies: (textArg: string) => string;
34
+ /** the unit a line of context states, `Angaben in TEUR` or a line that is only a unit; null if none */
35
+ export declare const unitStatedBy: (textArg: string) => IStatementUnit | null;
36
+ /** collapses the spaces statements print, no-break and narrow ones among them */
37
+ export declare const normalizeSpaces: (textArg: string) => string;
38
+ /**
39
+ * Reads an amount as German statements print it: `1.234.567,89`, `-1 234`, `– 12,5`, a dash alone
40
+ * for zero, with or without a unit before or after it (`EUR 1.234,56`, `1.234 T€`). Returns null for
41
+ * anything else, a year or a note number among them for the caller to tell apart.
42
+ */
43
+ export declare const parsePrintedAmount: (textArg: string) => IPrintedAmount | null;
44
+ /** whether a text reads as an amount rather than as a year such as `2024` or `2024 EUR` */
45
+ export declare const readsAsAmount: (textArg: string) => boolean;
46
+ /** an amount in a unit: `1.234` in TEUR is 1,234,000 euros, rounded to the thousand */
47
+ export declare const toAmount: (printedArg: IPrintedAmount, unitArg: IStatementUnit) => IAmount;
48
+ export declare const zeroAmount: IAmount;
49
+ export declare const addAmounts: (leftArg: IAmount, rightArg: IAmount) => IAmount;
50
+ export declare const negateAmount: (amountArg: IAmount) => IAmount;
51
+ export declare const sumAmounts: (amountsArg: IAmount[]) => IAmount;
52
+ /**
53
+ * Whether two amounts can be the same figure: equal, or for figures printed rounded, no further
54
+ * apart than both their roundings together allow.
55
+ */
56
+ export declare const amountsAgree: (leftArg: IAmount, rightArg: IAmount) => boolean;
57
+ /** an amount as a decimal string in euros, written with its own digits: `1234000`, `-12.50` */
58
+ export declare const formatAmount: (amountArg: IAmount) => string;
@@ -0,0 +1,130 @@
1
+ /** millionths of a euro per euro: amounts are kept as whole millionths, so no sum loses a digit */
2
+ const microsPerEuro = 1000000n;
3
+ /** a step at or below one cent: the amount was printed to the cent and is exact */
4
+ const exactStep = 10000n;
5
+ export const unitEur = { label: 'EUR', factor: '1' };
6
+ export const unitTeur = { label: 'TEUR', factor: '1000' };
7
+ export const unitMioEur = { label: 'Mio. EUR', factor: '1000000' };
8
+ /** the euro after a prefix such as `Mio.` or `T` */
9
+ const euroSuffix = String.raw `(?:€|EUR\b|Euro\b|EURO\b)`;
10
+ /** the units the statements print, millions and thousands before plain euros */
11
+ const unitPatterns = [
12
+ { unit: unitMioEur, pattern: String.raw `\b(?:Mio\.?|Millionen)\s*${euroSuffix}` },
13
+ { unit: unitTeur, pattern: String.raw `\b(?:T|Tsd\.?\s*|Tausend\s+)${euroSuffix}` },
14
+ { unit: unitEur, pattern: String.raw `(?:€|\b${euroSuffix})` },
15
+ ];
16
+ const unitAlternation = unitPatterns.map((entryArg) => `(${entryArg.pattern})`).join('|');
17
+ /** the units a text names, in the order it names them */
18
+ export const unitsIn = (textArg) => {
19
+ const result = [];
20
+ for (const match of textArg.matchAll(new RegExp(unitAlternation, 'g'))) {
21
+ const index = match.slice(1).findIndex((groupArg) => groupArg !== undefined);
22
+ result.push(unitPatterns[index].unit);
23
+ }
24
+ return result;
25
+ };
26
+ /** a text with the units it names blanked out */
27
+ export const withoutUnits = (textArg) => textArg.replace(new RegExp(unitAlternation, 'g'), ' ');
28
+ /** the currencies other than the euro a statement may name */
29
+ const otherCurrencySource = String.raw `\b(?:USD|US-Dollar|CHF|GBP|JPY|CNY|DKK|SEK|NOK|PLN|CZK|HUF)\b|\$|£|¥`;
30
+ /** whether a text names a currency other than the euro */
31
+ export const namesOtherCurrency = (textArg) => new RegExp(otherCurrencySource).test(textArg);
32
+ /** a text with the currencies other than the euro it names blanked out */
33
+ export const withoutOtherCurrencies = (textArg) => textArg.replace(new RegExp(otherCurrencySource, 'g'), ' ');
34
+ /** the unit alone, `TEUR` or `(in TEUR)`, as a line of its own */
35
+ const unitOnlyPattern = new RegExp(String.raw `^\(?\s*(?:in\s+)?(?:${unitAlternation})\s*\)?$`);
36
+ /** the explicit phrases a statement states its unit with: `Angaben in TEUR`, `(Beträge in Euro)` */
37
+ const unitPhrasePattern = new RegExp(String.raw `(?:\(\s*in\s+|\b(?:Angaben|Beträge|Betrag|Werte|Zahlen|Alle Beträge|Zahlenangaben)\s+in\s+)(?:${unitAlternation})`);
38
+ /** the unit a line of context states, `Angaben in TEUR` or a line that is only a unit; null if none */
39
+ export const unitStatedBy = (textArg) => {
40
+ const text = normalizeSpaces(textArg);
41
+ if (text.length > 200) {
42
+ return null;
43
+ }
44
+ const phrase = unitPhrasePattern.exec(text);
45
+ if (phrase) {
46
+ return unitsIn(phrase[0])[0] ?? null;
47
+ }
48
+ return unitOnlyPattern.test(text) ? unitsIn(text)[0] ?? null : null;
49
+ };
50
+ /** collapses the spaces statements print, no-break and narrow ones among them */
51
+ export const normalizeSpaces = (textArg) => textArg.replace(/\s+/g, ' ').trim();
52
+ const dashOnlyPattern = /^[-–—−]{1,3}$/;
53
+ const numberPattern = /^([-–—−])?\s*(\d{1,3}(?:[. ]\d{3})+|\d+)(?:,(\d{1,6}))?$/;
54
+ /**
55
+ * Reads an amount as German statements print it: `1.234.567,89`, `-1 234`, `– 12,5`, a dash alone
56
+ * for zero, with or without a unit before or after it (`EUR 1.234,56`, `1.234 T€`). Returns null for
57
+ * anything else, a year or a note number among them for the caller to tell apart.
58
+ */
59
+ export const parsePrintedAmount = (textArg) => {
60
+ let text = normalizeSpaces(textArg);
61
+ if (text === '') {
62
+ return null;
63
+ }
64
+ let unit = null;
65
+ const leading = new RegExp(String.raw `^(?:${unitAlternation})\s*`).exec(text);
66
+ if (leading) {
67
+ unit = unitsIn(leading[0])[0];
68
+ text = text.slice(leading[0].length);
69
+ }
70
+ else {
71
+ const trailing = new RegExp(String.raw `\s*(?:${unitAlternation})$`).exec(text);
72
+ if (trailing && trailing.index > 0) {
73
+ unit = unitsIn(trailing[0])[0];
74
+ text = text.slice(0, trailing.index);
75
+ }
76
+ }
77
+ if (dashOnlyPattern.test(text)) {
78
+ return { digits: 0n, decimals: 0, unit };
79
+ }
80
+ const match = numberPattern.exec(text);
81
+ if (!match) {
82
+ return null;
83
+ }
84
+ const decimals = match[3]?.length ?? 0;
85
+ const magnitude = BigInt(match[2].replace(/[. ]/g, '') + (match[3] ?? ''));
86
+ return { digits: match[1] ? -magnitude : magnitude, decimals, unit };
87
+ };
88
+ /** whether a text reads as an amount rather than as a year such as `2024` or `2024 EUR` */
89
+ export const readsAsAmount = (textArg) => parsePrintedAmount(textArg) !== null && !/^(?:19|20)\d{2}$/.test(normalizeSpaces(withoutUnits(textArg)));
90
+ /** an amount in a unit: `1.234` in TEUR is 1,234,000 euros, rounded to the thousand */
91
+ export const toAmount = (printedArg, unitArg) => {
92
+ const step = BigInt(unitArg.factor) * 10n ** BigInt(6 - printedArg.decimals);
93
+ return {
94
+ micros: printedArg.digits * step,
95
+ slack: step <= exactStep ? 0n : step,
96
+ fractionDigits: fractionDigitsOf(step),
97
+ };
98
+ };
99
+ const fractionDigitsOf = (stepArg) => {
100
+ let digits = 6;
101
+ for (let step = stepArg; digits > 0 && step % 10n === 0n; step /= 10n) {
102
+ digits--;
103
+ }
104
+ return digits;
105
+ };
106
+ export const zeroAmount = { micros: 0n, slack: 0n, fractionDigits: 0 };
107
+ export const addAmounts = (leftArg, rightArg) => ({
108
+ micros: leftArg.micros + rightArg.micros,
109
+ slack: leftArg.slack + rightArg.slack,
110
+ fractionDigits: Math.max(leftArg.fractionDigits, rightArg.fractionDigits),
111
+ });
112
+ export const negateAmount = (amountArg) => ({ ...amountArg, micros: -amountArg.micros });
113
+ export const sumAmounts = (amountsArg) => amountsArg.reduce(addAmounts, zeroAmount);
114
+ /**
115
+ * Whether two amounts can be the same figure: equal, or for figures printed rounded, no further
116
+ * apart than both their roundings together allow.
117
+ */
118
+ export const amountsAgree = (leftArg, rightArg) => {
119
+ const difference = leftArg.micros - rightArg.micros;
120
+ return (difference < 0n ? -difference : difference) * 2n <= leftArg.slack + rightArg.slack;
121
+ };
122
+ /** an amount as a decimal string in euros, written with its own digits: `1234000`, `-12.50` */
123
+ export const formatAmount = (amountArg) => {
124
+ const negative = amountArg.micros < 0n;
125
+ const magnitude = negative ? -amountArg.micros : amountArg.micros;
126
+ const whole = (magnitude / microsPerEuro).toString();
127
+ const fraction = (magnitude % microsPerEuro).toString().padStart(6, '0').slice(0, amountArg.fractionDigits);
128
+ return `${negative ? '-' : ''}${whole}${fraction === '' ? '' : `.${fraction}`}`;
129
+ };
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1vdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZpbmFuY2lhbHN0YXRlbWVudHMvYW1vdW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxtR0FBbUc7QUFDbkcsTUFBTSxhQUFhLEdBQUcsUUFBVSxDQUFDO0FBRWpDLG1GQUFtRjtBQUNuRixNQUFNLFNBQVMsR0FBRyxNQUFPLENBQUM7QUF5QjFCLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBbUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQW1CLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDMUUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFtQixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBRW5GLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFBLDJCQUEyQixDQUFDO0FBRXpELGdGQUFnRjtBQUNoRixNQUFNLFlBQVksR0FBcUQ7SUFDckUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFBLDRCQUE0QixVQUFVLEVBQUUsRUFBRTtJQUNqRixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUEsK0JBQStCLFVBQVUsRUFBRSxFQUFFO0lBQ2xGLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQSxVQUFVLFVBQVUsR0FBRyxFQUFFO0NBQzlELENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxP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
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Why a document was not read:
3
+ * - `invalid_input`: arguments this entry point does not take: no bytes, a date that is not one, a
4
+ * statement from the Unternehmensregister without the day it was posted;
5
+ * - `unsupported_media_type`: a media type other than HTML, PDF, XHTML or a ZIP package;
6
+ * - `too_large`: a document, or the report in a package, larger than `maxStatementBytes`, a package
7
+ * with more than `maxEsefPackageEntries` entries, a PDF with more than `maxPdfPages` pages, or a
8
+ * report with more than `maxEsefFacts` facts;
9
+ * - `invalid_package`: a package that is not a readable ZIP, is encrypted, or does not hold exactly
10
+ * one report under `reports/`;
11
+ * - `unreadable`: a document that does not open as what its media type says: a damaged or
12
+ * password-protected PDF, HTML in an unknown encoding, XHTML that is not well-formed;
13
+ * - `no_text`: a PDF without a text layer, such as a scan;
14
+ * - `unparseable`: a readable document in which no statement was found with certainty: no balance
15
+ * sheet, columns that do not say their year or unit, or current-year figures that do not add up.
16
+ */
17
+ export type TFinancialStatementErrorCode = 'invalid_input' | 'unsupported_media_type' | 'too_large' | 'invalid_package' | 'unreadable' | 'no_text' | 'unparseable';
18
+ /** The typed error of `@fin.cx/opendata/financialstatements`. */
19
+ export declare class FinancialStatementError extends Error {
20
+ readonly code: TFinancialStatementErrorCode;
21
+ constructor(code: TFinancialStatementErrorCode, message: string, options?: {
22
+ cause?: unknown;
23
+ });
24
+ }
@@ -0,0 +1,10 @@
1
+ /** The typed error of `@fin.cx/opendata/financialstatements`. */
2
+ export class FinancialStatementError extends Error {
3
+ code;
4
+ constructor(code, message, options) {
5
+ super(message, options);
6
+ this.name = 'FinancialStatementError';
7
+ this.code = code;
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5maW5hbmNpYWxzdGF0ZW1lbnRlcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZpbmFuY2lhbHN0YXRlbWVudHMvY2xhc3Nlcy5maW5hbmNpYWxzdGF0ZW1lbnRlcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF5QkEsaUVBQWlFO0FBQ2pFLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxLQUFLO0lBQ2hDLElBQUksQ0FBK0I7SUFFbkQsWUFBWSxJQUFrQyxFQUFFLE9BQWUsRUFBRSxPQUE2QjtRQUM1RixLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcseUJBQXlCLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,16 @@
1
+ /** The largest document read, and the largest report a package may hold: 100 MiB. */
2
+ export declare const maxStatementBytes: number;
3
+ /** The most pages a PDF may have. */
4
+ export declare const maxPdfPages = 500;
5
+ /** The most numeric facts an ESEF report may tag. */
6
+ export declare const maxEsefFacts = 100000;
7
+ /** The most entries an ESEF package may hold. */
8
+ export declare const maxEsefPackageEntries = 10000;
9
+ /** The origin note the Unternehmensregister marks what it gives out with (Nutzungsbedingungen § 3 Abs. 5). */
10
+ export declare const unternehmensregisterOrigin = "Auszug aus dem Unternehmensregister";
11
+ /**
12
+ * The full origin note of a document from the Unternehmensregister: "Auszug aus dem
13
+ * Unternehmensregister" and the day the document was posted, or for a deposited balance sheet the day
14
+ * it was deposited (§ 326 Abs. 2 HGB).
15
+ */
16
+ export declare const unternehmensregisterNotice: (publishedOnArg: string, depositedArg?: boolean) => string;
@@ -0,0 +1,20 @@
1
+ /** The largest document read, and the largest report a package may hold: 100 MiB. */
2
+ export const maxStatementBytes = 100 * 1024 * 1024;
3
+ /** The most pages a PDF may have. */
4
+ export const maxPdfPages = 500;
5
+ /** The most numeric facts an ESEF report may tag. */
6
+ export const maxEsefFacts = 100_000;
7
+ /** The most entries an ESEF package may hold. */
8
+ export const maxEsefPackageEntries = 10_000;
9
+ /** The origin note the Unternehmensregister marks what it gives out with (Nutzungsbedingungen § 3 Abs. 5). */
10
+ export const unternehmensregisterOrigin = 'Auszug aus dem Unternehmensregister';
11
+ /**
12
+ * The full origin note of a document from the Unternehmensregister: "Auszug aus dem
13
+ * Unternehmensregister" and the day the document was posted, or for a deposited balance sheet the day
14
+ * it was deposited (§ 326 Abs. 2 HGB).
15
+ */
16
+ export const unternehmensregisterNotice = (publishedOnArg, depositedArg = false) => {
17
+ const [year, month, day] = publishedOnArg.split('-');
18
+ return `${unternehmensregisterOrigin}, ${depositedArg ? 'hinterlegt' : 'eingestellt'} am ${day}.${month}.${year}`;
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZmluYW5jaWFsc3RhdGVtZW50cy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRW5ELHFDQUFxQztBQUNyQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRS9CLHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO0FBRXBDLGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUM7QUFFNUMsOEdBQThHO0FBQzlHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLHFDQUFxQyxDQUFDO0FBRWhGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLGNBQXNCLEVBQUUsWUFBWSxHQUFHLEtBQUssRUFBVSxFQUFFO0lBQ2pHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckQsT0FBTyxHQUFHLDBCQUEwQixLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLE9BQU8sR0FBRyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNwSCxDQUFDLENBQUMifQ==
@@ -0,0 +1,16 @@
1
+ import type { TIsoDate } from './interfaces.js';
2
+ /** the last full date a text names, `31.12.2024` or `31. Dezember 2024`; null if none */
3
+ export declare const lastDateIn: (textArg: string) => TIsoDate | null;
4
+ /** a text with the dates it names blanked out, `31.12.2024`, `1. Januar` and the like */
5
+ export declare const withoutDates: (textArg: string) => string;
6
+ /** the last year a text names on its own, outside a date; null if none */
7
+ export declare const lastYearIn: (textArg: string) => number | null;
8
+ /**
9
+ * The period a line of a statement names: `vom 1. Januar bis 31. Dezember 2024` and
10
+ * `01.01.-31.12.2024` give both days, `zum 31. Dezember 2024` the last. A first day printed without
11
+ * its year is in the last day's year, or the year before where it would fall after the last day.
12
+ */
13
+ export declare const periodIn: (textArg: string) => {
14
+ start: TIsoDate | null;
15
+ end: TIsoDate | null;
16
+ };
@@ -0,0 +1,72 @@
1
+ const monthNumbers = {
2
+ januar: 1, jan: 1, jänner: 1, februar: 2, feb: 2, märz: 3, mär: 3, maerz: 3, april: 4, apr: 4, mai: 5,
3
+ juni: 6, jun: 6, juli: 7, jul: 7, august: 8, aug: 8, september: 9, sep: 9, sept: 9, oktober: 10, okt: 10,
4
+ november: 11, nov: 11, dezember: 12, dez: 12,
5
+ };
6
+ /** `31.12.2024`, `31. Dezember 2024`, `1.1.`, `01. Jan.`: a day, a month and maybe a year */
7
+ const datePattern = /(\d{1,2})\.\s*(?:(\d{1,2})\.|([A-Za-zÄäÖöÜü]{3,9})\.?(?=[\s\d]|$))\s*((?:19|20)\d{2})?/g;
8
+ const isoOf = (yearArg, monthArg, dayArg) => {
9
+ const date = new Date(Date.UTC(yearArg, monthArg - 1, dayArg));
10
+ if (date.getUTCFullYear() !== yearArg || date.getUTCMonth() !== monthArg - 1 || date.getUTCDate() !== dayArg) {
11
+ return null;
12
+ }
13
+ return date.toISOString().slice(0, 10);
14
+ };
15
+ const dateMatches = (textArg) => {
16
+ const result = [];
17
+ for (const match of textArg.matchAll(datePattern)) {
18
+ const month = match[2] !== undefined ? Number(match[2]) : monthNumbers[match[3].toLowerCase()];
19
+ const day = Number(match[1]);
20
+ if (month === undefined || month < 1 || month > 12 || day < 1 || day > 31) {
21
+ continue;
22
+ }
23
+ result.push({
24
+ day,
25
+ month,
26
+ year: match[4] !== undefined ? Number(match[4]) : null,
27
+ index: match.index,
28
+ end: match.index + match[0].length,
29
+ });
30
+ }
31
+ return result;
32
+ };
33
+ /** the last full date a text names, `31.12.2024` or `31. Dezember 2024`; null if none */
34
+ export const lastDateIn = (textArg) => {
35
+ const full = dateMatches(textArg).filter((matchArg) => matchArg.year !== null);
36
+ const last = full[full.length - 1];
37
+ return last ? isoOf(last.year, last.month, last.day) : null;
38
+ };
39
+ /** a text with the dates it names blanked out, `31.12.2024`, `1. Januar` and the like */
40
+ export const withoutDates = (textArg) => {
41
+ let text = textArg;
42
+ for (const match of dateMatches(textArg).reverse()) {
43
+ text = text.slice(0, match.index) + ' '.repeat(match.end - match.index) + text.slice(match.end);
44
+ }
45
+ return text;
46
+ };
47
+ /** the last year a text names on its own, outside a date; null if none */
48
+ export const lastYearIn = (textArg) => {
49
+ const years = [...withoutDates(textArg).matchAll(/\b((?:19|20)\d{2})\b/g)];
50
+ return years.length > 0 ? Number(years[years.length - 1][1]) : null;
51
+ };
52
+ /**
53
+ * The period a line of a statement names: `vom 1. Januar bis 31. Dezember 2024` and
54
+ * `01.01.-31.12.2024` give both days, `zum 31. Dezember 2024` the last. A first day printed without
55
+ * its year is in the last day's year, or the year before where it would fall after the last day.
56
+ */
57
+ export const periodIn = (textArg) => {
58
+ const matches = dateMatches(textArg);
59
+ for (let index = 0; index + 1 < matches.length; index++) {
60
+ const first = matches[index];
61
+ const second = matches[index + 1];
62
+ const between = textArg.slice(first.end, second.index);
63
+ if (second.year === null || !/^\s*(?:bis(?:\s+(?:zum|einschließlich))?|[-–—])\s*$/i.test(between)) {
64
+ continue;
65
+ }
66
+ const end = isoOf(second.year, second.month, second.day);
67
+ const startYear = first.year ?? (first.month * 100 + first.day <= second.month * 100 + second.day ? second.year : second.year - 1);
68
+ return { start: end ? isoOf(startYear, first.month, first.day) : null, end };
69
+ }
70
+ return { start: null, end: lastDateIn(textArg) };
71
+ };
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9maW5hbmNpYWxzdGF0ZW1lbnRzL2RhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sWUFBWSxHQUEyQjtJQUMzQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3JHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7SUFDeEcsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUU7Q0FDN0MsQ0FBQztBQUVGLDZGQUE2RjtBQUM3RixNQUFNLFdBQVcsR0FBRyx5RkFBeUYsQ0FBQztBQVU5RyxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQWUsRUFBRSxRQUFnQixFQUFFLE1BQWMsRUFBbUIsRUFBRTtJQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFB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QUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUNiLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkgsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUMsQ0FBQyJ9
@@ -0,0 +1,21 @@
1
+ import * as plugins from './plugins.js';
2
+ export type THtmlDocument = plugins.parse5.DefaultTreeAdapterTypes.Document;
3
+ export type THtmlElement = plugins.parse5.DefaultTreeAdapterTypes.Element;
4
+ type THtmlParentNode = plugins.parse5.DefaultTreeAdapterTypes.ParentNode;
5
+ type THtmlChildNode = plugins.parse5.DefaultTreeAdapterTypes.ChildNode;
6
+ export declare const parseHtml: (htmlArg: string) => THtmlDocument;
7
+ export declare const isElement: (nodeArg: THtmlChildNode) => nodeArg is THtmlElement;
8
+ /** the element children of a node */
9
+ export declare const elementChildren: (nodeArg: THtmlParentNode) => THtmlElement[];
10
+ /** every element below a node, in document order */
11
+ export declare const descendants: (nodeArg: THtmlParentNode) => THtmlElement[];
12
+ export declare const getAttribute: (elementArg: THtmlElement, nameArg: string) => string | undefined;
13
+ export declare const hasClass: (elementArg: THtmlElement, classArg: string) => boolean;
14
+ /** the text of a node with white space collapsed */
15
+ export declare const textOf: (nodeArg: THtmlChildNode | THtmlParentNode) => string;
16
+ /**
17
+ * Decodes an HTML document: by its byte order mark, else by the charset its first 1,024 bytes
18
+ * declare, else as UTF-8. Bytes that are not text in that encoding are `unreadable`.
19
+ */
20
+ export declare const decodeHtml: (bytesArg: Uint8Array) => string;
21
+ export {};
@@ -0,0 +1,92 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FinancialStatementError } from './classes.financialstatementerror.js';
3
+ export const parseHtml = (htmlArg) => plugins.parse5.parse(htmlArg);
4
+ export const isElement = (nodeArg) => 'tagName' in nodeArg;
5
+ /** the element children of a node */
6
+ export const elementChildren = (nodeArg) => nodeArg.childNodes.filter(isElement);
7
+ /** every element below a node, in document order */
8
+ export const descendants = (nodeArg) => {
9
+ const result = [];
10
+ const stack = elementChildren(nodeArg).reverse();
11
+ while (stack.length > 0) {
12
+ const element = stack.pop();
13
+ result.push(element);
14
+ const children = element.tagName === 'template' ? [] : elementChildren(element);
15
+ for (let index = children.length - 1; index >= 0; index--) {
16
+ stack.push(children[index]);
17
+ }
18
+ }
19
+ return result;
20
+ };
21
+ export const getAttribute = (elementArg, nameArg) => elementArg.attrs.find((attrArg) => attrArg.name === nameArg)?.value;
22
+ export const hasClass = (elementArg, classArg) => (getAttribute(elementArg, 'class') ?? '').split(/\s+/).includes(classArg);
23
+ /**
24
+ * the raw text of a node and everything below it, scripts and styles left out: the text nodes in
25
+ * document order, separated by spaces. Walks the tree with its own stack, so no nesting depth a page
26
+ * can have exhausts the call stack.
27
+ */
28
+ const rawText = (nodeArg) => {
29
+ const pieces = [];
30
+ const stack = [nodeArg];
31
+ for (let node = stack.pop(); node !== undefined; node = stack.pop()) {
32
+ if ('value' in node && node.nodeName === '#text') {
33
+ pieces.push(node.value);
34
+ continue;
35
+ }
36
+ if (!('childNodes' in node)) {
37
+ continue;
38
+ }
39
+ if ('tagName' in node && (node.tagName === 'script' || node.tagName === 'style')) {
40
+ continue;
41
+ }
42
+ for (let index = node.childNodes.length - 1; index >= 0; index--) {
43
+ stack.push(node.childNodes[index]);
44
+ }
45
+ }
46
+ return pieces.join(' ');
47
+ };
48
+ /** the text of a node with white space collapsed */
49
+ export const textOf = (nodeArg) => rawText(nodeArg).replace(/\s+/g, ' ').trim();
50
+ /** the encodings an HTML statement may declare, by the names it may declare them with */
51
+ const knownEncodings = {
52
+ 'utf-8': 'utf-8',
53
+ utf8: 'utf-8',
54
+ 'iso-8859-1': 'windows-1252',
55
+ 'iso-8859-15': 'iso-8859-15',
56
+ latin1: 'windows-1252',
57
+ 'windows-1252': 'windows-1252',
58
+ cp1252: 'windows-1252',
59
+ };
60
+ /**
61
+ * Decodes an HTML document: by its byte order mark, else by the charset its first 1,024 bytes
62
+ * declare, else as UTF-8. Bytes that are not text in that encoding are `unreadable`.
63
+ */
64
+ export const decodeHtml = (bytesArg) => {
65
+ let encoding = 'utf-8';
66
+ let start = 0;
67
+ if (bytesArg[0] === 0xef && bytesArg[1] === 0xbb && bytesArg[2] === 0xbf) {
68
+ start = 3;
69
+ }
70
+ else if ((bytesArg[0] === 0xff && bytesArg[1] === 0xfe) || (bytesArg[0] === 0xfe && bytesArg[1] === 0xff)) {
71
+ encoding = bytesArg[0] === 0xff ? 'utf-16le' : 'utf-16be';
72
+ start = 2;
73
+ }
74
+ else {
75
+ const head = new TextDecoder('windows-1252').decode(bytesArg.subarray(0, 1024));
76
+ const declared = /<meta[^>]+charset\s*=\s*["']?\s*([\w-]+)/i.exec(head)?.[1].toLowerCase();
77
+ if (declared !== undefined) {
78
+ const known = knownEncodings[declared];
79
+ if (known === undefined) {
80
+ throw new FinancialStatementError('unreadable', `The document declares the encoding "${declared}", which is not read here.`);
81
+ }
82
+ encoding = known;
83
+ }
84
+ }
85
+ try {
86
+ return new TextDecoder(encoding, { fatal: true }).decode(bytesArg.subarray(start));
87
+ }
88
+ catch (error) {
89
+ throw new FinancialStatementError('unreadable', `The document is not text in ${encoding}.`, { cause: error });
90
+ }
91
+ };
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZpbmFuY2lhbHN0YXRlbWVudHMvaHRtbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQU8vRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFlLEVBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUUzRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUF1QixFQUEyQixFQUFFLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUVwRyxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBd0IsRUFBa0IsRUFBRSxDQUMxRSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV2QyxvREFBb0Q7QUFDcEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBd0IsRUFBa0IsRUFBRTtJQUN0RSxNQUFNLE1BQU0sR0FBbUIsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFtQixlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakUsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQWtCLENBQUM7UUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFD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
@@ -0,0 +1,6 @@
1
+ export * from './interfaces.js';
2
+ export { FinancialStatementError, type TFinancialStatementErrorCode } from './classes.financialstatementerror.js';
3
+ export { maxEsefFacts, maxEsefPackageEntries, maxPdfPages, maxStatementBytes, unternehmensregisterNotice, unternehmensregisterOrigin, } from './constants.js';
4
+ export { parseStatementDocument } from './parse.statement.js';
5
+ export { parseEsefPackage, parseEsefReport } from './parse.esef.js';
6
+ export { readFinancialStatement } from './read.js';
@@ -0,0 +1,11 @@
1
+ // This entry point stands alone: it imports nothing from the rest of the package and keeps nothing.
2
+ // It reads published financial statements from the bytes a caller obtained: statements under the
3
+ // HGB from the HTML or the PDF a register shows, and ESEF reports. The caller stores the document
4
+ // and what was read from it; `parsed` is null rather than guessed.
5
+ export * from './interfaces.js';
6
+ export { FinancialStatementError } from './classes.financialstatementerror.js';
7
+ export { maxEsefFacts, maxEsefPackageEntries, maxPdfPages, maxStatementBytes, unternehmensregisterNotice, unternehmensregisterOrigin, } from './constants.js';
8
+ export { parseStatementDocument } from './parse.statement.js';
9
+ export { parseEsefPackage, parseEsefReport } from './parse.esef.js';
10
+ export { readFinancialStatement } from './read.js';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9maW5hbmNpYWxzdGF0ZW1lbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9HQUFvRztBQUNwRyxpR0FBaUc7QUFDakcsa0dBQWtHO0FBQ2xHLG1FQUFtRTtBQUNuRSxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsSCxPQUFPLEVBQ0wsWUFBWSxFQUNaLHFCQUFxQixFQUNyQixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLDBCQUEwQixFQUMxQiwwQkFBMEIsR0FDM0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDIn0=