@fin.cx/opendata 3.6.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.smartconfig.json +23 -20
  2. package/dist_ts/00_commitinfo_data.js +3 -3
  3. package/dist_ts/handelsregister/classes.handelsregisterclient.d.ts +64 -0
  4. package/dist_ts/handelsregister/classes.handelsregisterclient.js +397 -0
  5. package/dist_ts/handelsregister/classes.handelsregistererror.d.ts +56 -0
  6. package/dist_ts/handelsregister/classes.handelsregistererror.js +37 -0
  7. package/dist_ts/handelsregister/classes.portalsession.d.ts +46 -0
  8. package/dist_ts/handelsregister/classes.portalsession.js +160 -0
  9. package/dist_ts/handelsregister/classes.slidingwindowgate.d.ts +32 -0
  10. package/dist_ts/handelsregister/classes.slidingwindowgate.js +55 -0
  11. package/dist_ts/handelsregister/constants.d.ts +13 -0
  12. package/dist_ts/handelsregister/constants.js +19 -0
  13. package/dist_ts/handelsregister/data.codelists.d.ts +29 -0
  14. package/dist_ts/handelsregister/data.codelists.js +616 -0
  15. package/dist_ts/handelsregister/forms.d.ts +27 -0
  16. package/dist_ts/handelsregister/forms.js +77 -0
  17. package/dist_ts/handelsregister/html.d.ts +26 -0
  18. package/dist_ts/handelsregister/html.js +82 -0
  19. package/dist_ts/handelsregister/index.d.ts +9 -0
  20. package/dist_ts/handelsregister/index.js +10 -0
  21. package/dist_ts/handelsregister/interfaces.d.ts +240 -0
  22. package/dist_ts/handelsregister/interfaces.js +2 -0
  23. package/dist_ts/handelsregister/parse.searchresults.d.ts +35 -0
  24. package/dist_ts/handelsregister/parse.searchresults.js +175 -0
  25. package/dist_ts/handelsregister/parse.structuredcontent.d.ts +6 -0
  26. package/dist_ts/handelsregister/parse.structuredcontent.js +306 -0
  27. package/dist_ts/handelsregister/plugins.d.ts +4 -0
  28. package/dist_ts/handelsregister/plugins.js +8 -0
  29. package/dist_ts/handelsregister/references.d.ts +38 -0
  30. package/dist_ts/handelsregister/references.js +146 -0
  31. package/dist_ts/holidays/calendar.d.ts +32 -0
  32. package/dist_ts/holidays/calendar.js +200 -0
  33. package/dist_ts/holidays/classes.holidaycalendarerror.d.ts +14 -0
  34. package/dist_ts/holidays/classes.holidaycalendarerror.js +10 -0
  35. package/dist_ts/holidays/data.holidays.d.ts +46 -0
  36. package/dist_ts/holidays/data.holidays.js +124 -0
  37. package/dist_ts/holidays/index.d.ts +4 -0
  38. package/dist_ts/holidays/index.js +7 -0
  39. package/dist_ts/holidays/interfaces.d.ts +42 -0
  40. package/dist_ts/holidays/interfaces.js +2 -0
  41. package/dist_ts/index.d.ts +0 -2
  42. package/dist_ts/index.js +1 -3
  43. package/dist_ts/plugins.d.ts +2 -20
  44. package/dist_ts/plugins.js +3 -22
  45. package/package.json +40 -37
  46. package/readme.md +250 -119
  47. package/ts/00_commitinfo_data.ts +2 -2
  48. package/ts/handelsregister/classes.handelsregisterclient.ts +474 -0
  49. package/ts/handelsregister/classes.handelsregistererror.ts +82 -0
  50. package/ts/handelsregister/classes.portalsession.ts +191 -0
  51. package/ts/handelsregister/classes.slidingwindowgate.ts +74 -0
  52. package/ts/handelsregister/constants.ts +30 -0
  53. package/ts/handelsregister/data.codelists.ts +640 -0
  54. package/ts/handelsregister/forms.ts +99 -0
  55. package/ts/handelsregister/html.ts +113 -0
  56. package/ts/handelsregister/index.ts +27 -0
  57. package/ts/handelsregister/interfaces.ts +272 -0
  58. package/ts/handelsregister/parse.searchresults.ts +241 -0
  59. package/ts/handelsregister/parse.structuredcontent.ts +338 -0
  60. package/ts/handelsregister/plugins.ts +15 -0
  61. package/ts/handelsregister/references.ts +189 -0
  62. package/ts/holidays/calendar.ts +261 -0
  63. package/ts/holidays/classes.holidaycalendarerror.ts +20 -0
  64. package/ts/holidays/data.holidays.ts +177 -0
  65. package/ts/holidays/index.ts +18 -0
  66. package/ts/holidays/interfaces.ts +87 -0
  67. package/ts/index.ts +0 -2
  68. package/ts/plugins.ts +0 -39
  69. package/dist_ts/classes.businessrecord.d.ts +0 -38
  70. package/dist_ts/classes.businessrecord.js +0 -90
  71. package/dist_ts/classes.handelsregister.d.ts +0 -134
  72. package/dist_ts/classes.handelsregister.js +0 -307
  73. package/dist_ts/classes.jsonldata.d.ts +0 -43
  74. package/dist_ts/classes.jsonldata.js +0 -68
  75. package/dist_ts/classes.main.opendata.d.ts +0 -25
  76. package/dist_ts/classes.main.opendata.js +0 -91
  77. package/dist_ts/laws/classes.lawrecord.d.ts +0 -24
  78. package/dist_ts/laws/classes.lawrecord.js +0 -181
  79. package/dist_ts/laws/classes.lawservice.d.ts +0 -52
  80. package/dist_ts/laws/classes.lawservice.js +0 -740
  81. package/dist_ts/laws/index.d.ts +0 -3
  82. package/dist_ts/laws/index.js +0 -4
  83. package/dist_ts/laws/interfaces.law.d.ts +0 -35
  84. package/dist_ts/laws/interfaces.law.js +0 -2
  85. package/readme.hints.md +0 -89
  86. package/ts/classes.businessrecord.ts +0 -67
  87. package/ts/classes.handelsregister.ts +0 -385
  88. package/ts/classes.jsonldata.ts +0 -114
  89. package/ts/classes.main.opendata.ts +0 -120
  90. package/ts/laws/classes.lawrecord.ts +0 -81
  91. package/ts/laws/classes.lawservice.ts +0 -1010
  92. package/ts/laws/index.ts +0 -3
  93. package/ts/laws/interfaces.law.ts +0 -48
@@ -0,0 +1,146 @@
1
+ import { registerTypes } from './constants.js';
2
+ import { registerCourts } from './data.codelists.js';
3
+ const collapse = (textArg) => textArg.replace(/\s+/g, ' ').trim();
4
+ /** German letters as a text without them spells them: `Muenchen` is `München` */
5
+ const spelledOut = { 'ä': 'ae', 'ö': 'oe', 'ü': 'ue', 'ß': 'ss' };
6
+ /** words that name a court or a register rather than its place */
7
+ const courtWords = new Set([
8
+ 'amtsgericht',
9
+ 'amtsgerichts',
10
+ 'ag',
11
+ 'registergericht',
12
+ 'registergerichts',
13
+ 'handelsregister',
14
+ 'genossenschaftsregister',
15
+ 'partnerschaftsregister',
16
+ 'vereinsregister',
17
+ 'gesellschaftsregister',
18
+ 'abteilung',
19
+ 'beim',
20
+ 'bei',
21
+ 'des',
22
+ ]);
23
+ /**
24
+ * The place a printed court name names, as courts are compared: lower case, German letters spelled
25
+ * out, punctuation as spaces, and without the words that name a court or a register or the
26
+ * division of the commercial register. `Handelsregister B des Amtsgerichts Frankfurt a. M.` is
27
+ * `frankfurt a m`.
28
+ */
29
+ const placeKey = (textArg) => {
30
+ const words = textArg
31
+ .normalize('NFC')
32
+ .toLocaleLowerCase('de-DE')
33
+ .replace(/[äöüß]/g, (letterArg) => spelledOut[letterArg] ?? letterArg)
34
+ .split(/[^\p{L}\p{N}]+/u)
35
+ .filter((wordArg) => wordArg !== '');
36
+ return words
37
+ .filter((wordArg, indexArg) => {
38
+ const previous = words[indexArg - 1];
39
+ const division = (previous === 'handelsregister' || previous === 'abteilung') && (wordArg === 'a' || wordArg === 'b');
40
+ return !courtWords.has(wordArg) && !division;
41
+ })
42
+ .join(' ');
43
+ };
44
+ /**
45
+ * Other names under which the register courts are printed, for courts whose name in the official
46
+ * list carries a qualifier that prints leave out, abbreviate or spell out. Each name here is a name
47
+ * of that court alone. `Frankfurt` without `am Main` or `(Oder)` is a name of neither of the two.
48
+ */
49
+ const printedCourtNames = {
50
+ 'Bad Homburg v.d.H.': ['Bad Homburg', 'Bad Homburg vor der Höhe', 'Bad Homburg v. d. Höhe'],
51
+ 'Berlin (Charlottenburg)': ['Berlin', 'Charlottenburg', 'Charlottenburg (Berlin)'],
52
+ 'Frankfurt am Main': ['Frankfurt a. M.', 'Frankfurt a. Main', 'Frankfurt/M.', 'Frankfurt/Main', 'Frankfurt (Main)'],
53
+ 'Frankfurt (Oder)': ['Frankfurt/O.', 'Frankfurt a. d. O.', 'Frankfurt an der Oder', 'Frankfurt a. d. Oder'],
54
+ 'Freiburg': ['Freiburg im Breisgau', 'Freiburg i. Br.', 'Freiburg/Breisgau', 'Freiburg (Breisgau)'],
55
+ 'Kempten (Allgäu)': ['Kempten'],
56
+ 'Königstein': ['Königstein im Taunus', 'Königstein i. Ts.'],
57
+ 'Landau': ['Landau in der Pfalz', 'Landau i. d. Pfalz', 'Landau/Pfalz'],
58
+ 'Limburg': ['Limburg an der Lahn', 'Limburg a. d. Lahn'],
59
+ 'Ludwigshafen a.Rhein (Ludwigshafen)': ['Ludwigshafen', 'Ludwigshafen am Rhein'],
60
+ 'Offenbach am Main': ['Offenbach', 'Offenbach a. M.'],
61
+ 'Oldenburg (Oldenburg)': ['Oldenburg', 'Oldenburg (Oldb.)', 'Oldenburg i. O.'],
62
+ 'St. Ingbert (St Ingbert)': ['St. Ingbert', 'Sankt Ingbert'],
63
+ 'St. Wendel (St Wendel)': ['St. Wendel', 'Sankt Wendel'],
64
+ 'Weiden i. d. OPf.': ['Weiden', 'Weiden in der Oberpfalz'],
65
+ };
66
+ /** every place key of a list of courts with the courts it names */
67
+ const courtsByPlaceKey = (courtsArg) => {
68
+ const byKey = new Map();
69
+ for (const court of courtsArg) {
70
+ const keys = new Set([court.name, ...(printedCourtNames[court.name] ?? [])].map(placeKey));
71
+ for (const key of keys) {
72
+ if (key !== '') {
73
+ byKey.set(key, [...(byKey.get(key) ?? []), court]);
74
+ }
75
+ }
76
+ }
77
+ return byKey;
78
+ };
79
+ let officialCourtKeys;
80
+ /**
81
+ * Finds a register court by its code or by its name as the portal or a business prints it: `H1101`,
82
+ * `Bremen`, `AG Bremen`, `Amtsgericht Bremen – Registergericht`, `Registergericht Bremen`,
83
+ * `Handelsregister B des Amtsgerichts Bremen`, `Amtsgericht Frankfurt a. M.`, `Frankfurt (Oder)`,
84
+ * `Kempten (Allgäu)` or `Kempten`, `Freiburg i. Br.`, `AG Berlin` or `Charlottenburg`. Umlauts may
85
+ * be spelled out (`Muenchen`). Returns undefined unless exactly one court fits: a place the list
86
+ * does not know, and `Frankfurt` alone, name no court.
87
+ */
88
+ export const findRegisterCourt = (codeOrNameArg, courtsArg = registerCourts) => {
89
+ if (typeof codeOrNameArg !== 'string') {
90
+ return undefined;
91
+ }
92
+ const text = collapse(codeOrNameArg);
93
+ if (!text) {
94
+ return undefined;
95
+ }
96
+ const byCode = courtsArg.find((courtArg) => courtArg.code.toUpperCase() === text.toUpperCase());
97
+ if (byCode) {
98
+ return byCode;
99
+ }
100
+ const keys = courtsArg === registerCourts
101
+ ? (officialCourtKeys ??= courtsByPlaceKey(registerCourts))
102
+ : courtsByPlaceKey(courtsArg);
103
+ const courts = keys.get(placeKey(text)) ?? [];
104
+ return courts.length === 1 ? courts[0] : undefined;
105
+ };
106
+ /** returns the canonical register type for `hrb`, `HRB`, `gnr` …, or undefined */
107
+ export const toRegisterType = (textArg) => registerTypes.find((typeArg) => typeArg.toLowerCase() === collapse(textArg).toLowerCase());
108
+ /** splits `35230 HB`, `35230HB` or `35230` into digits and location suffix */
109
+ export const parseRegisterNumber = (textArg) => {
110
+ const match = /^(\d{1,9})\s*([A-Za-zÄÖÜäöü]{1,5})?$/.exec(collapse(textArg));
111
+ if (!match) {
112
+ return undefined;
113
+ }
114
+ return match[2] ? { digits: match[1], suffix: match[2].toLocaleUpperCase('de-DE') } : { digits: match[1] };
115
+ };
116
+ export const formatRegisterNumber = (partsArg) => partsArg.suffix ? `${partsArg.digits} ${partsArg.suffix}` : partsArg.digits;
117
+ /**
118
+ * Reads a register reference as businesses print it: `Amtsgericht Bremen HRB 35230 HB`,
119
+ * `AG Bremen, HRB 35230`, `HRB 35230 HB`. Returns undefined for text it cannot read. A court name
120
+ * that fits no register court leaves `court` absent and keeps the text in `courtText`.
121
+ */
122
+ export const parseRegisterReferenceText = (textArg, courtsArg = registerCourts) => {
123
+ const text = collapse(textArg);
124
+ const match = /^(.*?)[\s,;:]*\b(HRA|HRB|GnR|PR|VR|GsR)\b\.?\s*(?:Nr\.?\s*)?(\d{1,9}(?:\s*[A-Za-zÄÖÜäöü]{1,5})?)(?=\s|$)(?:\s+früher\s+Amtsgericht\s+.+)?$/i.exec(text);
125
+ if (!match) {
126
+ return undefined;
127
+ }
128
+ const type = toRegisterType(match[2]);
129
+ const number = parseRegisterNumber(match[3]);
130
+ if (!type || !number) {
131
+ return undefined;
132
+ }
133
+ const courtText = collapse(match[1].replace(/[,;:]+$/, ''));
134
+ const result = { type, number: formatRegisterNumber(number) };
135
+ if (courtText) {
136
+ result.courtText = courtText;
137
+ const court = findRegisterCourt(courtText, courtsArg);
138
+ if (court) {
139
+ result.court = court;
140
+ }
141
+ }
142
+ return result;
143
+ };
144
+ /** `Amtsgericht Bremen HRB 35230 HB` */
145
+ export const formatRegisterReference = (referenceArg) => `Amtsgericht ${referenceArg.court.name} ${referenceArg.type} ${referenceArg.number}`;
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2hhbmRlbHNyZWdpc3Rlci9yZWZlcmVuY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFvQnJELE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUVsRixpRkFBaUY7QUFDakYsTUFBTSxVQUFVLEdBQXFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBRXBHLGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDOUMsYUFBYTtJQUNiLGNBQWM7SUFDZCxJQUFJO0lBQ0osaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLHdCQUF3QjtJQUN4QixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLFdBQVc7SUFDWCxNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7Q0FDTixDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUU7SUFDM0MsTUFBTSxLQUFLLEdBQUcsT0FBTztTQUNsQixTQUFTLENBQUMsS0FBSyxDQUFDO1NBQ2hCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztTQUMxQixPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDO1NBQ3JFLEtB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
@@ -0,0 +1,32 @@
1
+ import type { IGermanState, IPublicHoliday, IWorkingDayOptions, TGermanStateCode, TIsoDate } from './interfaces.js';
2
+ /**
3
+ * Easter Sunday of a year of the Gregorian calendar, by the algorithm of Meeus, Jones and
4
+ * Butcher. The Easter-based holidays follow from it.
5
+ */
6
+ export declare const easterSunday: (yearArg: number) => TIsoDate;
7
+ /**
8
+ * The statutory public holidays of a state in a year, in the order of their dates. Regional
9
+ * holidays are included with `scope: 'regional'` and the part of the state they apply to.
10
+ */
11
+ export declare const getPublicHolidays: (yearArg: number, stateArg: TGermanStateCode) => IPublicHoliday[];
12
+ /** The statutory public holidays of a state on a date, regional ones included. */
13
+ export declare const getPublicHolidaysOn: (dateArg: TIsoDate, stateArg: TGermanStateCode) => IPublicHoliday[];
14
+ /** Whether a date is a statutory public holiday in a state. */
15
+ export declare const isPublicHoliday: (dateArg: TIsoDate, stateArg: TGermanStateCode, optionsArg: IWorkingDayOptions) => boolean;
16
+ /**
17
+ * Whether a date is a working day in a state in the sense of § 193 BGB: neither a Saturday, nor a
18
+ * Sunday, nor a statutory public holiday.
19
+ */
20
+ export declare const isWorkingDay: (dateArg: TIsoDate, stateArg: TGermanStateCode, optionsArg: IWorkingDayOptions) => boolean;
21
+ /** The first working day after a date (§ 193 BGB: not a Saturday, Sunday or public holiday). */
22
+ export declare const nextWorkingDay: (dateArg: TIsoDate, stateArg: TGermanStateCode, optionsArg: IWorkingDayOptions) => TIsoDate;
23
+ /**
24
+ * The date itself when it is a working day, otherwise the next working day: the day that takes the
25
+ * place of a fixed day or of the last day of a period under § 193 BGB.
26
+ */
27
+ export declare const workingDayOnOrAfter: (dateArg: TIsoDate, stateArg: TGermanStateCode, optionsArg: IWorkingDayOptions) => TIsoDate;
28
+ /**
29
+ * The federal state for a code or a name: `DE-BY`, `BY` or `Bayern`, compared without regard to
30
+ * case and surrounding whitespace.
31
+ */
32
+ export declare const findGermanState: (valueArg: string) => IGermanState | undefined;
@@ -0,0 +1,200 @@
1
+ import { HolidayCalendarError } from './classes.holidaycalendarerror.js';
2
+ import { germanStates, holidayCalendarFirstYear, holidayRules } from './data.holidays.js';
3
+ const dayMs = 86_400_000;
4
+ const lastYear = 9999;
5
+ const pad = (valueArg, lengthArg) => String(valueArg).padStart(lengthArg, '0');
6
+ const toIsoDate = (utcArg) => {
7
+ const date = new Date(utcArg);
8
+ return `${pad(date.getUTCFullYear(), 4)}-${pad(date.getUTCMonth() + 1, 2)}-${pad(date.getUTCDate(), 2)}`;
9
+ };
10
+ const utcOf = (yearArg, monthArg, dayArg) => {
11
+ const date = new Date(0);
12
+ date.setUTCFullYear(yearArg, monthArg - 1, dayArg);
13
+ date.setUTCHours(0, 0, 0, 0);
14
+ return date.getTime();
15
+ };
16
+ const checkYear = (yearArg) => {
17
+ if (!Number.isInteger(yearArg) || yearArg < holidayCalendarFirstYear || yearArg > lastYear) {
18
+ throw new HolidayCalendarError('unsupported_year', `The holiday calendar answers for the years ${holidayCalendarFirstYear} to ${lastYear}, not for ${String(yearArg)}.`);
19
+ }
20
+ };
21
+ const parseIsoDate = (dateArg) => {
22
+ const match = typeof dateArg === 'string' ? /^(\d{4})-(\d{2})-(\d{2})$/.exec(dateArg) : null;
23
+ if (!match) {
24
+ throw new HolidayCalendarError('invalid_date', `A date is written YYYY-MM-DD; ${JSON.stringify(dateArg)} is not.`);
25
+ }
26
+ const year = Number(match[1]);
27
+ const month = Number(match[2]);
28
+ const day = Number(match[3]);
29
+ checkYear(year);
30
+ const utc = utcOf(year, month, day);
31
+ if (toIsoDate(utc) !== dateArg) {
32
+ throw new HolidayCalendarError('invalid_date', `${dateArg} is not a date of the calendar.`);
33
+ }
34
+ return { year, utc };
35
+ };
36
+ const checkState = (stateArg) => {
37
+ if (!germanStates.some((stateEntry) => stateEntry.code === stateArg)) {
38
+ throw new HolidayCalendarError('unknown_state', `${JSON.stringify(stateArg)} is not the ISO 3166-2 code of a German federal state, such as DE-BY.`);
39
+ }
40
+ };
41
+ const checkOptions = (optionsArg) => {
42
+ const policy = optionsArg?.regionalHolidays;
43
+ if (policy !== 'count' && policy !== 'ignore') {
44
+ throw new HolidayCalendarError('invalid_options', 'Say how regional holidays are treated: { regionalHolidays: "count" } or { regionalHolidays: "ignore" }.');
45
+ }
46
+ };
47
+ /**
48
+ * Easter Sunday of a year of the Gregorian calendar, by the algorithm of Meeus, Jones and
49
+ * Butcher. The Easter-based holidays follow from it.
50
+ */
51
+ export const easterSunday = (yearArg) => {
52
+ checkYear(yearArg);
53
+ return toIsoDate(easterUtc(yearArg));
54
+ };
55
+ const easterUtc = (yearArg) => {
56
+ const a = yearArg % 19;
57
+ const b = Math.floor(yearArg / 100);
58
+ const c = yearArg % 100;
59
+ const d = Math.floor(b / 4);
60
+ const e = b % 4;
61
+ const f = Math.floor((b + 8) / 25);
62
+ const g = Math.floor((b - f + 1) / 3);
63
+ const h = (19 * a + b - d - g + 15) % 30;
64
+ const i = Math.floor(c / 4);
65
+ const k = c % 4;
66
+ const l = (32 + 2 * e + 2 * i - h - k) % 7;
67
+ const m = Math.floor((a + 11 * h + 22 * l) / 451);
68
+ const month = Math.floor((h + l - 7 * m + 114) / 31);
69
+ const day = ((h + l - 7 * m + 114) % 31) + 1;
70
+ return utcOf(yearArg, month, day);
71
+ };
72
+ /** the Wednesday before the last Sunday before the first Sunday of Advent (16 to 22 November) */
73
+ const bussUndBettagUtc = (yearArg) => {
74
+ const christmasEve = utcOf(yearArg, 12, 24);
75
+ const fourthAdvent = christmasEve - new Date(christmasEve).getUTCDay() * dayMs;
76
+ const firstAdvent = fourthAdvent - 21 * dayMs;
77
+ return firstAdvent - 11 * dayMs;
78
+ };
79
+ const dateOf = (ruleArg, yearArg) => {
80
+ switch (ruleArg.kind) {
81
+ case 'fixed':
82
+ return utcOf(yearArg, ruleArg.month, ruleArg.day);
83
+ case 'easter':
84
+ return easterUtc(yearArg) + ruleArg.offset * dayMs;
85
+ case 'buss-und-bettag':
86
+ return bussUndBettagUtc(yearArg);
87
+ }
88
+ };
89
+ const appliesIn = (ruleArg, yearArg) => (ruleArg.onlyYear === undefined || ruleArg.onlyYear === yearArg) &&
90
+ (ruleArg.fromYear === undefined || yearArg >= ruleArg.fromYear);
91
+ const holidaysByYearAndState = new Map();
92
+ const holidaysOf = (yearArg, stateArg) => {
93
+ const key = `${yearArg}:${stateArg}`;
94
+ const known = holidaysByYearAndState.get(key);
95
+ if (known) {
96
+ return known;
97
+ }
98
+ const holidays = holidayRules
99
+ .filter((ruleArg) => ruleArg.state === stateArg && appliesIn(ruleArg, yearArg))
100
+ .map((ruleArg) => ({ utc: dateOf(ruleArg.date, yearArg), rule: ruleArg }))
101
+ .sort((leftArg, rightArg) => leftArg.utc - rightArg.utc)
102
+ .map(({ utc, rule }) => {
103
+ const holiday = {
104
+ date: toIsoDate(utc),
105
+ id: rule.id,
106
+ name: rule.name,
107
+ state: rule.state,
108
+ scope: rule.scope,
109
+ legalBasis: rule.legalBasis,
110
+ };
111
+ if (rule.region !== undefined) {
112
+ holiday.region = rule.region;
113
+ }
114
+ return Object.freeze(holiday);
115
+ });
116
+ const frozen = Object.freeze(holidays);
117
+ holidaysByYearAndState.set(key, frozen);
118
+ return frozen;
119
+ };
120
+ /**
121
+ * The statutory public holidays of a state in a year, in the order of their dates. Regional
122
+ * holidays are included with `scope: 'regional'` and the part of the state they apply to.
123
+ */
124
+ export const getPublicHolidays = (yearArg, stateArg) => {
125
+ checkYear(yearArg);
126
+ checkState(stateArg);
127
+ return [...holidaysOf(yearArg, stateArg)];
128
+ };
129
+ /** The statutory public holidays of a state on a date, regional ones included. */
130
+ export const getPublicHolidaysOn = (dateArg, stateArg) => {
131
+ const day = parseIsoDate(dateArg);
132
+ checkState(stateArg);
133
+ return holidaysOf(day.year, stateArg).filter((holidayArg) => holidayArg.date === dateArg);
134
+ };
135
+ const isHolidayUtc = (utcArg, stateArg, optionsArg) => {
136
+ const date = toIsoDate(utcArg);
137
+ const year = new Date(utcArg).getUTCFullYear();
138
+ checkYear(year);
139
+ return holidaysOf(year, stateArg).some((holidayArg) => holidayArg.date === date && (holidayArg.scope === 'state' || optionsArg.regionalHolidays === 'count'));
140
+ };
141
+ const isWorkingDayUtc = (utcArg, stateArg, optionsArg) => {
142
+ const weekday = new Date(utcArg).getUTCDay();
143
+ return weekday !== 0 && weekday !== 6 && !isHolidayUtc(utcArg, stateArg, optionsArg);
144
+ };
145
+ /** Whether a date is a statutory public holiday in a state. */
146
+ export const isPublicHoliday = (dateArg, stateArg, optionsArg) => {
147
+ const day = parseIsoDate(dateArg);
148
+ checkState(stateArg);
149
+ checkOptions(optionsArg);
150
+ return isHolidayUtc(day.utc, stateArg, optionsArg);
151
+ };
152
+ /**
153
+ * Whether a date is a working day in a state in the sense of § 193 BGB: neither a Saturday, nor a
154
+ * Sunday, nor a statutory public holiday.
155
+ */
156
+ export const isWorkingDay = (dateArg, stateArg, optionsArg) => {
157
+ const day = parseIsoDate(dateArg);
158
+ checkState(stateArg);
159
+ checkOptions(optionsArg);
160
+ return isWorkingDayUtc(day.utc, stateArg, optionsArg);
161
+ };
162
+ /** The first working day after a date (§ 193 BGB: not a Saturday, Sunday or public holiday). */
163
+ export const nextWorkingDay = (dateArg, stateArg, optionsArg) => {
164
+ const day = parseIsoDate(dateArg);
165
+ checkState(stateArg);
166
+ checkOptions(optionsArg);
167
+ let utc = day.utc + dayMs;
168
+ while (!isWorkingDayUtc(utc, stateArg, optionsArg)) {
169
+ utc += dayMs;
170
+ }
171
+ return toIsoDate(utc);
172
+ };
173
+ /**
174
+ * The date itself when it is a working day, otherwise the next working day: the day that takes the
175
+ * place of a fixed day or of the last day of a period under § 193 BGB.
176
+ */
177
+ export const workingDayOnOrAfter = (dateArg, stateArg, optionsArg) => {
178
+ const day = parseIsoDate(dateArg);
179
+ checkState(stateArg);
180
+ checkOptions(optionsArg);
181
+ let utc = day.utc;
182
+ while (!isWorkingDayUtc(utc, stateArg, optionsArg)) {
183
+ utc += dayMs;
184
+ }
185
+ return toIsoDate(utc);
186
+ };
187
+ /**
188
+ * The federal state for a code or a name: `DE-BY`, `BY` or `Bayern`, compared without regard to
189
+ * case and surrounding whitespace.
190
+ */
191
+ export const findGermanState = (valueArg) => {
192
+ if (typeof valueArg !== 'string') {
193
+ return undefined;
194
+ }
195
+ const value = valueArg.trim().toLocaleLowerCase('de-DE');
196
+ return germanStates.find((stateArg) => stateArg.code.toLowerCase() === value ||
197
+ stateArg.code.slice(3).toLowerCase() === value ||
198
+ stateArg.name.toLocaleLowerCase('de-DE') === value);
199
+ };
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ob2xpZGF5cy9jYWxlbmRhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBVTFGLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQztBQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFRdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFnQixFQUFFLFNBQWlCLEVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRXZHLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBYyxFQUFZLEVBQUU7SUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNHLENBQUMsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBZSxFQUFFLFFBQWdCLEVBQUUsTUFBYyxFQUFVLEVBQUU7SUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRCxJQUFJLENBQUMsV0FBVyxD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
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Why a question to the holiday calendar was refused:
3
+ * - `invalid_date`: the value is not a calendar date written `YYYY-MM-DD`;
4
+ * - `unsupported_year`: the year lies before the first year the calendar answers for (2018) or
5
+ * after 9999;
6
+ * - `unknown_state`: the value is not the code of a German federal state;
7
+ * - `invalid_options`: the options do not say how to treat regional holidays.
8
+ */
9
+ export type THolidayCalendarErrorCode = 'invalid_date' | 'unsupported_year' | 'unknown_state' | 'invalid_options';
10
+ /** The typed error of the holiday calendar. */
11
+ export declare class HolidayCalendarError extends Error {
12
+ readonly code: THolidayCalendarErrorCode;
13
+ constructor(code: THolidayCalendarErrorCode, message: string);
14
+ }
@@ -0,0 +1,10 @@
1
+ /** The typed error of the holiday calendar. */
2
+ export class HolidayCalendarError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = 'HolidayCalendarError';
7
+ this.code = code;
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ob2xpZGF5Y2FsZW5kYXJlcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2hvbGlkYXlzL2NsYXNzZXMuaG9saWRheWNhbGVuZGFyZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsK0NBQStDO0FBQy9DLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxLQUFLO0lBQzdCLElBQUksQ0FBNEI7SUFFaEQsWUFBWSxJQUErQixFQUFFLE9BQWU7UUFDMUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The statutory public holidays of the German federal states, taken from the holiday laws of the
3
+ * states (Feiertagsgesetze) and, for 3 October, from Art. 2 Abs. 2 of the Unification Treaty
4
+ * (Einigungsvertrag). The provisions were read on 2026-09-24 in the official law portals of the
5
+ * states; the readme lists them with their links.
6
+ *
7
+ * The rules cover the years from 2018 on. Every change of a state's list since then is recorded
8
+ * with the year it first applies: Reformationstag in Bremen, Hamburg, Niedersachsen and
9
+ * Schleswig-Holstein (2018), Frauentag in Berlin (2019) and Mecklenburg-Vorpommern (2023),
10
+ * Weltkindertag in Thüringen (2019), and the one-off holidays of Berlin (2020, 2025, 2028).
11
+ */
12
+ import type { IGermanState, TGermanStateCode, TPublicHolidayId, TPublicHolidayScope } from './interfaces.js';
13
+ /** the first year the calendar answers for */
14
+ export declare const holidayCalendarFirstYear = 2018;
15
+ /** the day the holiday laws were read; later changes need a new release */
16
+ export declare const holidayLawsReadOn = "2026-09-24";
17
+ export declare const germanStates: readonly IGermanState[];
18
+ /** how the date of a holiday follows from the year */
19
+ export type THolidayDateRule = {
20
+ kind: 'fixed';
21
+ month: number;
22
+ day: number;
23
+ }
24
+ /** days after Easter Sunday; negative before it */
25
+ | {
26
+ kind: 'easter';
27
+ offset: number;
28
+ }
29
+ /** the Wednesday before the last Sunday before the first Sunday of Advent */
30
+ | {
31
+ kind: 'buss-und-bettag';
32
+ };
33
+ export interface IHolidayRule {
34
+ id: TPublicHolidayId;
35
+ name: string;
36
+ date: THolidayDateRule;
37
+ state: TGermanStateCode;
38
+ scope: TPublicHolidayScope;
39
+ region?: string;
40
+ legalBasis: string;
41
+ /** the first year the holiday applies */
42
+ fromYear?: number;
43
+ /** the only year a one-off holiday applies */
44
+ onlyYear?: number;
45
+ }
46
+ export declare const holidayRules: readonly IHolidayRule[];
@@ -0,0 +1,124 @@
1
+ /** the first year the calendar answers for */
2
+ export const holidayCalendarFirstYear = 2018;
3
+ /** the day the holiday laws were read; later changes need a new release */
4
+ export const holidayLawsReadOn = '2026-09-24';
5
+ export const germanStates = Object.freeze([
6
+ { code: 'DE-BW', name: 'Baden-Württemberg' },
7
+ { code: 'DE-BY', name: 'Bayern' },
8
+ { code: 'DE-BE', name: 'Berlin' },
9
+ { code: 'DE-BB', name: 'Brandenburg' },
10
+ { code: 'DE-HB', name: 'Bremen' },
11
+ { code: 'DE-HH', name: 'Hamburg' },
12
+ { code: 'DE-HE', name: 'Hessen' },
13
+ { code: 'DE-MV', name: 'Mecklenburg-Vorpommern' },
14
+ { code: 'DE-NI', name: 'Niedersachsen' },
15
+ { code: 'DE-NW', name: 'Nordrhein-Westfalen' },
16
+ { code: 'DE-RP', name: 'Rheinland-Pfalz' },
17
+ { code: 'DE-SL', name: 'Saarland' },
18
+ { code: 'DE-SN', name: 'Sachsen' },
19
+ { code: 'DE-ST', name: 'Sachsen-Anhalt' },
20
+ { code: 'DE-SH', name: 'Schleswig-Holstein' },
21
+ { code: 'DE-TH', name: 'Thüringen' },
22
+ ]);
23
+ /** the provision of each state's holiday law that lists its statutory holidays */
24
+ const holidayListOf = {
25
+ 'DE-BW': '§ 1 FTG (Baden-Württemberg)',
26
+ 'DE-BY': 'Art. 1 Abs. 1 Nr. 1 FTG (Bayern)',
27
+ 'DE-BE': '§ 1 Abs. 1 Gesetz über die Sonn- und Feiertage (Berlin)',
28
+ 'DE-BB': '§ 2 Abs. 1 FTG (Brandenburg)',
29
+ 'DE-HB': '§ 2 Abs. 1 Gesetz über die Sonn-, Gedenk- und Feiertage (Bremen)',
30
+ 'DE-HH': '§ 1 Feiertagsgesetz (Hamburg)',
31
+ 'DE-HE': '§ 1 Abs. 1 HFeiertagsG',
32
+ 'DE-MV': '§ 2 Abs. 1 FTG M-V',
33
+ 'DE-NI': '§ 2 Abs. 1 NFeiertagsG',
34
+ 'DE-NW': '§ 2 Abs. 1 Feiertagsgesetz NW',
35
+ 'DE-RP': '§ 2 Abs. 1 LFtG',
36
+ 'DE-SL': '§ 2 Abs. 1 SFG',
37
+ 'DE-SN': '§ 1 Abs. 1 SächsSFG',
38
+ 'DE-ST': '§ 2 FeiertG LSA',
39
+ 'DE-SH': '§ 2 Abs. 1 SFTG',
40
+ 'DE-TH': '§ 2 Abs. 1 ThürFGtG',
41
+ };
42
+ const allStates = germanStates.map((stateArg) => stateArg.code);
43
+ const fixed = (month, day) => ({ kind: 'fixed', month, day });
44
+ const easter = (offset) => ({ kind: 'easter', offset });
45
+ /** a holiday in the whole of each listed state, by that state's holiday list */
46
+ const statewide = (id, name, date, states, extra = {}) => states.map((state) => ({ id, name, date, state, scope: 'state', legalBasis: holidayListOf[state], ...extra }));
47
+ export const holidayRules = Object.freeze([
48
+ // in every state
49
+ ...statewide('neujahr', 'Neujahr', fixed(1, 1), allStates),
50
+ ...statewide('karfreitag', 'Karfreitag', easter(-2), allStates),
51
+ ...statewide('ostermontag', 'Ostermontag', easter(1), allStates),
52
+ ...statewide('tag-der-arbeit', 'Tag der Arbeit', fixed(5, 1), allStates),
53
+ ...statewide('christi-himmelfahrt', 'Christi Himmelfahrt', easter(39), allStates),
54
+ ...statewide('pfingstmontag', 'Pfingstmontag', easter(50), allStates),
55
+ ...allStates.map((state) => ({
56
+ id: 'tag-der-deutschen-einheit',
57
+ name: 'Tag der Deutschen Einheit',
58
+ date: fixed(10, 3),
59
+ state,
60
+ scope: 'state',
61
+ legalBasis: 'Art. 2 Abs. 2 Einigungsvertrag',
62
+ })),
63
+ ...statewide('erster-weihnachtstag', '1. Weihnachtstag', fixed(12, 25), allStates),
64
+ ...statewide('zweiter-weihnachtstag', '2. Weihnachtstag', fixed(12, 26), allStates),
65
+ // in some states
66
+ ...statewide('heilige-drei-koenige', 'Heilige Drei Könige', fixed(1, 6), ['DE-BW', 'DE-BY', 'DE-ST']),
67
+ ...statewide('frauentag', 'Frauentag', fixed(3, 8), ['DE-BE'], { fromYear: 2019 }),
68
+ ...statewide('frauentag', 'Frauentag', fixed(3, 8), ['DE-MV'], { fromYear: 2023 }),
69
+ ...statewide('ostersonntag', 'Ostersonntag', easter(0), ['DE-BB']),
70
+ ...statewide('pfingstsonntag', 'Pfingstsonntag', easter(49), ['DE-BB']),
71
+ ...statewide('fronleichnam', 'Fronleichnam', easter(60), ['DE-BW', 'DE-BY', 'DE-HE', 'DE-NW', 'DE-RP', 'DE-SL']),
72
+ ...statewide('mariae-himmelfahrt', 'Mariä Himmelfahrt', fixed(8, 15), ['DE-SL']),
73
+ ...statewide('weltkindertag', 'Weltkindertag', fixed(9, 20), ['DE-TH'], { fromYear: 2019 }),
74
+ ...statewide('reformationstag', 'Reformationstag', fixed(10, 31), ['DE-BB', 'DE-MV', 'DE-SN', 'DE-ST', 'DE-TH']),
75
+ ...statewide('reformationstag', 'Reformationstag', fixed(10, 31), ['DE-HB', 'DE-HH', 'DE-NI', 'DE-SH'], {
76
+ fromYear: 2018,
77
+ }),
78
+ ...statewide('allerheiligen', 'Allerheiligen', fixed(11, 1), ['DE-BW', 'DE-BY', 'DE-NW', 'DE-RP', 'DE-SL']),
79
+ ...statewide('buss-und-bettag', 'Buß- und Bettag', { kind: 'buss-und-bettag' }, ['DE-SN']),
80
+ // one-off holidays
81
+ ...statewide('tag-der-befreiung', 'Tag der Befreiung', fixed(5, 8), ['DE-BE'], { onlyYear: 2020 }),
82
+ ...statewide('tag-der-befreiung', 'Tag der Befreiung', fixed(5, 8), ['DE-BE'], { onlyYear: 2025 }),
83
+ ...statewide('jahrestag-17-juni-1953', '75. Jahrestag des Aufstandes vom 17. Juni 1953', fixed(6, 17), ['DE-BE'], {
84
+ onlyYear: 2028,
85
+ }),
86
+ // in part of a state
87
+ {
88
+ id: 'fronleichnam',
89
+ name: 'Fronleichnam',
90
+ date: easter(60),
91
+ state: 'DE-SN',
92
+ scope: 'regional',
93
+ region: 'die in der Anlage der FronleichnamsVO genannten Gemeinden der früheren Landkreise Bautzen, Hoyerswerda und Kamenz, nach einer Neugliederung nur der jeweilige Gemeindeteil',
94
+ legalBasis: '§ 1 Abs. 1 SächsSFG i. V. m. § 1 FronleichnamsVO',
95
+ },
96
+ {
97
+ id: 'fronleichnam',
98
+ name: 'Fronleichnam',
99
+ date: easter(60),
100
+ state: 'DE-TH',
101
+ scope: 'regional',
102
+ region: 'die Teile Thüringens, in denen Fronleichnam 1994 gesetzlicher Feiertag war',
103
+ legalBasis: '§ 2 Abs. 2 i. V. m. § 10 Abs. 1 ThürFGtG',
104
+ },
105
+ {
106
+ id: 'augsburger-friedensfest',
107
+ name: 'Augsburger Friedensfest',
108
+ date: fixed(8, 8),
109
+ state: 'DE-BY',
110
+ scope: 'regional',
111
+ region: 'Stadt Augsburg',
112
+ legalBasis: 'Art. 1 Abs. 2 FTG (Bayern)',
113
+ },
114
+ {
115
+ id: 'mariae-himmelfahrt',
116
+ name: 'Mariä Himmelfahrt',
117
+ date: fixed(8, 15),
118
+ state: 'DE-BY',
119
+ scope: 'regional',
120
+ region: 'Gemeinden mit überwiegend katholischer Bevölkerung, wie das Bayerische Landesamt für Statistik sie nach der letzten Volkszählung feststellt',
121
+ legalBasis: 'Art. 1 Abs. 1 Nr. 2, Abs. 3 FTG (Bayern)',
122
+ },
123
+ ]);
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5ob2xpZGF5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2hvbGlkYXlzL2RhdGEuaG9saWRheXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUU3QywyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBNEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFO0lBQzVDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO0lBQ3RDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQ2xDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ2pDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7SUFDakQsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7SUFDeEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRTtJQUM5QyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO0lBQzFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUs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
@@ -0,0 +1,4 @@
1
+ export * from './interfaces.js';
2
+ export { HolidayCalendarError, type THolidayCalendarErrorCode, } from './classes.holidaycalendarerror.js';
3
+ export { germanStates, holidayCalendarFirstYear, holidayLawsReadOn } from './data.holidays.js';
4
+ export { easterSunday, findGermanState, getPublicHolidays, getPublicHolidaysOn, isPublicHoliday, isWorkingDay, nextWorkingDay, workingDayOnOrAfter, } from './calendar.js';
@@ -0,0 +1,7 @@
1
+ // This entry point stands alone: it imports nothing from the rest of the package, has no
2
+ // dependencies and needs no storage or network.
3
+ export * from './interfaces.js';
4
+ export { HolidayCalendarError, } from './classes.holidaycalendarerror.js';
5
+ export { germanStates, holidayCalendarFirstYear, holidayLawsReadOn } from './data.holidays.js';
6
+ export { easterSunday, findGermanState, getPublicHolidays, getPublicHolidaysOn, isPublicHoliday, isWorkingDay, nextWorkingDay, workingDayOnOrAfter, } from './calendar.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9ob2xpZGF5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5RkFBeUY7QUFDekYsZ0RBQWdEO0FBQ2hELGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRixPQUFPLEVBQ0wsWUFBWSxFQUNaLGVBQWUsRUFDZixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixZQUFZLEVBQ1osY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLGVBQWUsQ0FBQyJ9