@fin.cx/opendata 4.7.0 → 4.9.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.
- package/.smartconfig.json +6 -2
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/financialstatements/amounts.d.ts +58 -0
- package/dist_ts/financialstatements/amounts.js +130 -0
- package/dist_ts/financialstatements/classes.financialstatementerror.d.ts +24 -0
- package/dist_ts/financialstatements/classes.financialstatementerror.js +10 -0
- package/dist_ts/financialstatements/constants.d.ts +16 -0
- package/dist_ts/financialstatements/constants.js +20 -0
- package/dist_ts/financialstatements/dates.d.ts +16 -0
- package/dist_ts/financialstatements/dates.js +72 -0
- package/dist_ts/financialstatements/html.d.ts +21 -0
- package/dist_ts/financialstatements/html.js +92 -0
- package/dist_ts/financialstatements/index.d.ts +6 -0
- package/dist_ts/financialstatements/index.js +11 -0
- package/dist_ts/financialstatements/interfaces.d.ts +258 -0
- package/dist_ts/financialstatements/interfaces.js +2 -0
- package/dist_ts/financialstatements/layout.d.ts +20 -0
- package/dist_ts/financialstatements/layout.html.d.ts +8 -0
- package/dist_ts/financialstatements/layout.html.js +125 -0
- package/dist_ts/financialstatements/layout.js +2 -0
- package/dist_ts/financialstatements/layout.pdf.d.ts +6 -0
- package/dist_ts/financialstatements/layout.pdf.js +229 -0
- package/dist_ts/financialstatements/mediatypes.d.ts +3 -0
- package/dist_ts/financialstatements/mediatypes.js +11 -0
- package/dist_ts/financialstatements/outline.d.ts +22 -0
- package/dist_ts/financialstatements/outline.js +26 -0
- package/dist_ts/financialstatements/parse.esef.d.ts +13 -0
- package/dist_ts/financialstatements/parse.esef.js +349 -0
- package/dist_ts/financialstatements/parse.hgb.d.ts +9 -0
- package/dist_ts/financialstatements/parse.hgb.js +1014 -0
- package/dist_ts/financialstatements/parse.statement.d.ts +8 -0
- package/dist_ts/financialstatements/parse.statement.js +25 -0
- package/dist_ts/financialstatements/plugins.d.ts +10 -0
- package/dist_ts/financialstatements/plugins.js +15 -0
- package/dist_ts/financialstatements/read.d.ts +10 -0
- package/dist_ts/financialstatements/read.js +113 -0
- package/dist_ts/gleif/classes.gleifclient.d.ts +26 -0
- package/dist_ts/gleif/classes.gleifclient.js +214 -0
- package/dist_ts/gleif/classes.gleiferror.d.ts +6 -0
- package/dist_ts/gleif/classes.gleiferror.js +11 -0
- package/dist_ts/gleif/crosswalk.d.ts +7 -0
- package/dist_ts/gleif/crosswalk.js +25 -0
- package/dist_ts/gleif/csv.d.ts +2 -0
- package/dist_ts/gleif/csv.js +75 -0
- package/dist_ts/gleif/data.crosswalk.d.ts +12 -0
- package/dist_ts/gleif/data.crosswalk.js +1265 -0
- package/dist_ts/gleif/index.d.ts +6 -0
- package/dist_ts/gleif/index.js +7 -0
- package/dist_ts/gleif/interfaces.d.ts +101 -0
- package/dist_ts/gleif/interfaces.js +2 -0
- package/dist_ts/gleif/plugins.d.ts +1 -0
- package/dist_ts/gleif/plugins.js +3 -0
- package/dist_ts/gleif/records.d.ts +6 -0
- package/dist_ts/gleif/records.js +107 -0
- package/dist_ts/gleif/stream.zip.d.ts +2 -0
- package/dist_ts/gleif/stream.zip.js +54 -0
- package/dist_ts/plugins.d.ts +2 -0
- package/dist_ts/plugins.js +4 -1
- package/package.json +20 -5
- package/readme.md +156 -5
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/financialstatements/amounts.ts +181 -0
- package/ts/financialstatements/classes.financialstatementerror.ts +35 -0
- package/ts/financialstatements/constants.ts +24 -0
- package/ts/financialstatements/dates.ts +89 -0
- package/ts/financialstatements/html.ts +107 -0
- package/ts/financialstatements/index.ts +17 -0
- package/ts/financialstatements/interfaces.ts +268 -0
- package/ts/financialstatements/layout.html.ts +130 -0
- package/ts/financialstatements/layout.pdf.ts +268 -0
- package/ts/financialstatements/layout.ts +16 -0
- package/ts/financialstatements/mediatypes.ts +14 -0
- package/ts/financialstatements/outline.ts +44 -0
- package/ts/financialstatements/parse.esef.ts +394 -0
- package/ts/financialstatements/parse.hgb.ts +1235 -0
- package/ts/financialstatements/parse.statement.ts +26 -0
- package/ts/financialstatements/plugins.ts +29 -0
- package/ts/financialstatements/read.ts +135 -0
- package/ts/gleif/classes.gleifclient.ts +170 -0
- package/ts/gleif/classes.gleiferror.ts +8 -0
- package/ts/gleif/crosswalk.ts +29 -0
- package/ts/gleif/csv.ts +60 -0
- package/ts/gleif/data.crosswalk.ts +1271 -0
- package/ts/gleif/index.ts +6 -0
- package/ts/gleif/interfaces.ts +107 -0
- package/ts/gleif/plugins.ts +2 -0
- package/ts/gleif/records.ts +104 -0
- package/ts/gleif/stream.zip.ts +43 -0
- package/ts/plugins.ts +4 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IHgbStatement } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reads a statement under the HGB from the HTML or the PDF a register shows: the balance sheet
|
|
4
|
+
* (§ 266 HGB) and, where one is published, the income statement (§ 275 HGB). Everything it returns
|
|
5
|
+
* was printed and adds up; where the current year's balance sheet cannot be read with certainty it
|
|
6
|
+
* throws `unparseable` rather than guess. A PDF is read from its text layer only.
|
|
7
|
+
*/
|
|
8
|
+
export declare const parseStatementDocument: (bytesArg: Uint8Array, mediaTypeArg: string) => Promise<IHgbStatement>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FinancialStatementError } from './classes.financialstatementerror.js';
|
|
2
|
+
import { maxStatementBytes } from './constants.js';
|
|
3
|
+
import { decodeHtml } from './html.js';
|
|
4
|
+
import { htmlLayout } from './layout.html.js';
|
|
5
|
+
import { pdfLayout } from './layout.pdf.js';
|
|
6
|
+
import { statementMediaTypeOf } from './mediatypes.js';
|
|
7
|
+
import { readHgbStatement } from './parse.hgb.js';
|
|
8
|
+
/**
|
|
9
|
+
* Reads a statement under the HGB from the HTML or the PDF a register shows: the balance sheet
|
|
10
|
+
* (§ 266 HGB) and, where one is published, the income statement (§ 275 HGB). Everything it returns
|
|
11
|
+
* was printed and adds up; where the current year's balance sheet cannot be read with certainty it
|
|
12
|
+
* throws `unparseable` rather than guess. A PDF is read from its text layer only.
|
|
13
|
+
*/
|
|
14
|
+
export const parseStatementDocument = async (bytesArg, mediaTypeArg) => {
|
|
15
|
+
const mediaType = statementMediaTypeOf(mediaTypeArg);
|
|
16
|
+
if (mediaType !== 'text/html' && mediaType !== 'application/xhtml+xml' && mediaType !== 'application/pdf') {
|
|
17
|
+
throw new FinancialStatementError('unsupported_media_type', `A statement in "${mediaTypeArg}" is not read here; HTML and PDF are.`);
|
|
18
|
+
}
|
|
19
|
+
if (bytesArg.byteLength > maxStatementBytes) {
|
|
20
|
+
throw new FinancialStatementError('too_large', `The document has ${bytesArg.byteLength} bytes, more than the ${maxStatementBytes} read here.`);
|
|
21
|
+
}
|
|
22
|
+
const blocks = mediaType === 'application/pdf' ? await pdfLayout(bytesArg) : htmlLayout(decodeHtml(bytesArg));
|
|
23
|
+
return readHgbStatement(blocks);
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Uuc3RhdGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZmluYW5jaWFsc3RhdGVtZW50cy9wYXJzZS5zdGF0ZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2xEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxFQUFFLFFBQW9CLEVBQUUsWUFBb0IsRUFBMEIsRUFBRTtJQUNqSCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxJQUFJLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxLQUFLLHVCQUF1QixJQUFJLFNBQVMsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFHLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyx3QkFBd0IsRUFBRSxtQkFBbUIsWUFBWSx1Q0FBdUMsQ0FBQyxDQUFDO0lBQ3RJLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztRQUM1QyxNQUFNLElBQUksdUJBQXVCLENBQUMsV0FBVyxFQUFFLG9CQUFvQixRQUFRLENBQUMsVUFBVSx5QkFBeUIsaUJBQWlCLGFBQWEsQ0FBQyxDQUFDO0lBQ2pKLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUcsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
export { path, createRequire, };
|
|
4
|
+
import * as smartarchiveZip from '@push.rocks/smartarchive/web/zip';
|
|
5
|
+
import * as smartxmlXpath from '@push.rocks/smartxml/xpath';
|
|
6
|
+
export { smartarchiveZip, smartxmlXpath, };
|
|
7
|
+
import * as parse5 from 'parse5';
|
|
8
|
+
export { parse5, };
|
|
9
|
+
/** PDF.js for Node.js (its legacy build), loaded when the first PDF is read */
|
|
10
|
+
export declare const loadPdfjs: () => Promise<typeof import("pdfjs-dist/legacy/build/pdf.mjs")>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// This entry point stands alone: it imports nothing from the rest of the package and needs no storage.
|
|
2
|
+
// node native scope
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
export { path, createRequire, };
|
|
6
|
+
// @push.rocks scope
|
|
7
|
+
import * as smartarchiveZip from '@push.rocks/smartarchive/web/zip';
|
|
8
|
+
import * as smartxmlXpath from '@push.rocks/smartxml/xpath';
|
|
9
|
+
export { smartarchiveZip, smartxmlXpath, };
|
|
10
|
+
// third party scope
|
|
11
|
+
import * as parse5 from 'parse5';
|
|
12
|
+
export { parse5, };
|
|
13
|
+
/** PDF.js for Node.js (its legacy build), loaded when the first PDF is read */
|
|
14
|
+
export const loadPdfjs = () => import('pdfjs-dist/legacy/build/pdf.mjs');
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZpbmFuY2lhbHN0YXRlbWVudHMvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1R0FBdUc7QUFFdkcsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUNMLElBQUksRUFDSixhQUFhLEdBQ2QsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssZUFBZSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxhQUFhLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEdBQ2QsQ0FBQTtBQUVELG9CQUFvQjtBQUNwQixPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxPQUFPLEVBQ0wsTUFBTSxHQUNQLENBQUE7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IFinancialStatement, IReadFinancialStatementOptions } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Keeps a published statement as a caller stores it: the filing as the caller states it, the
|
|
4
|
+
* document byte for byte with its SHA-256, and what could be read from it: an ESEF report by
|
|
5
|
+
* `parseEsefPackage` or `parseEsefReport`, any other HTML or PDF by `parseStatementDocument`. A
|
|
6
|
+
* document that cannot be read with certainty is kept with `parsed` null and `parseFailure` saying
|
|
7
|
+
* why. Throws `invalid_input`, `unsupported_media_type` and, for a document larger than
|
|
8
|
+
* `maxStatementBytes`, `too_large`, as nothing would be kept.
|
|
9
|
+
*/
|
|
10
|
+
export declare const readFinancialStatement: (optionsArg: IReadFinancialStatementOptions) => Promise<IFinancialStatement>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { FinancialStatementError } from './classes.financialstatementerror.js';
|
|
2
|
+
import { maxStatementBytes, unternehmensregisterNotice } from './constants.js';
|
|
3
|
+
import { statementMediaTypeOf } from './mediatypes.js';
|
|
4
|
+
import { parseEsefPackage, parseEsefReport } from './parse.esef.js';
|
|
5
|
+
import { parseStatementDocument } from './parse.statement.js';
|
|
6
|
+
const filingSources = ['unternehmensregister', 'bundesanzeiger', 'issuer', 'unknown'];
|
|
7
|
+
const filingKinds = ['annual_accounts', 'consolidated_accounts', 'deposited_balance_sheet', 'annual_financial_report'];
|
|
8
|
+
const sizeClasses = ['micro', 'small', 'medium', 'large'];
|
|
9
|
+
const parseFailureCodes = new Set(['invalid_package', 'unreadable', 'no_text', 'unparseable', 'too_large']);
|
|
10
|
+
/** the inline XBRL namespace, which marks an HTML document as an ESEF report */
|
|
11
|
+
const inlineXbrlNamespace = 'http://www.xbrl.org/2013/inlineXBRL';
|
|
12
|
+
const invalid = (messageArg) => {
|
|
13
|
+
throw new FinancialStatementError('invalid_input', messageArg);
|
|
14
|
+
};
|
|
15
|
+
const isIsoDate = (valueArg) => {
|
|
16
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(valueArg)) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
const date = new Date(`${valueArg}T00:00:00Z`);
|
|
20
|
+
return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === valueArg;
|
|
21
|
+
};
|
|
22
|
+
const filingOf = (inputArg) => {
|
|
23
|
+
if (!filingSources.includes(inputArg?.source)) {
|
|
24
|
+
invalid(`The filing's source "${inputArg?.source}" is not one of ${filingSources.join(', ')}.`);
|
|
25
|
+
}
|
|
26
|
+
if (!filingKinds.includes(inputArg.kind)) {
|
|
27
|
+
invalid(`The filing's kind "${inputArg.kind}" is not one of ${filingKinds.join(', ')}.`);
|
|
28
|
+
}
|
|
29
|
+
if (inputArg.sizeClass != null && !sizeClasses.includes(inputArg.sizeClass)) {
|
|
30
|
+
invalid(`The filing's size class "${inputArg.sizeClass}" is not one of ${sizeClasses.join(', ')}.`);
|
|
31
|
+
}
|
|
32
|
+
for (const field of ['fiscalYearStart', 'fiscalYearEnd', 'publishedOn']) {
|
|
33
|
+
const value = inputArg[field];
|
|
34
|
+
if (value != null && (typeof value !== 'string' || !isIsoDate(value))) {
|
|
35
|
+
invalid(`The filing's ${field} "${value}" is not an ISO date (YYYY-MM-DD).`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (inputArg.source === 'unternehmensregister' && inputArg.publishedOn == null) {
|
|
39
|
+
invalid('A filing from the Unternehmensregister needs publishedOn, the day it was posted or deposited, for its origin note.');
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
source: inputArg.source,
|
|
43
|
+
kind: inputArg.kind,
|
|
44
|
+
companyName: inputArg.companyName ?? null,
|
|
45
|
+
registerReference: inputArg.registerReference ?? null,
|
|
46
|
+
lei: inputArg.lei ?? null,
|
|
47
|
+
fiscalYearStart: inputArg.fiscalYearStart ?? null,
|
|
48
|
+
fiscalYearEnd: inputArg.fiscalYearEnd ?? null,
|
|
49
|
+
publishedOn: inputArg.publishedOn ?? null,
|
|
50
|
+
title: inputArg.title ?? null,
|
|
51
|
+
sizeClass: inputArg.sizeClass ?? null,
|
|
52
|
+
documentId: inputArg.documentId ?? null,
|
|
53
|
+
sourceUrl: inputArg.sourceUrl ?? null,
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
const sha256Of = async (bytesArg) => {
|
|
57
|
+
const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', bytesArg));
|
|
58
|
+
return [...digest].map((byteArg) => byteArg.toString(16).padStart(2, '0')).join('');
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Keeps a published statement as a caller stores it: the filing as the caller states it, the
|
|
62
|
+
* document byte for byte with its SHA-256, and what could be read from it: an ESEF report by
|
|
63
|
+
* `parseEsefPackage` or `parseEsefReport`, any other HTML or PDF by `parseStatementDocument`. A
|
|
64
|
+
* document that cannot be read with certainty is kept with `parsed` null and `parseFailure` saying
|
|
65
|
+
* why. Throws `invalid_input`, `unsupported_media_type` and, for a document larger than
|
|
66
|
+
* `maxStatementBytes`, `too_large`, as nothing would be kept.
|
|
67
|
+
*/
|
|
68
|
+
export const readFinancialStatement = async (optionsArg) => {
|
|
69
|
+
if (!(optionsArg?.bytes instanceof Uint8Array)) {
|
|
70
|
+
invalid('bytes must be a Uint8Array.');
|
|
71
|
+
}
|
|
72
|
+
const filing = filingOf(optionsArg.filing);
|
|
73
|
+
if (optionsArg.bytes.byteLength > maxStatementBytes) {
|
|
74
|
+
throw new FinancialStatementError('too_large', `The document has ${optionsArg.bytes.byteLength} bytes, more than the ${maxStatementBytes} read here.`);
|
|
75
|
+
}
|
|
76
|
+
const mediaType = statementMediaTypeOf(String(optionsArg.mediaType));
|
|
77
|
+
if (!mediaType) {
|
|
78
|
+
throw new FinancialStatementError('unsupported_media_type', `A statement in "${optionsArg.mediaType}" is not read here; HTML, PDF, XHTML and ZIP packages are.`);
|
|
79
|
+
}
|
|
80
|
+
const bytes = new Uint8Array(optionsArg.bytes);
|
|
81
|
+
const sha256 = await sha256Of(bytes);
|
|
82
|
+
let parsed = null;
|
|
83
|
+
let parseFailure = null;
|
|
84
|
+
try {
|
|
85
|
+
if (mediaType === 'application/zip') {
|
|
86
|
+
parsed = await parseEsefPackage(bytes);
|
|
87
|
+
}
|
|
88
|
+
else if (mediaType === 'application/xhtml+xml' ||
|
|
89
|
+
(mediaType === 'text/html' && new TextDecoder('windows-1252').decode(bytes.subarray(0, 65536)).includes(inlineXbrlNamespace))) {
|
|
90
|
+
parsed = parseEsefReport(bytes);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
parsed = await parseStatementDocument(bytes, mediaType);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (!(error instanceof FinancialStatementError) || !parseFailureCodes.has(error.code)) {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
parseFailure = { code: error.code, message: error.message };
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
filing,
|
|
104
|
+
raw: { bytes, mediaType, sha256 },
|
|
105
|
+
parsed,
|
|
106
|
+
parseFailure,
|
|
107
|
+
obtainedAt: (optionsArg.now ?? Date.now)(),
|
|
108
|
+
notice: filing.source === 'unternehmensregister'
|
|
109
|
+
? unternehmensregisterNotice(filing.publishedOn, filing.kind === 'deposited_balance_sheet')
|
|
110
|
+
: null,
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZpbmFuY2lhbHN0YXRlbWVudHMvcmVhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZOUQsTUFBTSxhQUFhLEdBQW9CLENBQUMsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZHLE1BQU0sV0FBVyxHQUFrQixDQUFDLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDdEksTUFBTSxXQUFXLEdBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBUyxDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFcEgsZ0ZBQWdGO0FBQ2hGLE1BQU0sbUJBQW1CLEdBQUcscUNBQXFDLENBQUM7QUFFbEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxVQUFrQixFQUFTLEVBQUU7SUFDNUMsTUFBTSxJQUFJLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQWdCLEVBQVcsRUFBRTtJ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
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IGleifClientOptions, IGleifGoldenCopyFile, IGleifPublish, IGleifReadOptions, IGleifRecord, IGleifStreamOptions, TGleifDelta } from './interfaces.js';
|
|
2
|
+
export declare const gleifGoldenCopyBaseUrl = "https://goldencopy.gleif.org/api/v2";
|
|
3
|
+
export declare const gleifRestBaseUrl = "https://api.gleif.org/api/v1";
|
|
4
|
+
export declare const gleifDeltaKinds: readonly TGleifDelta[];
|
|
5
|
+
/** Official Golden Copy ZIP/CSV streams and JSON:API lookup; no files, cache or retries. */
|
|
6
|
+
export declare class GleifClient {
|
|
7
|
+
private readonly options;
|
|
8
|
+
private readonly goldenCopyBaseUrl;
|
|
9
|
+
private readonly restBaseUrl;
|
|
10
|
+
private readonly timeoutMs;
|
|
11
|
+
constructor(options?: IGleifClientOptions);
|
|
12
|
+
/** Discovers the current full file and all four delta windows from the official v2 API. */
|
|
13
|
+
getLatestPublish(optionsArg?: {
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}): Promise<IGleifPublish>;
|
|
16
|
+
/** Discovers once, then streams the selected full file or delta. */
|
|
17
|
+
streamRecords(optionsArg?: IGleifStreamOptions): AsyncGenerator<IGleifRecord>;
|
|
18
|
+
/** Streams a discovered descriptor. Breaking iteration cancels the response immediately. */
|
|
19
|
+
readGoldenCopy(fileArg: IGleifGoldenCopyFile, optionsArg?: IGleifReadOptions): AsyncGenerator<IGleifRecord>;
|
|
20
|
+
/** One LEI using the documented public JSON:API resource, mapped to the same record type. */
|
|
21
|
+
lookup(leiArg: string, optionsArg?: {
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
}): Promise<IGleifRecord>;
|
|
24
|
+
private getJson;
|
|
25
|
+
private requestBytes;
|
|
26
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { GleifError } from './classes.gleiferror.js';
|
|
2
|
+
import { parseCsvRows } from './csv.js';
|
|
3
|
+
import { csvRecordMapper, parseGleifRestRecord } from './records.js';
|
|
4
|
+
import { unzipCsv } from './stream.zip.js';
|
|
5
|
+
export const gleifGoldenCopyBaseUrl = 'https://goldencopy.gleif.org/api/v2';
|
|
6
|
+
export const gleifRestBaseUrl = 'https://api.gleif.org/api/v1';
|
|
7
|
+
export const gleifDeltaKinds = ['IntraDay', 'LastDay', 'LastWeek', 'LastMonth'];
|
|
8
|
+
const bad = (labelArg) => { throw new GleifError('unexpected_answer', `Invalid GLEIF publication ${labelArg}.`); };
|
|
9
|
+
const object = (valueArg) => valueArg && typeof valueArg === 'object' && !Array.isArray(valueArg) ? valueArg : bad('object');
|
|
10
|
+
const url = (valueArg) => {
|
|
11
|
+
if (typeof valueArg !== 'string')
|
|
12
|
+
throw new GleifError('invalid_input', 'Expected an HTTP(S) URL.');
|
|
13
|
+
let parsed;
|
|
14
|
+
try {
|
|
15
|
+
parsed = new URL(valueArg);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new GleifError('invalid_input', 'Expected an HTTP(S) URL.');
|
|
19
|
+
}
|
|
20
|
+
if (!['http:', 'https:'].includes(parsed.protocol) || parsed.username || parsed.password)
|
|
21
|
+
throw new GleifError('invalid_input', 'Expected an HTTP(S) URL without credentials.');
|
|
22
|
+
return valueArg;
|
|
23
|
+
};
|
|
24
|
+
const descriptor = (valueArg, kindArg) => {
|
|
25
|
+
const value = object(valueArg);
|
|
26
|
+
if (value.type !== 'lei2' || value.format !== 'csv' || value.cdf_version !== 'LEI_3.1' || value.delta_type !== kindArg)
|
|
27
|
+
bad('file type, format, CDF version or delta type');
|
|
28
|
+
if (!Number.isSafeInteger(value.record_count) || Number(value.record_count) < 0 || !Number.isSafeInteger(value.size) || Number(value.size) < 1)
|
|
29
|
+
bad('record count or size');
|
|
30
|
+
return { url: url(value.url), kind: kindArg, format: 'csv', cdfVersion: 'LEI_3.1', recordCount: value.record_count, size: value.size };
|
|
31
|
+
};
|
|
32
|
+
const checkFilters = (optionsArg) => {
|
|
33
|
+
if (optionsArg.country !== undefined && !/^[A-Z]{2}$/.test(optionsArg.country))
|
|
34
|
+
throw new GleifError('invalid_input', 'country must be an ISO alpha-2 code, e.g. DE.');
|
|
35
|
+
if (optionsArg.jurisdiction !== undefined && !/^[A-Z]{2}(?:-[A-Z0-9]{1,3})?$/.test(optionsArg.jurisdiction))
|
|
36
|
+
throw new GleifError('invalid_input', 'jurisdiction must be a country or subdivision code.');
|
|
37
|
+
if (optionsArg.maxRowChars !== undefined && (!Number.isSafeInteger(optionsArg.maxRowChars) || optionsArg.maxRowChars < 1))
|
|
38
|
+
throw new GleifError('invalid_input', 'maxRowChars must be a positive safe integer.');
|
|
39
|
+
};
|
|
40
|
+
const abortable = async (promiseArg, signalArg) => {
|
|
41
|
+
signalArg.throwIfAborted();
|
|
42
|
+
let abort;
|
|
43
|
+
const aborted = new Promise((_, rejectArg) => {
|
|
44
|
+
abort = () => rejectArg(signalArg.reason);
|
|
45
|
+
signalArg.addEventListener('abort', abort, { once: true });
|
|
46
|
+
});
|
|
47
|
+
try {
|
|
48
|
+
return await Promise.race([promiseArg, aborted]);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
if (abort)
|
|
52
|
+
signalArg.removeEventListener('abort', abort);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
/** Official Golden Copy ZIP/CSV streams and JSON:API lookup; no files, cache or retries. */
|
|
56
|
+
export class GleifClient {
|
|
57
|
+
options;
|
|
58
|
+
goldenCopyBaseUrl;
|
|
59
|
+
restBaseUrl;
|
|
60
|
+
timeoutMs;
|
|
61
|
+
constructor(options = {}) {
|
|
62
|
+
this.options = options;
|
|
63
|
+
this.goldenCopyBaseUrl = url(options.goldenCopyBaseUrl ?? gleifGoldenCopyBaseUrl).replace(/\/$/, '');
|
|
64
|
+
this.restBaseUrl = url(options.restBaseUrl ?? gleifRestBaseUrl).replace(/\/$/, '');
|
|
65
|
+
this.timeoutMs = options.timeoutMs ?? 30 * 60 * 1000;
|
|
66
|
+
if (!Number.isSafeInteger(this.timeoutMs) || this.timeoutMs < 1 || this.timeoutMs > 2147483647)
|
|
67
|
+
throw new GleifError('invalid_input', 'timeoutMs must be a positive integer within the timer range.');
|
|
68
|
+
}
|
|
69
|
+
/** Discovers the current full file and all four delta windows from the official v2 API. */
|
|
70
|
+
async getLatestPublish(optionsArg = {}) {
|
|
71
|
+
const response = object(await this.getJson(`${this.goldenCopyBaseUrl}/golden-copies/publishes/latest`, optionsArg.signal));
|
|
72
|
+
const publish = object(response.data);
|
|
73
|
+
if (typeof publish.publish_date !== 'string' || !/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(publish.publish_date))
|
|
74
|
+
bad('date');
|
|
75
|
+
const level1 = object(publish.lei2);
|
|
76
|
+
const deltas = object(level1.delta_files);
|
|
77
|
+
const deltaFiles = Object.fromEntries(gleifDeltaKinds.map((kindArg) => [kindArg, descriptor(object(deltas[kindArg]).csv, kindArg)]));
|
|
78
|
+
return { publishDate: publish.publish_date, fullFile: descriptor(object(level1.full_file).csv, 'GoldenCopy'), deltaFiles };
|
|
79
|
+
}
|
|
80
|
+
/** Discovers once, then streams the selected full file or delta. */
|
|
81
|
+
async *streamRecords(optionsArg = {}) {
|
|
82
|
+
checkFilters(optionsArg);
|
|
83
|
+
const kind = optionsArg.kind ?? 'GoldenCopy';
|
|
84
|
+
if (kind !== 'GoldenCopy' && !gleifDeltaKinds.includes(kind))
|
|
85
|
+
throw new GleifError('invalid_input', 'Unknown Golden Copy file kind.');
|
|
86
|
+
const publish = await this.getLatestPublish(optionsArg);
|
|
87
|
+
yield* this.readGoldenCopy(kind === 'GoldenCopy' ? publish.fullFile : publish.deltaFiles[kind], optionsArg);
|
|
88
|
+
}
|
|
89
|
+
/** Streams a discovered descriptor. Breaking iteration cancels the response immediately. */
|
|
90
|
+
async *readGoldenCopy(fileArg, optionsArg = {}) {
|
|
91
|
+
checkFilters(optionsArg);
|
|
92
|
+
if (fileArg.format !== 'csv' || fileArg.cdfVersion !== 'LEI_3.1' || !['GoldenCopy', ...gleifDeltaKinds].includes(fileArg.kind) || !Number.isSafeInteger(fileArg.size) || fileArg.size < 1 || !Number.isSafeInteger(fileArg.recordCount) || fileArg.recordCount < 0) {
|
|
93
|
+
throw new GleifError('invalid_input', 'Expected a discovered LEI-CDF 3.1 ZIP/CSV descriptor.');
|
|
94
|
+
}
|
|
95
|
+
const uri = url(fileArg.url);
|
|
96
|
+
let compressedBytes = 0;
|
|
97
|
+
const response = this.requestBytes(uri, optionsArg.signal, 'application/zip');
|
|
98
|
+
async function* counted() {
|
|
99
|
+
for await (const chunk of response) {
|
|
100
|
+
compressedBytes += chunk.length;
|
|
101
|
+
yield chunk;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
let mapper;
|
|
105
|
+
let records = 0;
|
|
106
|
+
for await (const row of parseCsvRows(unzipCsv(counted()), optionsArg.maxRowChars)) {
|
|
107
|
+
if (optionsArg.signal?.aborted)
|
|
108
|
+
throw new GleifError('aborted', 'GLEIF iteration was aborted.');
|
|
109
|
+
if (!mapper) {
|
|
110
|
+
mapper = csvRecordMapper(row);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const record = mapper(row);
|
|
114
|
+
records++;
|
|
115
|
+
if ((!optionsArg.country || record.legalAddress.country === optionsArg.country) && (!optionsArg.jurisdiction || record.jurisdiction === optionsArg.jurisdiction))
|
|
116
|
+
yield record;
|
|
117
|
+
}
|
|
118
|
+
if (!mapper)
|
|
119
|
+
throw new GleifError('invalid_csv', 'Golden Copy CSV has no header.');
|
|
120
|
+
if (compressedBytes !== fileArg.size || records !== fileArg.recordCount)
|
|
121
|
+
throw new GleifError('unexpected_answer', `Golden Copy totals differ from its descriptor: ${compressedBytes} bytes, ${records} records.`);
|
|
122
|
+
}
|
|
123
|
+
/** One LEI using the documented public JSON:API resource, mapped to the same record type. */
|
|
124
|
+
async lookup(leiArg, optionsArg = {}) {
|
|
125
|
+
if (!/^[A-Z0-9]{18}\d{2}$/.test(leiArg))
|
|
126
|
+
throw new GleifError('invalid_input', 'Expected a 20-character LEI.');
|
|
127
|
+
const record = parseGleifRestRecord(await this.getJson(`${this.restBaseUrl}/lei-records/${leiArg}`, optionsArg.signal));
|
|
128
|
+
if (record.lei !== leiArg)
|
|
129
|
+
throw new GleifError('unexpected_answer', 'GLEIF answered with a different LEI.');
|
|
130
|
+
return record;
|
|
131
|
+
}
|
|
132
|
+
async getJson(uriArg, signalArg) {
|
|
133
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
134
|
+
let text = '';
|
|
135
|
+
let bytes = 0;
|
|
136
|
+
try {
|
|
137
|
+
for await (const chunk of this.requestBytes(uriArg, signalArg, 'application/vnd.api+json, application/json')) {
|
|
138
|
+
bytes += chunk.length;
|
|
139
|
+
if (bytes > 2 * 1024 * 1024)
|
|
140
|
+
throw new GleifError('record_limit', 'GLEIF metadata/lookup exceeds 2 MiB.');
|
|
141
|
+
text += decoder.decode(chunk, { stream: true });
|
|
142
|
+
}
|
|
143
|
+
return JSON.parse(text + decoder.decode());
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (error instanceof GleifError)
|
|
147
|
+
throw error;
|
|
148
|
+
throw new GleifError('unexpected_answer', 'GLEIF did not answer with valid JSON.', undefined, { cause: error });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async *requestBytes(uriArg, signalArg, acceptArg) {
|
|
152
|
+
const controller = new AbortController();
|
|
153
|
+
const signal = signalArg ? AbortSignal.any([signalArg, controller.signal]) : controller.signal;
|
|
154
|
+
const timer = setTimeout(() => controller.abort(new Error('GLEIF request timed out.')), this.timeoutMs);
|
|
155
|
+
let reader;
|
|
156
|
+
let ended = false;
|
|
157
|
+
let failed = false;
|
|
158
|
+
try {
|
|
159
|
+
signal.throwIfAborted();
|
|
160
|
+
const headers = { Accept: acceptArg };
|
|
161
|
+
if (this.options.userAgent)
|
|
162
|
+
headers['User-Agent'] = this.options.userAgent;
|
|
163
|
+
const response = await abortable((this.options.fetch ?? globalThis.fetch)(uriArg, { headers, signal }), signal);
|
|
164
|
+
if (response.status !== 200) {
|
|
165
|
+
await response.body?.cancel();
|
|
166
|
+
throw new GleifError(response.status === 404 ? 'not_found' : 'http_error', `GLEIF answered HTTP ${response.status}.`, response.status);
|
|
167
|
+
}
|
|
168
|
+
if (!response.body)
|
|
169
|
+
throw new GleifError('unexpected_answer', 'GLEIF response has no body.');
|
|
170
|
+
reader = response.body.getReader();
|
|
171
|
+
while (true) {
|
|
172
|
+
const chunk = await abortable(reader.read(), signal);
|
|
173
|
+
if (chunk.done) {
|
|
174
|
+
ended = true;
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
signal.throwIfAborted();
|
|
178
|
+
yield chunk.value;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
failed = true;
|
|
183
|
+
if (signal.aborted)
|
|
184
|
+
throw new GleifError(signalArg?.aborted ? 'aborted' : 'timeout', 'GLEIF request ended before completion.', undefined, { cause: error });
|
|
185
|
+
if (error instanceof GleifError)
|
|
186
|
+
throw error;
|
|
187
|
+
throw new GleifError('unreachable', 'Could not read the GLEIF response.', undefined, { cause: error });
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
clearTimeout(timer);
|
|
191
|
+
try {
|
|
192
|
+
if (reader) {
|
|
193
|
+
try {
|
|
194
|
+
if (!ended)
|
|
195
|
+
await reader.cancel();
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
// An already failed/aborted reader rejects cancellation with its existing error.
|
|
199
|
+
// Preserve the primary error; normal loop exit must still report cleanup failures.
|
|
200
|
+
if (!failed && !signal.aborted)
|
|
201
|
+
throw new GleifError('unreachable', 'Could not cancel the GLEIF response.', undefined, { cause: error });
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
reader.releaseLock();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
controller.abort();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nbGVpZmNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2dsZWlmL2NsYXNzZXMuZ2xlaWZjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcscUNBQXFDLENBQUM7QUFDNUUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsOEJBQThCLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUEyQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRXhHLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBZ0IsRUFBUyxFQUFFLEdBQUcsTUFBTSxJQUFJLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSw2QkFBNkIsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsSSxNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQWlCLEVBQTJCLEVBQUUsQ0FDNUQsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQW1DLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM3SCxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQWlCLEVBQVUsRUFBRTtJQUN4QyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLGVBQWUsRUFBRSwwQkFB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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type TGleifErrorCode = 'invalid_input' | 'http_error' | 'not_found' | 'unreachable' | 'timeout' | 'aborted' | 'unexpected_answer' | 'invalid_archive' | 'invalid_csv' | 'record_limit';
|
|
2
|
+
export declare class GleifError extends Error {
|
|
3
|
+
readonly code: TGleifErrorCode;
|
|
4
|
+
readonly httpStatus?: number | undefined;
|
|
5
|
+
constructor(code: TGleifErrorCode, messageArg: string, httpStatus?: number | undefined, optionsArg?: ErrorOptions);
|
|
6
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class GleifError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
httpStatus;
|
|
4
|
+
constructor(code, messageArg, httpStatus, optionsArg) {
|
|
5
|
+
super(messageArg, optionsArg);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.httpStatus = httpStatus;
|
|
8
|
+
this.name = 'GleifError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5nbGVpZmVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZ2xlaWYvY2xhc3Nlcy5nbGVpZmVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUNQLElBQUk7SUFBdUQsVUFBVTtJQUFqRyxZQUE0QixJQUFxQixFQUFFLFVBQWtCLEVBQWtCLFVBQW1CLEVBQUUsVUFBeUI7UUFDbkksS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFESixJQUFJOzBCQUF1RCxVQUFVO1FBRS9GLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQzNCLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IRegisterCourt, IRegisterReference } from '../handelsregister/interfaces.js';
|
|
2
|
+
import type { IGleifRegisterNumber } from './interfaces.js';
|
|
3
|
+
export declare const courtFromRegistrationAuthority: (raCodeArg: string) => IRegisterCourt | undefined;
|
|
4
|
+
export declare const registrationAuthorityFromCourt: (courtCodeArg: string) => string | undefined;
|
|
5
|
+
/** Anchored identifier only, with canonical type and location suffix; never guesses a register type. */
|
|
6
|
+
export declare const parseRegistrationAuthorityEntityId: (entityIdArg: string) => IGleifRegisterNumber | undefined;
|
|
7
|
+
export declare const registerReferenceFromRegistrationAuthority: (raCodeArg: string, entityIdArg: string) => IRegisterReference | undefined;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { registerCourts } from '../handelsregister/data.codelists.js';
|
|
2
|
+
import { formatRegisterNumber, parseRegisterNumber, toRegisterType } from '../handelsregister/references.js';
|
|
3
|
+
import { germanRegistrationAuthorities } from './data.crosswalk.js';
|
|
4
|
+
export const courtFromRegistrationAuthority = (raCodeArg) => {
|
|
5
|
+
const courtCode = germanRegistrationAuthorities.find((authorityArg) => authorityArg.raCode === raCodeArg)?.courtCode;
|
|
6
|
+
return courtCode ? registerCourts.find((courtArg) => courtArg.code === courtCode) : undefined;
|
|
7
|
+
};
|
|
8
|
+
export const registrationAuthorityFromCourt = (courtCodeArg) => germanRegistrationAuthorities.find((authorityArg) => authorityArg.courtCode === courtCodeArg)?.raCode;
|
|
9
|
+
/** Anchored identifier only, with canonical type and location suffix; never guesses a register type. */
|
|
10
|
+
export const parseRegistrationAuthorityEntityId = (entityIdArg) => {
|
|
11
|
+
if (typeof entityIdArg !== 'string')
|
|
12
|
+
return undefined;
|
|
13
|
+
const match = /^(HRA|HRB|GnR|PR|VR|GsR)\s*\.?\s*(?:Nr\.?\s*)?(\d{1,9}(?:\s*[A-Za-zÄÖÜäöü]{1,5})?)$/i.exec(entityIdArg.trim());
|
|
14
|
+
if (!match)
|
|
15
|
+
return undefined;
|
|
16
|
+
const type = toRegisterType(match[1]);
|
|
17
|
+
const number = parseRegisterNumber(match[2]);
|
|
18
|
+
return type && number ? { type, number: formatRegisterNumber(number) } : undefined;
|
|
19
|
+
};
|
|
20
|
+
export const registerReferenceFromRegistrationAuthority = (raCodeArg, entityIdArg) => {
|
|
21
|
+
const court = courtFromRegistrationAuthority(raCodeArg);
|
|
22
|
+
const number = parseRegistrationAuthorityEntityId(entityIdArg);
|
|
23
|
+
return court && number ? { court, ...number } : undefined;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvc3N3YWxrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZ2xlaWYvY3Jvc3N3YWxrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFN0csT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEUsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxTQUFpQixFQUE4QixFQUFFO0lBQzlGLE1BQU0sU0FBUyxHQUFHLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUM7SUFDckgsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoRyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLFlBQW9CLEVBQXNCLEVBQUUsQ0FDekYsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUV4Ryx3R0FBd0c7QUFDeEcsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsQ0FBQyxXQUFtQixFQUFvQyxFQUFFO0lBQzFHLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RELE1BQU0sS0FBSyxHQUFHLHNGQUFzRixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5SCxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxPQUFPLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDckYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMENBQTBDLEdBQUcsQ0FBQyxTQUFpQixFQUFFLFdBQW1CLEVBQWtDLEVBQUU7SUFDbkksTUFBTSxLQUFLLEdBQUcsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsa0NBQWtDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0QsT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDNUQsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { GleifError } from './classes.gleiferror.js';
|
|
2
|
+
/** Strict incremental CSV: quoted commas, doubled quotes, embedded CR/LF and split UTF-8. */
|
|
3
|
+
export async function* parseCsvRows(sourceArg, maxRowCharsArg = 1024 * 1024) {
|
|
4
|
+
if (!Number.isSafeInteger(maxRowCharsArg) || maxRowCharsArg < 1) {
|
|
5
|
+
throw new GleifError('invalid_input', 'maxRowChars must be a positive safe integer.');
|
|
6
|
+
}
|
|
7
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
8
|
+
const parser = { state: 'start' };
|
|
9
|
+
let field = '';
|
|
10
|
+
let row = [];
|
|
11
|
+
let rowChars = 0;
|
|
12
|
+
let skipLf = false;
|
|
13
|
+
function* read(textArg) {
|
|
14
|
+
for (const character of textArg) {
|
|
15
|
+
if (skipLf) {
|
|
16
|
+
skipLf = false;
|
|
17
|
+
if (character === '\n')
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (++rowChars > maxRowCharsArg)
|
|
21
|
+
throw new GleifError('record_limit', 'CSV row exceeds maxRowChars.');
|
|
22
|
+
if (parser.state === 'quoted') {
|
|
23
|
+
if (character === '"')
|
|
24
|
+
parser.state = 'closed';
|
|
25
|
+
else
|
|
26
|
+
field += character;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (parser.state === 'closed' && character === '"') {
|
|
30
|
+
field += '"';
|
|
31
|
+
parser.state = 'quoted';
|
|
32
|
+
}
|
|
33
|
+
else if (character === ',') {
|
|
34
|
+
row.push(field);
|
|
35
|
+
field = '';
|
|
36
|
+
parser.state = 'start';
|
|
37
|
+
}
|
|
38
|
+
else if (character === '\n' || character === '\r') {
|
|
39
|
+
row.push(field);
|
|
40
|
+
// Empty physical lines are not records.
|
|
41
|
+
if (row.length !== 1 || row[0] !== '')
|
|
42
|
+
yield row;
|
|
43
|
+
row = [];
|
|
44
|
+
field = '';
|
|
45
|
+
parser.state = 'start';
|
|
46
|
+
rowChars = 0;
|
|
47
|
+
skipLf = character === '\r';
|
|
48
|
+
}
|
|
49
|
+
else if (parser.state === 'start' && character === '"') {
|
|
50
|
+
parser.state = 'quoted';
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
if (parser.state === 'closed' || character === '"')
|
|
54
|
+
throw new GleifError('invalid_csv', 'Unexpected character outside a quoted CSV field.');
|
|
55
|
+
field += character;
|
|
56
|
+
parser.state = 'unquoted';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
for await (const chunk of sourceArg)
|
|
62
|
+
yield* read(decoder.decode(chunk, { stream: true }));
|
|
63
|
+
yield* read(decoder.decode());
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
if (error instanceof TypeError)
|
|
67
|
+
throw new GleifError('invalid_csv', 'CSV is not valid UTF-8.', undefined, { cause: error });
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
if (parser.state === 'quoted')
|
|
71
|
+
throw new GleifError('invalid_csv', 'Unterminated quoted CSV field.');
|
|
72
|
+
if (field !== '' || row.length || parser.state !== 'start')
|
|
73
|
+
yield [...row, field];
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZ2xlaWYvY3N2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRCw2RkFBNkY7QUFDN0YsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQW9DLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxJQUFJO0lBQ3BHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksVUFBVSxDQUFDLGVBQWUsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBMEQsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDekYsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsSUFBSSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQWU7UUFDNUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ2YsSUFBSSxTQUFTLEtBQUssSUFBSTtvQkFBRSxTQUFTO1lBQ25DLENBQUM7WUFDRCxJQUFJLEVBQUUsUUFBUSxHQUFHLGNBQWM7Z0JBQUUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsOEJBQThCLENBQUMsQ0FBQztZQUN0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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Generated by scripts/generate.gleif-crosswalk.ts; GLEIF RA list v1.9, 2026-09-30, CC0.
|
|
2
|
+
* Source: https://www.gleif.org/lei-data/code-lists/gleif-registration-authorities-list/2026-09-30_ra-list-v1.9.csv
|
|
3
|
+
* Every German RA and every opendata register court is accounted for. */
|
|
4
|
+
import type { IGleifRegistrationAuthority, IGleifUnmappedCourt } from './interfaces.js';
|
|
5
|
+
export declare const gleifRegistrationAuthoritiesSource: {
|
|
6
|
+
readonly version: "1.9";
|
|
7
|
+
readonly date: "2026-09-30";
|
|
8
|
+
readonly url: "https://www.gleif.org/lei-data/code-lists/gleif-registration-authorities-list/2026-09-30_ra-list-v1.9.csv";
|
|
9
|
+
readonly licence: "CC0-1.0";
|
|
10
|
+
};
|
|
11
|
+
export declare const germanRegistrationAuthorities: readonly IGleifRegistrationAuthority[];
|
|
12
|
+
export declare const gleifUnmappedCourts: readonly IGleifUnmappedCourt[];
|