@fin.cx/opendata 4.3.1 → 4.4.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 +5 -2
- package/dist_ts/00_commitinfo_data.js +3 -3
- package/dist_ts/cpi/classes.bundesbankcpiclient.d.ts +25 -0
- package/dist_ts/cpi/classes.bundesbankcpiclient.js +250 -0
- package/dist_ts/cpi/classes.cpierror.d.ts +44 -0
- package/dist_ts/cpi/classes.cpierror.js +30 -0
- package/dist_ts/cpi/constants.d.ts +24 -0
- package/dist_ts/cpi/constants.js +25 -0
- package/dist_ts/cpi/decimal.d.ts +13 -0
- package/dist_ts/cpi/decimal.js +33 -0
- package/dist_ts/cpi/index.d.ts +5 -0
- package/dist_ts/cpi/index.js +9 -0
- package/dist_ts/cpi/indexmath.d.ts +35 -0
- package/dist_ts/cpi/indexmath.js +163 -0
- package/dist_ts/cpi/interfaces.d.ts +120 -0
- package/dist_ts/cpi/interfaces.js +2 -0
- package/dist_ts/cpi/request.d.ts +9 -0
- package/dist_ts/cpi/request.js +45 -0
- package/dist_ts/plugins.d.ts +1 -2
- package/dist_ts/plugins.js +2 -3
- package/package.json +14 -7
- package/readme.md +83 -3
- package/ts/00_commitinfo_data.ts +2 -2
- package/ts/cpi/classes.bundesbankcpiclient.ts +292 -0
- package/ts/cpi/classes.cpierror.ts +76 -0
- package/ts/cpi/constants.ts +28 -0
- package/ts/cpi/decimal.ts +45 -0
- package/ts/cpi/index.ts +16 -0
- package/ts/cpi/indexmath.ts +182 -0
- package/ts/cpi/interfaces.ts +137 -0
- package/ts/cpi/request.ts +49 -0
- package/ts/plugins.ts +0 -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, 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, 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",
|
|
@@ -27,7 +27,10 @@
|
|
|
27
27
|
"Feiertage",
|
|
28
28
|
"working days",
|
|
29
29
|
"Basiszinssatz",
|
|
30
|
-
"base rate"
|
|
30
|
+
"base rate",
|
|
31
|
+
"consumer price index",
|
|
32
|
+
"Verbraucherpreisindex",
|
|
33
|
+
"index clause"
|
|
31
34
|
]
|
|
32
35
|
},
|
|
33
36
|
"release": {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@fin.cx/opendata',
|
|
6
|
-
version: '4.
|
|
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, and stock and crypto prices and fundamentals from several providers.'
|
|
6
|
+
version: '4.4.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.'
|
|
8
8
|
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxrQkFBa0I7SUFDeEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDBXQUEwVztDQUN4WCxDQUFBIn0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ICpiAnnualInput, ICpiClientOptions, ICpiMonthlyInput, ICpiReading, ICpiSeries } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* The Verbraucherpreisindex für Deutschland (overall index, unadjusted) of the Statistisches Bundesamt as
|
|
4
|
+
* the Deutsche Bundesbank republishes it in its time series API (`bundesbankCpiBaseUrl`), monthly and as
|
|
5
|
+
* annual averages. Each answer names its base, and the values the Bundesbank marks as its own estimate
|
|
6
|
+
* (the latest month at times) are kept apart from the published ones. Nothing is kept: each answer goes
|
|
7
|
+
* to the caller with the source note to show and the answer as it arrived.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BundesbankCpiClient {
|
|
10
|
+
private readonly options;
|
|
11
|
+
private readonly baseUrl;
|
|
12
|
+
constructor(options?: ICpiClientOptions);
|
|
13
|
+
/** The months from `from` to `to`, both included, or to the latest one when `to` is left out. */
|
|
14
|
+
getMonthly(inputArg: ICpiMonthlyInput): Promise<ICpiSeries>;
|
|
15
|
+
/** The annual averages from `from` to `to`, both included, or to the latest one when `to` is left out. */
|
|
16
|
+
getAnnual(inputArg: ICpiAnnualInput): Promise<ICpiSeries>;
|
|
17
|
+
/**
|
|
18
|
+
* The published value of one month. A month with only the Bundesbank's estimate, or with nothing yet,
|
|
19
|
+
* ends in `not_published`, the estimate in the error where there is one.
|
|
20
|
+
*/
|
|
21
|
+
getMonth(monthArg: string, optionsArg?: {
|
|
22
|
+
signal?: AbortSignal;
|
|
23
|
+
}): Promise<ICpiReading>;
|
|
24
|
+
private getSeries;
|
|
25
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { CpiError } from './classes.cpierror.js';
|
|
2
|
+
import { bundesbankCpiBaseUrl, bundesbankVpiAnnualKey, bundesbankVpiFirstMonth, bundesbankVpiFirstYear, bundesbankVpiMonthlyKey, destatisLicence, } from './constants.js';
|
|
3
|
+
import { parseDecimal } from './decimal.js';
|
|
4
|
+
import { frequencyOf } from './indexmath.js';
|
|
5
|
+
import { getText, timeoutOf } from './request.js';
|
|
6
|
+
/**
|
|
7
|
+
* The columns of the API's SDMX-CSV answer this client reads. The API leaves out a column that is empty
|
|
8
|
+
* in every row: `OBS_STATUS` appears only where a value carries a status.
|
|
9
|
+
*/
|
|
10
|
+
const COLUMNS = ['BBK_STD_FREQ', 'TIME_PERIOD', 'OBS_VALUE', 'BBK_DECIMALS', 'BBK_ID', 'BBK_UNIT', 'BBK_TITLE'];
|
|
11
|
+
const STATUS_COLUMN = 'OBS_STATUS';
|
|
12
|
+
/** The key of the overall index for Germany on one base, as the answer names it. */
|
|
13
|
+
const SERIES_KEY = /^BBDP1\.([MA])\.DE\.N\.VPI\.C\.A00000\.I(\d{2})\.A$/u;
|
|
14
|
+
const UNIT = /^(\d{4})=100$/u;
|
|
15
|
+
const FREQUENCY_CODES = { monthly: 'M', annual: 'A' };
|
|
16
|
+
/** What the API's `OBS_STATUS` says about a value; any other flag is not read. */
|
|
17
|
+
const STATUSES = { '': 'final', E: 'estimated' };
|
|
18
|
+
/** One line of semicolon-separated values; a field in double quotes may hold separators and doubled quotes. */
|
|
19
|
+
const splitLine = (lineArg) => {
|
|
20
|
+
const fields = [];
|
|
21
|
+
let field = '';
|
|
22
|
+
let quoted = false;
|
|
23
|
+
for (let position = 0; position < lineArg.length; position++) {
|
|
24
|
+
const character = lineArg[position];
|
|
25
|
+
if (quoted) {
|
|
26
|
+
if (character === '"' && lineArg[position + 1] === '"') {
|
|
27
|
+
field += '"';
|
|
28
|
+
position++;
|
|
29
|
+
}
|
|
30
|
+
else if (character === '"') {
|
|
31
|
+
quoted = false;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
field += character;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (character === '"' && field === '') {
|
|
38
|
+
quoted = true;
|
|
39
|
+
}
|
|
40
|
+
else if (character === ';') {
|
|
41
|
+
fields.push(field);
|
|
42
|
+
field = '';
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
field += character;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (quoted) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
fields.push(field);
|
|
52
|
+
return fields;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* The Verbraucherpreisindex für Deutschland (overall index, unadjusted) of the Statistisches Bundesamt as
|
|
56
|
+
* the Deutsche Bundesbank republishes it in its time series API (`bundesbankCpiBaseUrl`), monthly and as
|
|
57
|
+
* annual averages. Each answer names its base, and the values the Bundesbank marks as its own estimate
|
|
58
|
+
* (the latest month at times) are kept apart from the published ones. Nothing is kept: each answer goes
|
|
59
|
+
* to the caller with the source note to show and the answer as it arrived.
|
|
60
|
+
*/
|
|
61
|
+
export class BundesbankCpiClient {
|
|
62
|
+
options;
|
|
63
|
+
baseUrl;
|
|
64
|
+
constructor(options = {}) {
|
|
65
|
+
this.options = options;
|
|
66
|
+
timeoutOf(options);
|
|
67
|
+
this.baseUrl = (options.baseUrl ?? bundesbankCpiBaseUrl).replace(/\/?$/u, '/');
|
|
68
|
+
}
|
|
69
|
+
/** The months from `from` to `to`, both included, or to the latest one when `to` is left out. */
|
|
70
|
+
async getMonthly(inputArg) {
|
|
71
|
+
return this.getSeries({ frequency: 'monthly', from: inputArg.from, ...(inputArg.to !== undefined ? { to: inputArg.to } : {}) }, inputArg.signal);
|
|
72
|
+
}
|
|
73
|
+
/** The annual averages from `from` to `to`, both included, or to the latest one when `to` is left out. */
|
|
74
|
+
async getAnnual(inputArg) {
|
|
75
|
+
return this.getSeries({ frequency: 'annual', from: inputArg.from, ...(inputArg.to !== undefined ? { to: inputArg.to } : {}) }, inputArg.signal);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The published value of one month. A month with only the Bundesbank's estimate, or with nothing yet,
|
|
79
|
+
* ends in `not_published`, the estimate in the error where there is one.
|
|
80
|
+
*/
|
|
81
|
+
async getMonth(monthArg, optionsArg = {}) {
|
|
82
|
+
const series = await this.getSeries({ frequency: 'monthly', from: monthArg, to: monthArg }, optionsArg.signal);
|
|
83
|
+
const value = series.values[0];
|
|
84
|
+
if (!value) {
|
|
85
|
+
const estimate = series.estimates[0];
|
|
86
|
+
const message = estimate
|
|
87
|
+
? `the index for ${monthArg} is not published yet; the Bundesbank gives only its own estimate (${estimate.value}).`
|
|
88
|
+
: `the index for ${monthArg} is not published yet.`;
|
|
89
|
+
throw new CpiError('not_published', message, {
|
|
90
|
+
service: 'bundesbank',
|
|
91
|
+
httpStatus: series.answer.httpStatus,
|
|
92
|
+
answer: series.answer,
|
|
93
|
+
period: monthArg,
|
|
94
|
+
...(estimate ? { estimate } : {}),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return { ...value, source: series.source, answer: series.answer };
|
|
98
|
+
}
|
|
99
|
+
async getSeries(rangeArg, signalArg) {
|
|
100
|
+
checkRange(rangeArg);
|
|
101
|
+
const key = rangeArg.frequency === 'monthly' ? bundesbankVpiMonthlyKey : bundesbankVpiAnnualKey;
|
|
102
|
+
const uri = `${this.baseUrl}${key}?startPeriod=${rangeArg.from}${rangeArg.to !== undefined ? `&endPeriod=${rangeArg.to}` : ''}`;
|
|
103
|
+
const answer = await getText(this.options, uri, signalArg);
|
|
104
|
+
const refused = (codeArg, messageArg) => new CpiError(codeArg, messageArg, { service: 'bundesbank', httpStatus: answer.httpStatus, answer });
|
|
105
|
+
if (answer.httpStatus === 404) {
|
|
106
|
+
throw refused('series_withdrawn', `the Bundesbank has no series ${key}: it answered 404.`);
|
|
107
|
+
}
|
|
108
|
+
if (answer.httpStatus === 429) {
|
|
109
|
+
throw refused('busy', 'the Bundesbank refused the request as one too many (429).');
|
|
110
|
+
}
|
|
111
|
+
if (answer.httpStatus >= 500 && answer.httpStatus <= 599) {
|
|
112
|
+
throw refused('unavailable', `the Bundesbank cannot answer now (${answer.httpStatus}).`);
|
|
113
|
+
}
|
|
114
|
+
if (answer.httpStatus !== 200) {
|
|
115
|
+
throw refused('unexpected_answer', `the Bundesbank answered ${answer.httpStatus}.`);
|
|
116
|
+
}
|
|
117
|
+
const read = readAnswer(answer.text, rangeArg, (messageArg) => refused('unexpected_answer', messageArg));
|
|
118
|
+
if (!read) {
|
|
119
|
+
throw new CpiError('not_published', `the Bundesbank has no value from ${rangeArg.from}${rangeArg.to !== undefined ? ` to ${rangeArg.to}` : ' on'} yet.`, {
|
|
120
|
+
service: 'bundesbank',
|
|
121
|
+
httpStatus: answer.httpStatus,
|
|
122
|
+
answer,
|
|
123
|
+
period: rangeArg.from,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
index: 'de-vpi',
|
|
128
|
+
frequency: rangeArg.frequency,
|
|
129
|
+
base: read.base,
|
|
130
|
+
baseYear: read.baseYear,
|
|
131
|
+
values: read.values,
|
|
132
|
+
estimates: read.estimates,
|
|
133
|
+
source: sourceNoteOf(read, uri),
|
|
134
|
+
answer,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** A range of the series' periods, or the reason it is none. */
|
|
139
|
+
const checkRange = (rangeArg) => {
|
|
140
|
+
const written = rangeArg.frequency === 'monthly' ? 'YYYY-MM' : 'YYYY';
|
|
141
|
+
for (const period of [rangeArg.from, rangeArg.to]) {
|
|
142
|
+
if (period !== undefined && frequencyOf(period) !== rangeArg.frequency) {
|
|
143
|
+
throw new CpiError('invalid_input', `${JSON.stringify(period)} is no period written ${written}.`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (rangeArg.to !== undefined && rangeArg.to < rangeArg.from) {
|
|
147
|
+
throw new CpiError('invalid_input', `the range ends (${rangeArg.to}) before it begins (${rangeArg.from}).`);
|
|
148
|
+
}
|
|
149
|
+
const first = rangeArg.frequency === 'monthly' ? bundesbankVpiFirstMonth : bundesbankVpiFirstYear;
|
|
150
|
+
if (rangeArg.from < first) {
|
|
151
|
+
throw new CpiError('before_first_period', `${rangeArg.from} lies before ${first}, the first period of the series.`, { period: rangeArg.from });
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* The values of an SDMX-CSV answer, or `undefined` where it holds none. An answer is read only where every
|
|
156
|
+
* row is of the series and the frequency asked for, of one key and one base, inside the range asked for,
|
|
157
|
+
* once per period, with a value of the digits the answer states and a status this client knows.
|
|
158
|
+
*/
|
|
159
|
+
const readAnswer = (textArg, rangeArg, unreadableArg) => {
|
|
160
|
+
const lines = textArg.replace(/^/u, '').split(/\r?\n/u).filter((lineArg) => lineArg !== '');
|
|
161
|
+
const header = lines[0] === undefined ? undefined : splitLine(lines[0]);
|
|
162
|
+
if (!header || header[0] !== 'DATAFLOW') {
|
|
163
|
+
throw unreadableArg('the answer is no SDMX-CSV of the Bundesbank.');
|
|
164
|
+
}
|
|
165
|
+
const rows = lines.slice(1);
|
|
166
|
+
if (rows.length === 0) {
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
const missing = COLUMNS.filter((columnArg) => !header.includes(columnArg));
|
|
170
|
+
if (missing.length > 0) {
|
|
171
|
+
throw unreadableArg(`the answer has no column ${missing.join(', ')}.`);
|
|
172
|
+
}
|
|
173
|
+
const at = (fieldsArg, columnArg) => {
|
|
174
|
+
const position = header.indexOf(columnArg);
|
|
175
|
+
return position < 0 ? '' : fieldsArg[position] ?? '';
|
|
176
|
+
};
|
|
177
|
+
const values = [];
|
|
178
|
+
const estimates = [];
|
|
179
|
+
const periods = new Set();
|
|
180
|
+
let key;
|
|
181
|
+
let title = '';
|
|
182
|
+
let base = '';
|
|
183
|
+
let baseYear = 0;
|
|
184
|
+
for (const row of rows) {
|
|
185
|
+
const fields = splitLine(row);
|
|
186
|
+
if (!fields || fields.length !== header.length) {
|
|
187
|
+
throw unreadableArg(`a row is not of the answer's columns: ${row}`);
|
|
188
|
+
}
|
|
189
|
+
const rowKey = at(fields, 'BBK_ID');
|
|
190
|
+
const keyMatch = SERIES_KEY.exec(rowKey);
|
|
191
|
+
const unitMatch = UNIT.exec(at(fields, 'BBK_UNIT'));
|
|
192
|
+
const frequencyCode = FREQUENCY_CODES[rangeArg.frequency];
|
|
193
|
+
if (!keyMatch || keyMatch[1] !== frequencyCode || at(fields, 'BBK_STD_FREQ') !== frequencyCode) {
|
|
194
|
+
throw unreadableArg(`${JSON.stringify(rowKey)} is not the ${rangeArg.frequency} series of the overall index for Germany.`);
|
|
195
|
+
}
|
|
196
|
+
if (!unitMatch || unitMatch[1].slice(2) !== keyMatch[2]) {
|
|
197
|
+
throw unreadableArg(`${JSON.stringify(at(fields, 'BBK_UNIT'))} is no base of the series ${rowKey}.`);
|
|
198
|
+
}
|
|
199
|
+
if (key !== undefined && key !== rowKey) {
|
|
200
|
+
throw unreadableArg(`the answer holds more than one series or base: ${key} and ${rowKey}.`);
|
|
201
|
+
}
|
|
202
|
+
key = rowKey;
|
|
203
|
+
title = at(fields, 'BBK_TITLE');
|
|
204
|
+
base = unitMatch[0];
|
|
205
|
+
baseYear = Number(unitMatch[1]);
|
|
206
|
+
const period = at(fields, 'TIME_PERIOD');
|
|
207
|
+
if (frequencyOf(period) !== rangeArg.frequency || period < rangeArg.from || (rangeArg.to !== undefined && period > rangeArg.to)) {
|
|
208
|
+
throw unreadableArg(`${JSON.stringify(period)} is not a period asked for.`);
|
|
209
|
+
}
|
|
210
|
+
if (periods.has(period)) {
|
|
211
|
+
throw unreadableArg(`${period} is answered twice.`);
|
|
212
|
+
}
|
|
213
|
+
periods.add(period);
|
|
214
|
+
const flag = at(fields, STATUS_COLUMN);
|
|
215
|
+
if (!Object.hasOwn(STATUSES, flag)) {
|
|
216
|
+
throw unreadableArg(`${JSON.stringify(flag)} is no status this client knows, for ${period}.`);
|
|
217
|
+
}
|
|
218
|
+
const status = STATUSES[flag];
|
|
219
|
+
const written = at(fields, 'OBS_VALUE');
|
|
220
|
+
if (written === '' || written === 'NaN') {
|
|
221
|
+
// a period without a value has no observation
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const decimals = Number(at(fields, 'BBK_DECIMALS'));
|
|
225
|
+
const decimal = parseDecimal(written);
|
|
226
|
+
if (!Number.isSafeInteger(decimals) || decimals < 0 || decimals > 6 || !decimal || decimal.units <= 0n || decimal.scale > decimals) {
|
|
227
|
+
throw unreadableArg(`${JSON.stringify(written)} is no index value of ${at(fields, 'BBK_DECIMALS')} decimals, for ${period}.`);
|
|
228
|
+
}
|
|
229
|
+
const value = decimal.scale === decimals ? written : `${written}${decimal.scale === 0 ? '.' : ''}${'0'.repeat(decimals - decimal.scale)}`;
|
|
230
|
+
(status === 'final' ? values : estimates).push({ index: 'de-vpi', period, value, base, status });
|
|
231
|
+
}
|
|
232
|
+
if (key === undefined || values.length + estimates.length === 0) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const byPeriod = (leftArg, rightArg) => leftArg.period.localeCompare(rightArg.period);
|
|
236
|
+
return { values: values.sort(byPeriod), estimates: estimates.sort(byPeriod), base, baseYear, key, title };
|
|
237
|
+
};
|
|
238
|
+
const sourceNoteOf = (readArg, uriArg) => ({
|
|
239
|
+
source: 'bundesbank',
|
|
240
|
+
provider: 'Deutsche Bundesbank',
|
|
241
|
+
dataOrigin: 'Statistisches Bundesamt (Destatis)',
|
|
242
|
+
title: readArg.title,
|
|
243
|
+
key: readArg.key,
|
|
244
|
+
uri: uriArg,
|
|
245
|
+
licence: destatisLicence.name,
|
|
246
|
+
licenceUri: destatisLicence.uri,
|
|
247
|
+
attribution: `Quelle: Deutsche Bundesbank, Zeitreihe ${readArg.key}; Daten: Statistisches Bundesamt (Destatis), ` +
|
|
248
|
+
`Verbraucherpreisindex für Deutschland, ${readArg.base}; ${destatisLicence.name} (${destatisLicence.uri}); ${uriArg}`,
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5idW5kZXNiYW5rY3BpY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY3BpL2NsYXNzZXMuYnVuZGVzYmFua2NwaWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsZUFBZSxHQUNoQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBWTdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWxEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFVLENBQUM7QUFDekgsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDO0FBRW5DLG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsR0FBRyxzREFBc0QsQ0FBQztBQUUxRSxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztBQUU5QixNQUFNLGVBQWUsR0FBNEMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUUvRixrRkFBa0Y7QUFDbEYsTUFBTSxRQUFRLEdBQWtELEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFpQmhHLCtHQUErRztBQUMvRyxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWUsRUFBd0IsRUFBRTtJQUMxRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENB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
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ICpiServiceAnswer, ICpiValue, TCpiPeriod } from './interfaces.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why no index value or no result was given:
|
|
4
|
+
* - `invalid_input`: a period, a value, a percentage or an amount that is not one, or a range that ends
|
|
5
|
+
* before it begins;
|
|
6
|
+
* - `before_first_period`: a period before the first one the series holds;
|
|
7
|
+
* - `not_published`: no published value for the period yet: nothing at all, or only an estimate
|
|
8
|
+
* (`estimate`); a calculation given an estimate refuses it the same way;
|
|
9
|
+
* - `base_mismatch`: values of different bases, indices or frequencies, which are never compared;
|
|
10
|
+
* - `series_withdrawn`: the source no longer has the series asked for (HTTP 404), as happens to a
|
|
11
|
+
* series key of an old base after the base year changed;
|
|
12
|
+
* - `busy`: the source refuses for too many requests (HTTP 429);
|
|
13
|
+
* - `unavailable`: the source cannot answer now (HTTP 5xx);
|
|
14
|
+
* - `unreachable`: no answer arrived: the name, the connection or TLS failed;
|
|
15
|
+
* - `timeout`: the answer did not arrive within the client's time;
|
|
16
|
+
* - `aborted`: the caller's signal ended the request;
|
|
17
|
+
* - `unexpected_answer`: an answer this client cannot read: another status, a missing column, a value or
|
|
18
|
+
* a flag it does not know, a period it did not ask for, or more than one series or base.
|
|
19
|
+
*/
|
|
20
|
+
export type TCpiErrorCode = 'invalid_input' | 'before_first_period' | 'not_published' | 'base_mismatch' | 'series_withdrawn' | 'busy' | 'unavailable' | 'unreachable' | 'timeout' | 'aborted' | 'unexpected_answer';
|
|
21
|
+
export interface ICpiErrorDetails {
|
|
22
|
+
/** the source asked, where a request was sent */
|
|
23
|
+
service?: 'bundesbank';
|
|
24
|
+
/** the HTTP status of the answer, where one arrived */
|
|
25
|
+
httpStatus?: number;
|
|
26
|
+
/** the answer as it arrived, where one did */
|
|
27
|
+
answer?: ICpiServiceAnswer;
|
|
28
|
+
/** the period the refusal is about */
|
|
29
|
+
period?: TCpiPeriod;
|
|
30
|
+
/** the estimate the source gave for that period, where it gave one (`not_published`) */
|
|
31
|
+
estimate?: ICpiValue;
|
|
32
|
+
}
|
|
33
|
+
/** The typed error of `@fin.cx/opendata/cpi`. */
|
|
34
|
+
export declare class CpiError extends Error {
|
|
35
|
+
readonly code: TCpiErrorCode;
|
|
36
|
+
readonly service?: ICpiErrorDetails['service'];
|
|
37
|
+
readonly httpStatus?: number;
|
|
38
|
+
readonly answer?: ICpiServiceAnswer;
|
|
39
|
+
readonly period?: TCpiPeriod;
|
|
40
|
+
readonly estimate?: ICpiValue;
|
|
41
|
+
constructor(code: TCpiErrorCode, message: string, detailsArg?: ICpiErrorDetails, options?: {
|
|
42
|
+
cause?: unknown;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** The typed error of `@fin.cx/opendata/cpi`. */
|
|
2
|
+
export class CpiError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
service;
|
|
5
|
+
httpStatus;
|
|
6
|
+
answer;
|
|
7
|
+
period;
|
|
8
|
+
estimate;
|
|
9
|
+
constructor(code, message, detailsArg = {}, options) {
|
|
10
|
+
super(message, options);
|
|
11
|
+
this.name = 'CpiError';
|
|
12
|
+
this.code = code;
|
|
13
|
+
if (detailsArg.service !== undefined) {
|
|
14
|
+
this.service = detailsArg.service;
|
|
15
|
+
}
|
|
16
|
+
if (detailsArg.httpStatus !== undefined) {
|
|
17
|
+
this.httpStatus = detailsArg.httpStatus;
|
|
18
|
+
}
|
|
19
|
+
if (detailsArg.answer !== undefined) {
|
|
20
|
+
this.answer = detailsArg.answer;
|
|
21
|
+
}
|
|
22
|
+
if (detailsArg.period !== undefined) {
|
|
23
|
+
this.period = detailsArg.period;
|
|
24
|
+
}
|
|
25
|
+
if (detailsArg.estimate !== undefined) {
|
|
26
|
+
this.estimate = detailsArg.estimate;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jcGllcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NwaS9jbGFzc2VzLmNwaWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThDQSxpREFBaUQ7QUFDakQsTUFBTSxPQUFPLFFBQVMsU0FBUSxLQUFLO0lBQ2pCLElBQUksQ0FBZ0I7SUFDcEIsT0FBTyxDQUErQjtJQUN0QyxVQUFVLENBQVU7SUFDcEIsTUFBTSxDQUFxQjtJQUMzQixNQUFNLENBQWM7SUFDcEIsUUFBUSxDQUFhO0lBRXJDLFlBQVksSUFBbUIsRUFBRSxPQUFlLEVBQUUsYUFBK0IsRUFBRSxFQUFFLE9BQTZCO1FBQ2hILEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxVQUFVLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Deutsche Bundesbank's time series API (SDMX REST), dataflow `BBDP1`, where the Bundesbank
|
|
3
|
+
* republishes the Verbraucherpreisindex für Deutschland of the Statistisches Bundesamt ("Quelle:
|
|
4
|
+
* Statistisches Bundesamt, Wiesbaden."). Read on 2026-10-05; it answers without registration.
|
|
5
|
+
*/
|
|
6
|
+
export declare const bundesbankCpiBaseUrl = "https://api.statistiken.bundesbank.de/rest/data/BBDP1/";
|
|
7
|
+
/**
|
|
8
|
+
* The series keys of the overall index for Germany, monthly and annual average, unadjusted. The base
|
|
9
|
+
* dimension is left open (`..A`): the answer names the current base (`BBDP1.M.DE.N.VPI.C.A00000.I20.A`,
|
|
10
|
+
* 2020=100), and when the Statistisches Bundesamt changes the base year the Bundesbank withdraws the
|
|
11
|
+
* key of the old one (the `I15` key of 2015=100 answers 404).
|
|
12
|
+
*/
|
|
13
|
+
export declare const bundesbankVpiMonthlyKey = "M.DE.N.VPI.C.A00000..A";
|
|
14
|
+
export declare const bundesbankVpiAnnualKey = "A.DE.N.VPI.C.A00000..A";
|
|
15
|
+
/** The first month and year of the series (January 1991, the first one the API answers). */
|
|
16
|
+
export declare const bundesbankVpiFirstMonth = "1991-01";
|
|
17
|
+
export declare const bundesbankVpiFirstYear = "1991";
|
|
18
|
+
/** The licence under which the Statistisches Bundesamt publishes its figures. */
|
|
19
|
+
export declare const destatisLicence: {
|
|
20
|
+
readonly name: "Datenlizenz Deutschland – Namensnennung – Version 2.0";
|
|
21
|
+
readonly uri: "https://www.govdata.de/dl-de/by-2-0";
|
|
22
|
+
};
|
|
23
|
+
/** How long one request may take by default, the answer included. */
|
|
24
|
+
export declare const defaultCpiTimeoutMs = 30000;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Deutsche Bundesbank's time series API (SDMX REST), dataflow `BBDP1`, where the Bundesbank
|
|
3
|
+
* republishes the Verbraucherpreisindex für Deutschland of the Statistisches Bundesamt ("Quelle:
|
|
4
|
+
* Statistisches Bundesamt, Wiesbaden."). Read on 2026-10-05; it answers without registration.
|
|
5
|
+
*/
|
|
6
|
+
export const bundesbankCpiBaseUrl = 'https://api.statistiken.bundesbank.de/rest/data/BBDP1/';
|
|
7
|
+
/**
|
|
8
|
+
* The series keys of the overall index for Germany, monthly and annual average, unadjusted. The base
|
|
9
|
+
* dimension is left open (`..A`): the answer names the current base (`BBDP1.M.DE.N.VPI.C.A00000.I20.A`,
|
|
10
|
+
* 2020=100), and when the Statistisches Bundesamt changes the base year the Bundesbank withdraws the
|
|
11
|
+
* key of the old one (the `I15` key of 2015=100 answers 404).
|
|
12
|
+
*/
|
|
13
|
+
export const bundesbankVpiMonthlyKey = 'M.DE.N.VPI.C.A00000..A';
|
|
14
|
+
export const bundesbankVpiAnnualKey = 'A.DE.N.VPI.C.A00000..A';
|
|
15
|
+
/** The first month and year of the series (January 1991, the first one the API answers). */
|
|
16
|
+
export const bundesbankVpiFirstMonth = '1991-01';
|
|
17
|
+
export const bundesbankVpiFirstYear = '1991';
|
|
18
|
+
/** The licence under which the Statistisches Bundesamt publishes its figures. */
|
|
19
|
+
export const destatisLicence = {
|
|
20
|
+
name: 'Datenlizenz Deutschland – Namensnennung – Version 2.0',
|
|
21
|
+
uri: 'https://www.govdata.de/dl-de/by-2-0',
|
|
22
|
+
};
|
|
23
|
+
/** How long one request may take by default, the answer included. */
|
|
24
|
+
export const defaultCpiTimeoutMs = 30_000;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY3BpL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsd0RBQXdELENBQUM7QUFFN0Y7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyx3QkFBd0IsQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUUvRCw0RkFBNEY7QUFDNUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztBQUU3QyxpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHO0lBQzdCLElBQUksRUFBRSx1REFBdUQ7SUFDN0QsR0FBRyxFQUFFLHFDQUFxQztDQUNsQyxDQUFDO0FBRVgscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyJ9
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** A non-negative decimal as integer units of 10^-scale: `'113.5'` is 1135 at scale 1. */
|
|
2
|
+
export interface IScaledDecimal {
|
|
3
|
+
units: bigint;
|
|
4
|
+
scale: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const powerOfTen: (exponentArg: number) => bigint;
|
|
7
|
+
export declare const parseDecimal: (textArg: unknown) => IScaledDecimal | undefined;
|
|
8
|
+
/** The units of a decimal at a scale at least its own. */
|
|
9
|
+
export declare const atScale: (decimalArg: IScaledDecimal, scaleArg: number) => bigint;
|
|
10
|
+
/** numerator / denominator, rounded half away from zero ("kaufmännisch"); the denominator is positive. */
|
|
11
|
+
export declare const divideRounded: (numeratorArg: bigint, denominatorArg: bigint) => bigint;
|
|
12
|
+
/** Units of 10^-scale written as a decimal with exactly `scaleArg` digits after the point: `-22` at 1 is `'-2.2'`. */
|
|
13
|
+
export declare const formatUnits: (unitsArg: bigint, scaleArg: number) => string;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** A decimal written with digits and at most one point between them; no sign, no exponent, no comma, no leading zero. */
|
|
2
|
+
const DECIMAL = /^(0|[1-9]\d*)(?:\.(\d+))?$/u;
|
|
3
|
+
const TEN = 10n;
|
|
4
|
+
export const powerOfTen = (exponentArg) => TEN ** BigInt(exponentArg);
|
|
5
|
+
export const parseDecimal = (textArg) => {
|
|
6
|
+
const match = typeof textArg === 'string' ? DECIMAL.exec(textArg) : null;
|
|
7
|
+
if (!match) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const fraction = match[2] ?? '';
|
|
11
|
+
return { units: BigInt(`${match[1]}${fraction}`), scale: fraction.length };
|
|
12
|
+
};
|
|
13
|
+
/** The units of a decimal at a scale at least its own. */
|
|
14
|
+
export const atScale = (decimalArg, scaleArg) => decimalArg.units * powerOfTen(scaleArg - decimalArg.scale);
|
|
15
|
+
/** numerator / denominator, rounded half away from zero ("kaufmännisch"); the denominator is positive. */
|
|
16
|
+
export const divideRounded = (numeratorArg, denominatorArg) => {
|
|
17
|
+
const negative = numeratorArg < 0n;
|
|
18
|
+
const magnitude = negative ? -numeratorArg : numeratorArg;
|
|
19
|
+
let quotient = magnitude / denominatorArg;
|
|
20
|
+
if ((magnitude % denominatorArg) * 2n >= denominatorArg) {
|
|
21
|
+
quotient += 1n;
|
|
22
|
+
}
|
|
23
|
+
return negative ? -quotient : quotient;
|
|
24
|
+
};
|
|
25
|
+
/** Units of 10^-scale written as a decimal with exactly `scaleArg` digits after the point: `-22` at 1 is `'-2.2'`. */
|
|
26
|
+
export const formatUnits = (unitsArg, scaleArg) => {
|
|
27
|
+
const negative = unitsArg < 0n;
|
|
28
|
+
const digits = (negative ? -unitsArg : unitsArg).toString().padStart(scaleArg + 1, '0');
|
|
29
|
+
const whole = digits.slice(0, digits.length - scaleArg);
|
|
30
|
+
const fraction = digits.slice(digits.length - scaleArg);
|
|
31
|
+
return `${negative ? '-' : ''}${whole}${scaleArg > 0 ? `.${fraction}` : ''}`;
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaW1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NwaS9kZWNpbWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLHlIQUF5SDtBQUN6SCxNQUFNLE9BQU8sR0FBRyw2QkFBNkIsQ0FBQztBQUU5QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFFaEIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsV0FBbUIsRUFBVSxFQUFFLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFnQixFQUE4QixFQUFFO0lBQzNFLE1BQU0sS0FBSyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUM3RSxDQUFDLENBQUM7QUFFRiwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBMEIsRUFBRSxRQUFnQixFQUFVLEVBQUUsQ0FDOUUsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUU3RCwwR0FBMEc7QUFDMUcsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsWUFBb0IsRUFBRSxjQUFzQixFQUFVLEVBQUU7SUFDcEYsTUFBTSxRQUFRLEdBQUcsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUNuQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDMUQsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLGNBQWMsQ0FBQztJQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN4RCxRQUFRLElBQUksRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUN6QyxDQUFDLENBQUM7QUFFRixzSEFBc0g7QUFDdEgsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFVLEVBQUU7SUFDeEUsTUFBTSxRQUFRLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUMvQixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDeEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUMvRSxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './interfaces.js';
|
|
2
|
+
export { CpiError, type ICpiErrorDetails, type TCpiErrorCode } from './classes.cpierror.js';
|
|
3
|
+
export { bundesbankCpiBaseUrl, bundesbankVpiAnnualKey, bundesbankVpiFirstMonth, bundesbankVpiFirstYear, bundesbankVpiMonthlyKey, defaultCpiTimeoutMs, destatisLicence, } from './constants.js';
|
|
4
|
+
export { cpiChangePercent, cpiChangePoints, cpiFirstReaching, cpiScaleAmount, cpiThresholds } from './indexmath.js';
|
|
5
|
+
export { BundesbankCpiClient } from './classes.bundesbankcpiclient.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// This entry point stands alone: it imports nothing from the rest of the package and has no
|
|
2
|
+
// dependencies. It keeps nothing: every answer goes to the caller, with the source's answer as it
|
|
3
|
+
// arrived, which the caller keeps as the evidence of an index adjustment.
|
|
4
|
+
export * from './interfaces.js';
|
|
5
|
+
export { CpiError } from './classes.cpierror.js';
|
|
6
|
+
export { bundesbankCpiBaseUrl, bundesbankVpiAnnualKey, bundesbankVpiFirstMonth, bundesbankVpiFirstYear, bundesbankVpiMonthlyKey, defaultCpiTimeoutMs, destatisLicence, } from './constants.js';
|
|
7
|
+
export { cpiChangePercent, cpiChangePoints, cpiFirstReaching, cpiScaleAmount, cpiThresholds } from './indexmath.js';
|
|
8
|
+
export { BundesbankCpiClient } from './classes.bundesbankcpiclient.js';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jcGkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEZBQTRGO0FBQzVGLGtHQUFrRztBQUNsRywwRUFBMEU7QUFDMUUsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUE2QyxNQUFNLHVCQUF1QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLG1CQUFtQixFQUNuQixlQUFlLEdBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUMifQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ICpiReachOptions, ICpiScaleOptions, ICpiThresholds, ICpiValue, TCpiFrequency } from './interfaces.js';
|
|
2
|
+
/** The frequency a period is written in, or `undefined` for something that is no period. */
|
|
3
|
+
export declare const frequencyOf: (periodArg: unknown) => TCpiFrequency | undefined;
|
|
4
|
+
/**
|
|
5
|
+
* The change from one value to another in percent, as the Statistisches Bundesamt computes it:
|
|
6
|
+
* ((new / old) × 100) − 100, rounded half away from zero to one decimal (`'13.0'`, `'-2.2'`).
|
|
7
|
+
* It does not depend on the base, but both values must be read on the same one.
|
|
8
|
+
*/
|
|
9
|
+
export declare const cpiChangePercent: (oldArg: ICpiValue, newArg: ICpiValue) => string;
|
|
10
|
+
/**
|
|
11
|
+
* The change from one value to another in index points (new − old), with the digits of the more
|
|
12
|
+
* precise value (`'12.2'`, `'-1.0'`). Points depend on the base, so they are only given within one.
|
|
13
|
+
*/
|
|
14
|
+
export declare const cpiChangePoints: (oldArg: ICpiValue, newArg: ICpiValue) => string;
|
|
15
|
+
/**
|
|
16
|
+
* The thresholds of a percent rule: reference × (1 + percent / 100) and reference × (1 − percent / 100),
|
|
17
|
+
* rounded half away from zero to the reference value's digits (99.7 and 5 % give 104.7 and 94.7).
|
|
18
|
+
*/
|
|
19
|
+
export declare const cpiThresholds: (referenceArg: ICpiValue, percentArg: string) => ICpiThresholds;
|
|
20
|
+
/**
|
|
21
|
+
* The first value after the reference period that reaches a threshold of a percent rule
|
|
22
|
+
* (`cpiThresholds`), or `undefined` while none does. Whether the threshold itself counts (`reached`) or
|
|
23
|
+
* only a value beyond it (`exceeded`), and which direction, is the clause's to say. All values must be
|
|
24
|
+
* published values of the reference value's series and base; their order does not matter, a period
|
|
25
|
+
* given twice is refused.
|
|
26
|
+
*/
|
|
27
|
+
export declare const cpiFirstReaching: (valuesArg: readonly ICpiValue[], referenceArg: ICpiValue, percentArg: string, optionsArg: ICpiReachOptions) => ICpiValue | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* An amount in cents scaled from one index value to another, rounded half away from zero to whole cents:
|
|
30
|
+
* by the index ratio (amount × new / old, the default, as the Statistisches Bundesamt writes it) or by
|
|
31
|
+
* the change in percent rounded to one decimal (`basis: 'rounded_percent'`). Which one applies is the
|
|
32
|
+
* contract's to say. The amount and the result are safe integers; a negative amount (a credit) scales
|
|
33
|
+
* the same way.
|
|
34
|
+
*/
|
|
35
|
+
export declare const cpiScaleAmount: (amountCentsArg: number, oldArg: ICpiValue, newArg: ICpiValue, optionsArg?: ICpiScaleOptions) => number;
|