@fin.cx/opendata 4.8.0 → 4.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- 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/handelsregister/data.codelists.d.ts +2 -0
- package/dist_ts/handelsregister/data.codelists.js +10 -10
- package/dist_ts/handelsregister/interfaces.d.ts +5 -1
- package/dist_ts/handelsregister/parse.structuredcontent.js +6 -4
- package/dist_ts/plugins.d.ts +2 -0
- package/dist_ts/plugins.js +4 -1
- package/package.json +7 -2
- package/readme.md +79 -4
- package/ts/00_commitinfo_data.ts +1 -1
- 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/handelsregister/data.codelists.ts +11 -9
- package/ts/handelsregister/interfaces.ts +5 -1
- package/ts/handelsregister/parse.structuredcontent.ts +5 -3
- package/ts/plugins.ts +4 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/opendata',
|
|
6
|
-
version: '4.
|
|
6
|
+
version: '4.9.1',
|
|
7
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
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHNiQUFzYjtDQUNwYyxDQUFBIn0=
|
|
@@ -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[];
|