├── .editorconfig ├── .eslintrc.json ├── .gitignore ├── .prettierrc.json ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── Readme.md ├── bower.json ├── docs.md ├── index.d.ts ├── npm.md ├── package-lock.json ├── package.json ├── rollup.config.js ├── sample └── typescript_example.ts ├── spec ├── bundesweit.spec.ts ├── errors.spec.ts ├── feiertage.spec.ts ├── feiertage2017.spec.ts ├── feiertage2019.spec.ts ├── feiertage2020.spec.ts ├── feiertageNames.spec.ts ├── feiertageToRegion.spec.ts ├── inputCheck.spec.ts ├── localholidays.spec.ts └── translation.spec.ts ├── src ├── feiertage.ts ├── german-translations.ts ├── holiday-type.ts ├── holiday.ts └── regions.ts ├── tsconfig.json └── vite.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | max_line_length = 80 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | max_line_length = 0 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2021": true, 4 | "node": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:@typescript-eslint/recommended", 9 | "plugin:jest/recommended", 10 | "prettier" 11 | ], 12 | "overrides": [], 13 | "parser": "@typescript-eslint/parser", 14 | "parserOptions": { 15 | "ecmaVersion": "latest", 16 | "sourceType": "module" 17 | }, 18 | "plugins": ["@typescript-eslint"], 19 | "rules": {} 20 | } 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # exclude intellij idea 2 | .idea 3 | 4 | # exclude vscode 5 | .vscode 6 | 7 | # Logs 8 | logs 9 | *.log 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 23 | .grunt 24 | 25 | # node-waf configuration 26 | .lock-wscript 27 | 28 | # Compiled binary addons (http://nodejs.org/api/addons.html) 29 | build/Release 30 | 31 | # Dependency directory 32 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 33 | node_modules 34 | 35 | build/ 36 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/prettierrc", 3 | "printWidth": 80, 4 | "tabWidth": 2, 5 | "semi": true, 6 | "singleQuote": true, 7 | "trailingComma": "all", 8 | "overrides": [ 9 | { 10 | "files": ".prettierrc", 11 | "options": { "parser": "json" } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "19" 4 | - "18" 5 | - "16" 6 | - "14" 7 | # keep the npm cache around to speed up installs 8 | cache: 9 | directories: 10 | - "$HOME/.npm" 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | Version 1.4.1 // 14th Jun 2024 3 | * [Bugfix] Weltfrauentag, Reformationstag validity 4 | * [Enhancement] Unittests for field values added 5 | 6 | Version 1.4.0 // 29th Dec 2023 7 | 8 | * [Enhancement] Added regions field to holday entity 9 | * [Migration] Depreacted trans() method, merged to translate() 10 | * [Migration] Updated depencenies 11 | 12 | Version 1.3.9 // 22th May 2023 13 | 14 | * [Bugfix] Added Augsburg to index.d.ts 15 | 16 | Version 1.3.8 // 19th May 2023 17 | 18 | * [Enhancement] Upgraded to ESM and commonjs package 19 | 20 | 21 | Version 1.3.3 // 23rd November 2022 22 | 23 | * [Enhancement] Added Reformationstag for SH 24 | 25 | Version 1.3.1 // 31st December 2021 26 | 27 | * [Bugfix] For specific holiday as mentioned in Issue #46 28 | 29 | Version 1.3.0 // 16th January 2021 30 | 31 | * Typescript first implementation 32 | * Docs updated 33 | * Region/Test for Augsburgfeiertag added 34 | 35 | 36 | 37 | Version 1.2.7 // 27th October 2019 38 | 39 | * issue #33 added 'Reformationstag' for Hamburg and Bremen. 40 | 41 | 42 | Version 1.2.6. // 27th March 2019 43 | 44 | * issue #28: made toUtcTimestamp immutable; 45 | 46 | Version 1.2.5. // 16th March 2019 47 | 48 | * updated all devdependencies 49 | 50 | Version 1.2.4 // 25th Feburary 2019 51 | 52 | * added Weltfrauentag to Berlin 53 | 54 | 55 | Version 1.2.3 // 21st January 2019 56 | 57 | * fix: Maria Himmelfahrt BY and SL 58 | * Refactoring (thetric) 59 | * devDepency updates (thetric) 60 | 61 | 62 | Version 1.2.2 // 7th February 2018 63 | 64 | * fix: Maria Himmelfahrt BY and SL 65 | * Refactoring (thetric) 66 | * devDepency updates (thetric) 67 | 68 | Version 1.2.0 // 14th October 2017 69 | 70 | * Breaking: Dropped support for Node 0.12.x (!) 71 | * 100% Code Coverage for testing 72 | * Migrates the source code to Flow 73 | * creates UMD (for browsers, Node) and additional ES Modules (for bundlers like rollup, webpack) 74 | * adds a script to generate an API doc 75 | * code coverage (text-summary in the console, html reports) 76 | * adds EsLint 77 | * adds prettier - a code formatter. 78 | 79 | 80 | Version 1.1.7 // 25th September 2017 81 | 82 | * added getHolidayByDate(date, region) method 83 | 84 | 85 | Version 1.1.5 // 27th August 2017 86 | 87 | * Compatibility issues with DateJS solved 88 | * Buss- und Betttag cacluation replaced 89 | * New Unit tests for 2017 90 | * Deprecated isMariaHimmelfahrt removed; please use feiertagejs.isSpecificHoliday(); 91 | * Added timezone independent 'dateString' attribute of Feiertag Object; replaced equals method 92 | 93 | 94 | 95 | Version 1.1.4 // 29th August 2016 96 | 97 | * Reformationstag 2017 is a national holiday + Unittests 98 | * Added .equals() method to compare date. 99 | 100 | 101 | Version 1.1.1 // 16th August 2016 102 | 103 | * added Translation functionality, so you can add your own labels/language. 104 | * added language fallback to German 105 | 106 | 107 | 108 | Version 1.1.0 // 23rd May 2016 109 | 110 | * *interface change:* getHolidays(2016,'BW') => Does not return an Date array anymore, but an Object array. 111 | 112 | * rewrote internal logic, added names and text translation 113 | * added getHolidays() 114 | * added getSpecificHolidays 115 | * addded constants for every holiday 116 | * improved interal cache 117 | * added all as region 118 | 119 | 120 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Simon Fakir 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Feiertage.js 2 | 3 | [![npm version](https://badge.fury.io/js/feiertagejs.svg)](https://badge.fury.io/js/feiertagejs) 4 | [![Build Status](https://travis-ci.org/sfakir/feiertagejs.svg?branch=master)](https://travis-ci.org/sfakir/feiertagejs) 5 | 6 | Feiertage.js is a small _typescript_ npm module without dependencies to calculate German holidays for each Bundesland. 7 | 8 | ## Installation 9 | 10 | - [yarn](https://yarnpkg.com/en/): `yarn add feiertagejs` 11 | - [npm](https://www.npmjs.com/): `npm install feiertagejs` 12 | - [bower](https://bower.io/): `bower install feiertagejs` _outdated!_ 13 | - [Plain Javascript](http://extern.fakir.it/feiertagejs/feiertagejs.zip) _outdated!_ 14 | 15 | 16 | If you are looking for a day.js plugin find it in [this repository](https://github.com/fakir-tech/dayjs-feiertage). 17 | 18 | 19 | ## Quick Examples 20 | 21 | ### ES Modules (Typescript/Javasript) 22 | 23 | The prefered whay is to directly import the typescript module. However, you can also use .js. 24 | Please find here some examples and full api [here](docs.md). 25 | 26 | ```javascript 27 | import { getHolidays, isHoliday, isSpecificHoliday } from 'feiertagejs'; 28 | 29 | const today = new Date(); 30 | 31 | // is today a holiday? 32 | isHoliday(today, 'BW'); // false -- probably false, because you are working ;) 33 | 34 | // check if a day is a specific holiday 35 | isSpecificHoliday(today, 'CHRISTIHIMMELFAHRT', 'ALL'); // true | false 36 | 37 | // get all holiday for a single year: getHolidays() 38 | // returns an array of "Holiday" Objects. Please see the docs.md for all properties. 39 | const holidays2023 = getHolidays('2023', 'BUND'); 40 | 41 | holidays2023[0].date // === Date("2023-01-01"); 42 | holidays2023[0].name // 'NEUJAHRSTAG' (constant) 43 | holidays2023[0].translate('de') // German translation: Neujahrstag 44 | holidays2023[0].equals(date) // Compare days only (ignore time) 45 | ``` 46 | 47 | One entry of the array contains: 48 | 49 | ```javascript 50 | [{ 51 | name: 'CHRISTIHIMMELFAHRT', 52 | date: new Date('2023-05-17T22:00:00.000Z'), 53 | dateString: '2023-05-18', 54 | regions: [ 55 | 'BW', 'BY', 'BE', 56 | 'BB', 'HB', 'HE', 57 | 'HH', 'MV', 'NI', 58 | 'NW', 'RP', 'SL', 59 | 'SN', 'ST', 'SH', 60 | 'TH', 'BUND', 'AUGSBURG', 61 | 'ALL' 62 | ], 63 | translate: [Function: translate], 64 | getNormalizedDate: [Function: getNormalizedDate], 65 | equals: [Function: equals] 66 | } 67 | ] 68 | 69 | ``` 70 | 71 | ## API doc 72 | 73 | The full API doc can be found [here](docs.md). 74 | 75 | ## Feedback and Questions 76 | 77 | You have two options two give feedback or ask questions: 78 | 79 | - Comment the official release [post](https://fakir.tech/de/feiertage-js-deutsche-feiertage-fuer-node-js-und-browser-javascript/) 80 | - Open issues or pullrequests on [github](https://github.com/sfakir/feiertagejs) 81 | 82 | ## Contributors 83 | 84 | Thank you for contributing: 85 | 86 | - thetric 87 | - SteveOswald 88 | 89 | ## Feedback 90 | 91 | If you have any questions, feel free to open an issue. 92 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "feiertagejs", 3 | "version": "1.2.1", 4 | "main": "build/feiertage.umd.js", 5 | "license": "MIT", 6 | "ignore": ["**/.*", "build", "*.md"], 7 | "devDependencies": { 8 | "mocha": "^2.2.5" 9 | }, 10 | "keywords": ["javascript", "feiertage", "holidays", "germany"] 11 | } 12 | -------------------------------------------------------------------------------- /docs.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### Table of Contents 4 | 5 | *Types* 6 | - [HolidayType](#holidaytype) 7 | - [Region](#region) 8 | - [Holiday](#holiday) 9 | - [allHolidays](#allholidays) 10 | - [allRegions](#allregions) 11 | - [TranslationTable](#translationtable) 12 | 13 | *API* 14 | - [isHoliday(date, region)](#isholiday) 15 | - [getHolidayByDate(date, region)](#getholidaybydate) 16 | - [getHolidays(year, region)](#getholidays) 17 | - [isSunOrHoliday(date, region)](#issunorholiday) 18 | - [isSpecificHoliday(date, name, region)](#isspecificholiday) 19 | - [addTranslation(isoCode, translation)](#addtranslation) 20 | - [setLanguage(lng)](#setlanguage) 21 | - [getLanguage()](#getlanguage) 22 | 23 | 24 | 25 | ## Types 26 | 27 | ### HolidayType 28 | 29 | Type: (`"NEUJAHRSTAG"` \| `"HEILIGEDREIKOENIGE"` \| `"KARFREITAG"` \| `"OSTERSONNTAG"` \| `"OSTERMONTAG"` \| `"TAG_DER_ARBEIT"` \| `"CHRISTIHIMMELFAHRT"` \| `"MARIAHIMMELFAHRT"` \| `"PFINGSTSONNTAG"` \| `"PFINGSTMONTAG"` \| `"FRONLEICHNAM"` \| `"DEUTSCHEEINHEIT"` \| `"REFORMATIONSTAG"` \| `"ALLERHEILIGEN"` \| `"BUBETAG"` \| `"ERSTERWEIHNACHTSFEIERTAG"` \| `"ZWEITERWEIHNACHTSFEIERTAG"` \| `"WELTKINDERTAG"` \| `"WELTFRAUENTAG"` \| `"AUGSBURGER_FRIEDENSFEST"`) 30 | 31 | ### Region 32 | 33 | Type: (`"BW"` \| `"BY"` \| `"BE"` \| `"BB"` \| `"HB"` \| `"HE"` \| `"HH"` \| `"MV"` \| `"NI"` \| `"NW"` \| `"RP"` \| `"SL"` \| `"SN"` \| `"ST"` \| `"SH"` \| `"TH"` \| `"BUND"` \| `"ALL"`) 34 | 35 | As defined here: https://de.wikipedia.org/wiki/Land_(Deutschland)#Amtliche_bzw._Eigenbezeichnungen 36 | 37 | The difference between BUND and ALL is defined as follows: 38 | * "ALL" refers to every holiday which is valid in **at least** one region. So a holiday that only applies to one state will be included. 39 | * "BUND" refers to holidays that are valid in every region ("bundesweit"). So a holiday that only applies to one state will not be included. 40 | 41 | ### Holiday 42 | 43 | Type: {name: [HolidayType](#holidaytype), date: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date), trans: function (lang: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?): [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), dateString: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String), equals: function (date: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)): [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)} 44 | 45 | **Properties** 46 | 47 | - `name` **[HolidayType](#holidaytype)** 48 | - `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)** 49 | - `trans` **function (lang: [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?): [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** 50 | - `dateString` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** 51 | - `equals` **function (date: [Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)): [boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 52 | 53 | ### allHolidays 54 | 55 | Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[HolidayType](#holidaytype)> 56 | 57 | ### allRegions 58 | 59 | Type: [Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Region](#region)> 60 | 61 | ### TranslationTable 62 | 63 | Map of [HolidayType](#holidaytype) to translation string. 64 | 65 | Type: {} 66 | 67 | 68 | ## API 69 | ### addTranslation() 70 | 71 | Adds a translation for the holidays (e.g. English). 72 | This also allows overriding the German names. 73 | Hint: Interpolates German for missing translations 74 | 75 | **Parameters** 76 | 77 | - `isoCode` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** of the new language 78 | - `newTranslation` **[TranslationTable](#translationtable)** map of {HolidayType} to translation stringg 79 | 80 | ### setLanguage() 81 | 82 | Set a language to default language 83 | 84 | **Parameters** 85 | 86 | - `isoCode` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** 87 | 88 | ### getLanguage() 89 | 90 | Get currently set language 91 | 92 | Returns **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** 93 | 94 | ### isSunOrHoliday() 95 | 96 | Checks if a specific date is sunday or holiday. 97 | 98 | **Parameters** 99 | 100 | - `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)** 101 | - `region` **[Region](#region)** 102 | 103 | Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 104 | 105 | ### isHoliday() 106 | 107 | Check is specific date is holiday. 108 | 109 | **Parameters** 110 | 111 | - `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)** 112 | - `region` **[Region](#region)** two character [Region](#region) code 113 | 114 | Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 115 | 116 | ### getHolidayByDate() 117 | 118 | **Parameters** 119 | 120 | - `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)** 121 | - `region` **[Region](#region)** (optional, default `'ALL'`) 122 | 123 | Returns **([Holiday](#holiday) | void)** 124 | 125 | ### isSpecificHoliday() 126 | 127 | **Parameters** 128 | 129 | - `date` **[Date](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Date)** 130 | - `holidayName` **[HolidayType](#holidaytype)** 131 | - `region` **[Region](#region)** (optional, default `'ALL'`) 132 | 133 | Returns **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 134 | 135 | ### getHolidays() 136 | 137 | Returns all holidays of a year in a [Region](#region). 138 | 139 | **Parameters** 140 | 141 | - `year` **([number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number) \| [string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String))** 142 | - `region` **[Region](#region)** 143 | 144 | Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Holiday](#holiday)>** 145 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare type Region = 2 | | 'BW' // Baden-Württemberg 3 | | 'BY' // Bayern 4 | | 'BE' // Berlin 5 | | 'BB' // Brandenburg 6 | | 'HB' // Bremen 7 | | 'HE' // Hessen 8 | | 'HH' // Hamburg 9 | | 'MV' // Mecklenburg-Vorpommern 10 | | 'NI' // Niedersachsen 11 | | 'NW' // Nordrhein-Westfalen 12 | | 'RP' // Rheinland-Pfalz 13 | | 'SL' // Saarland 14 | | 'SN' // Sachsen 15 | | 'ST' // Sachsen-Anhalt 16 | | 'SH' // Schleswig-Holstein 17 | | 'TH' // Thüringen 18 | | 'BUND' // Gesamt-Deutschland 19 | | 'AUGSBURG' 20 | | 'ALL'; 21 | 22 | declare type Holiday = { 23 | name: HolidayType; 24 | date: Date; 25 | trans?: (lang: string | undefined) => string; // deprecated; 26 | translate: (lang?: string | undefined) => string; 27 | dateString: string; 28 | equals: (date: Date) => boolean; 29 | }; 30 | 31 | declare type HolidayType = 32 | | 'NEUJAHRSTAG' 33 | | 'HEILIGEDREIKOENIGE' 34 | | 'KARFREITAG' 35 | | 'OSTERSONNTAG' 36 | | 'OSTERMONTAG' 37 | | 'TAG_DER_ARBEIT' 38 | | 'CHRISTIHIMMELFAHRT' 39 | | 'MARIAHIMMELFAHRT' 40 | | 'PFINGSTSONNTAG' 41 | | 'PFINGSTMONTAG' 42 | | 'FRONLEICHNAM' 43 | | 'DEUTSCHEEINHEIT' 44 | | 'REFORMATIONSTAG' 45 | | 'ALLERHEILIGEN' 46 | | 'BUBETAG' 47 | | 'ERSTERWEIHNACHTSFEIERTAG' 48 | | 'ZWEITERWEIHNACHTSFEIERTAG'; 49 | 50 | /** 51 | * Map of {@link HolidayType} to translation string. 52 | */ 53 | export type TranslationTable = { 54 | [key: string]: string; 55 | }; 56 | 57 | /** 58 | * adds a translation for the holidays (e.g. english). 59 | * This also allows to override the German names. 60 | * Hint: Interpolates German for missing translations 61 | * @param {string} isoCode of the new language 62 | * @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg 63 | */ 64 | declare function addTranslation( 65 | isoCode: string, 66 | newTranslation: TranslationTable, 67 | ): void; 68 | 69 | /** 70 | * Set a language to default language 71 | * @param {string} isoCode 72 | */ 73 | declare function setLanguage(isoCode: string): void; 74 | 75 | /** 76 | * Get currently set language 77 | * @returns {string} 78 | */ 79 | declare function getLanguage(): string; 80 | 81 | // holidays api 82 | 83 | /** 84 | * Checks if a specific date is sunday or holiday. 85 | * @param date 86 | * @param region 87 | * @returns {boolean} 88 | */ 89 | declare function isSunOrHoliday(date: Date, region: Region): boolean; 90 | 91 | /** 92 | * Check is specific date is holiday. 93 | * @param date 94 | * @param {Region} region two character {@link Region} code 95 | * @returns {boolean} 96 | */ 97 | declare function isHoliday(date: Date, region: Region): boolean; 98 | 99 | declare function getHolidayByDate(date: Date, region: Region): Holiday | void; 100 | 101 | declare function isSpecificHoliday( 102 | date: Date, 103 | holidayName: HolidayType, 104 | region: Region, 105 | ): boolean; 106 | 107 | /** 108 | * Returns all holidays of a year in a {@link Region}. 109 | * @param year 110 | * @param region 111 | * @returns {Array.} 112 | */ 113 | declare function getHolidays(year: number | string, region: Region): Holiday[]; 114 | -------------------------------------------------------------------------------- /npm.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # How to release an update 4 | 5 | 6 | modifiy package.json 7 | 8 | npm run build 9 | git tag -a v1.4.0 -m "Release version 1.4.0" 10 | git push 11 | npm publish 12 | 13 | 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "feiertagejs", 3 | "version": "1.3.9", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "feiertagejs", 9 | "version": "1.3.9", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "@rollup/plugin-typescript": "^10.0.1", 13 | "@typescript-eslint/eslint-plugin": "^5.47.1", 14 | "@typescript-eslint/parser": "^5.47.1", 15 | "@vitest/coverage-c8": "^0.26.2", 16 | "eslint": "^8.30.0", 17 | "eslint-config-prettier": "^8.5.0", 18 | "prettier": "^2.8.1", 19 | "rollup": "^3.9.0", 20 | "typescript": "^4.9.4", 21 | "vitest": "^0.26.2" 22 | }, 23 | "engines": { 24 | "node": ">=8.0.0" 25 | } 26 | }, 27 | "node_modules/@bcoe/v8-coverage": { 28 | "version": "0.2.3", 29 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 30 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 31 | "dev": true 32 | }, 33 | "node_modules/@esbuild/android-arm": { 34 | "version": "0.17.19", 35 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", 36 | "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", 37 | "cpu": [ 38 | "arm" 39 | ], 40 | "dev": true, 41 | "optional": true, 42 | "os": [ 43 | "android" 44 | ], 45 | "engines": { 46 | "node": ">=12" 47 | } 48 | }, 49 | "node_modules/@esbuild/android-arm64": { 50 | "version": "0.17.19", 51 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", 52 | "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", 53 | "cpu": [ 54 | "arm64" 55 | ], 56 | "dev": true, 57 | "optional": true, 58 | "os": [ 59 | "android" 60 | ], 61 | "engines": { 62 | "node": ">=12" 63 | } 64 | }, 65 | "node_modules/@esbuild/android-x64": { 66 | "version": "0.17.19", 67 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", 68 | "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", 69 | "cpu": [ 70 | "x64" 71 | ], 72 | "dev": true, 73 | "optional": true, 74 | "os": [ 75 | "android" 76 | ], 77 | "engines": { 78 | "node": ">=12" 79 | } 80 | }, 81 | "node_modules/@esbuild/darwin-arm64": { 82 | "version": "0.17.19", 83 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", 84 | "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", 85 | "cpu": [ 86 | "arm64" 87 | ], 88 | "dev": true, 89 | "optional": true, 90 | "os": [ 91 | "darwin" 92 | ], 93 | "engines": { 94 | "node": ">=12" 95 | } 96 | }, 97 | "node_modules/@esbuild/darwin-x64": { 98 | "version": "0.17.19", 99 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", 100 | "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", 101 | "cpu": [ 102 | "x64" 103 | ], 104 | "dev": true, 105 | "optional": true, 106 | "os": [ 107 | "darwin" 108 | ], 109 | "engines": { 110 | "node": ">=12" 111 | } 112 | }, 113 | "node_modules/@esbuild/freebsd-arm64": { 114 | "version": "0.17.19", 115 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", 116 | "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", 117 | "cpu": [ 118 | "arm64" 119 | ], 120 | "dev": true, 121 | "optional": true, 122 | "os": [ 123 | "freebsd" 124 | ], 125 | "engines": { 126 | "node": ">=12" 127 | } 128 | }, 129 | "node_modules/@esbuild/freebsd-x64": { 130 | "version": "0.17.19", 131 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", 132 | "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", 133 | "cpu": [ 134 | "x64" 135 | ], 136 | "dev": true, 137 | "optional": true, 138 | "os": [ 139 | "freebsd" 140 | ], 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/@esbuild/linux-arm": { 146 | "version": "0.17.19", 147 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", 148 | "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", 149 | "cpu": [ 150 | "arm" 151 | ], 152 | "dev": true, 153 | "optional": true, 154 | "os": [ 155 | "linux" 156 | ], 157 | "engines": { 158 | "node": ">=12" 159 | } 160 | }, 161 | "node_modules/@esbuild/linux-arm64": { 162 | "version": "0.17.19", 163 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", 164 | "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", 165 | "cpu": [ 166 | "arm64" 167 | ], 168 | "dev": true, 169 | "optional": true, 170 | "os": [ 171 | "linux" 172 | ], 173 | "engines": { 174 | "node": ">=12" 175 | } 176 | }, 177 | "node_modules/@esbuild/linux-ia32": { 178 | "version": "0.17.19", 179 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", 180 | "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", 181 | "cpu": [ 182 | "ia32" 183 | ], 184 | "dev": true, 185 | "optional": true, 186 | "os": [ 187 | "linux" 188 | ], 189 | "engines": { 190 | "node": ">=12" 191 | } 192 | }, 193 | "node_modules/@esbuild/linux-loong64": { 194 | "version": "0.17.19", 195 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", 196 | "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", 197 | "cpu": [ 198 | "loong64" 199 | ], 200 | "dev": true, 201 | "optional": true, 202 | "os": [ 203 | "linux" 204 | ], 205 | "engines": { 206 | "node": ">=12" 207 | } 208 | }, 209 | "node_modules/@esbuild/linux-mips64el": { 210 | "version": "0.17.19", 211 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", 212 | "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", 213 | "cpu": [ 214 | "mips64el" 215 | ], 216 | "dev": true, 217 | "optional": true, 218 | "os": [ 219 | "linux" 220 | ], 221 | "engines": { 222 | "node": ">=12" 223 | } 224 | }, 225 | "node_modules/@esbuild/linux-ppc64": { 226 | "version": "0.17.19", 227 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", 228 | "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", 229 | "cpu": [ 230 | "ppc64" 231 | ], 232 | "dev": true, 233 | "optional": true, 234 | "os": [ 235 | "linux" 236 | ], 237 | "engines": { 238 | "node": ">=12" 239 | } 240 | }, 241 | "node_modules/@esbuild/linux-riscv64": { 242 | "version": "0.17.19", 243 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", 244 | "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", 245 | "cpu": [ 246 | "riscv64" 247 | ], 248 | "dev": true, 249 | "optional": true, 250 | "os": [ 251 | "linux" 252 | ], 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/@esbuild/linux-s390x": { 258 | "version": "0.17.19", 259 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", 260 | "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", 261 | "cpu": [ 262 | "s390x" 263 | ], 264 | "dev": true, 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/@esbuild/linux-x64": { 274 | "version": "0.17.19", 275 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", 276 | "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", 277 | "cpu": [ 278 | "x64" 279 | ], 280 | "dev": true, 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/netbsd-x64": { 290 | "version": "0.17.19", 291 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", 292 | "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", 293 | "cpu": [ 294 | "x64" 295 | ], 296 | "dev": true, 297 | "optional": true, 298 | "os": [ 299 | "netbsd" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/openbsd-x64": { 306 | "version": "0.17.19", 307 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", 308 | "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", 309 | "cpu": [ 310 | "x64" 311 | ], 312 | "dev": true, 313 | "optional": true, 314 | "os": [ 315 | "openbsd" 316 | ], 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/@esbuild/sunos-x64": { 322 | "version": "0.17.19", 323 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", 324 | "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", 325 | "cpu": [ 326 | "x64" 327 | ], 328 | "dev": true, 329 | "optional": true, 330 | "os": [ 331 | "sunos" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/@esbuild/win32-arm64": { 338 | "version": "0.17.19", 339 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", 340 | "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", 341 | "cpu": [ 342 | "arm64" 343 | ], 344 | "dev": true, 345 | "optional": true, 346 | "os": [ 347 | "win32" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/@esbuild/win32-ia32": { 354 | "version": "0.17.19", 355 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", 356 | "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", 357 | "cpu": [ 358 | "ia32" 359 | ], 360 | "dev": true, 361 | "optional": true, 362 | "os": [ 363 | "win32" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/@esbuild/win32-x64": { 370 | "version": "0.17.19", 371 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", 372 | "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", 373 | "cpu": [ 374 | "x64" 375 | ], 376 | "dev": true, 377 | "optional": true, 378 | "os": [ 379 | "win32" 380 | ], 381 | "engines": { 382 | "node": ">=12" 383 | } 384 | }, 385 | "node_modules/@eslint/eslintrc": { 386 | "version": "2.0.0", 387 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", 388 | "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", 389 | "dev": true, 390 | "dependencies": { 391 | "ajv": "^6.12.4", 392 | "debug": "^4.3.2", 393 | "espree": "^9.4.0", 394 | "globals": "^13.19.0", 395 | "ignore": "^5.2.0", 396 | "import-fresh": "^3.2.1", 397 | "js-yaml": "^4.1.0", 398 | "minimatch": "^3.1.2", 399 | "strip-json-comments": "^3.1.1" 400 | }, 401 | "engines": { 402 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 403 | }, 404 | "funding": { 405 | "url": "https://opencollective.com/eslint" 406 | } 407 | }, 408 | "node_modules/@eslint/eslintrc/node_modules/argparse": { 409 | "version": "2.0.1", 410 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 411 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 412 | "dev": true 413 | }, 414 | "node_modules/@eslint/eslintrc/node_modules/globals": { 415 | "version": "13.20.0", 416 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 417 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 418 | "dev": true, 419 | "dependencies": { 420 | "type-fest": "^0.20.2" 421 | }, 422 | "engines": { 423 | "node": ">=8" 424 | }, 425 | "funding": { 426 | "url": "https://github.com/sponsors/sindresorhus" 427 | } 428 | }, 429 | "node_modules/@eslint/eslintrc/node_modules/js-yaml": { 430 | "version": "4.1.0", 431 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 432 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 433 | "dev": true, 434 | "dependencies": { 435 | "argparse": "^2.0.1" 436 | }, 437 | "bin": { 438 | "js-yaml": "bin/js-yaml.js" 439 | } 440 | }, 441 | "node_modules/@eslint/eslintrc/node_modules/type-fest": { 442 | "version": "0.20.2", 443 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 444 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 445 | "dev": true, 446 | "engines": { 447 | "node": ">=10" 448 | }, 449 | "funding": { 450 | "url": "https://github.com/sponsors/sindresorhus" 451 | } 452 | }, 453 | "node_modules/@eslint/js": { 454 | "version": "8.35.0", 455 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", 456 | "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", 457 | "dev": true, 458 | "engines": { 459 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 460 | } 461 | }, 462 | "node_modules/@humanwhocodes/config-array": { 463 | "version": "0.11.8", 464 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", 465 | "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", 466 | "dev": true, 467 | "dependencies": { 468 | "@humanwhocodes/object-schema": "^1.2.1", 469 | "debug": "^4.1.1", 470 | "minimatch": "^3.0.5" 471 | }, 472 | "engines": { 473 | "node": ">=10.10.0" 474 | } 475 | }, 476 | "node_modules/@humanwhocodes/module-importer": { 477 | "version": "1.0.1", 478 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 479 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 480 | "dev": true, 481 | "engines": { 482 | "node": ">=12.22" 483 | }, 484 | "funding": { 485 | "type": "github", 486 | "url": "https://github.com/sponsors/nzakas" 487 | } 488 | }, 489 | "node_modules/@humanwhocodes/object-schema": { 490 | "version": "1.2.1", 491 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 492 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 493 | "dev": true 494 | }, 495 | "node_modules/@istanbuljs/schema": { 496 | "version": "0.1.3", 497 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 498 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 499 | "dev": true, 500 | "engines": { 501 | "node": ">=8" 502 | } 503 | }, 504 | "node_modules/@jridgewell/resolve-uri": { 505 | "version": "3.1.0", 506 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 507 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 508 | "dev": true, 509 | "engines": { 510 | "node": ">=6.0.0" 511 | } 512 | }, 513 | "node_modules/@jridgewell/sourcemap-codec": { 514 | "version": "1.4.14", 515 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 516 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 517 | "dev": true 518 | }, 519 | "node_modules/@jridgewell/trace-mapping": { 520 | "version": "0.3.17", 521 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 522 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 523 | "dev": true, 524 | "dependencies": { 525 | "@jridgewell/resolve-uri": "3.1.0", 526 | "@jridgewell/sourcemap-codec": "1.4.14" 527 | } 528 | }, 529 | "node_modules/@nodelib/fs.scandir": { 530 | "version": "2.1.5", 531 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 532 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 533 | "dev": true, 534 | "dependencies": { 535 | "@nodelib/fs.stat": "2.0.5", 536 | "run-parallel": "^1.1.9" 537 | }, 538 | "engines": { 539 | "node": ">= 8" 540 | } 541 | }, 542 | "node_modules/@nodelib/fs.stat": { 543 | "version": "2.0.5", 544 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 545 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 546 | "dev": true, 547 | "engines": { 548 | "node": ">= 8" 549 | } 550 | }, 551 | "node_modules/@nodelib/fs.walk": { 552 | "version": "1.2.8", 553 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 554 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 555 | "dev": true, 556 | "dependencies": { 557 | "@nodelib/fs.scandir": "2.1.5", 558 | "fastq": "^1.6.0" 559 | }, 560 | "engines": { 561 | "node": ">= 8" 562 | } 563 | }, 564 | "node_modules/@rollup/plugin-typescript": { 565 | "version": "10.0.1", 566 | "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz", 567 | "integrity": "sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A==", 568 | "dev": true, 569 | "dependencies": { 570 | "@rollup/pluginutils": "^5.0.1", 571 | "resolve": "^1.22.1" 572 | }, 573 | "engines": { 574 | "node": ">=14.0.0" 575 | }, 576 | "peerDependencies": { 577 | "rollup": "^2.14.0||^3.0.0", 578 | "tslib": "*", 579 | "typescript": ">=3.7.0" 580 | }, 581 | "peerDependenciesMeta": { 582 | "rollup": { 583 | "optional": true 584 | }, 585 | "tslib": { 586 | "optional": true 587 | } 588 | } 589 | }, 590 | "node_modules/@rollup/pluginutils": { 591 | "version": "5.0.2", 592 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", 593 | "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", 594 | "dev": true, 595 | "dependencies": { 596 | "@types/estree": "^1.0.0", 597 | "estree-walker": "^2.0.2", 598 | "picomatch": "^2.3.1" 599 | }, 600 | "engines": { 601 | "node": ">=14.0.0" 602 | }, 603 | "peerDependencies": { 604 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 605 | }, 606 | "peerDependenciesMeta": { 607 | "rollup": { 608 | "optional": true 609 | } 610 | } 611 | }, 612 | "node_modules/@rollup/pluginutils/node_modules/estree-walker": { 613 | "version": "2.0.2", 614 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 615 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 616 | "dev": true 617 | }, 618 | "node_modules/@tootallnate/once": { 619 | "version": "1.1.2", 620 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 621 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 622 | "dev": true, 623 | "optional": true, 624 | "peer": true, 625 | "engines": { 626 | "node": ">= 6" 627 | } 628 | }, 629 | "node_modules/@types/chai": { 630 | "version": "4.3.4", 631 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", 632 | "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", 633 | "dev": true 634 | }, 635 | "node_modules/@types/chai-subset": { 636 | "version": "1.3.3", 637 | "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", 638 | "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", 639 | "dev": true, 640 | "dependencies": { 641 | "@types/chai": "*" 642 | } 643 | }, 644 | "node_modules/@types/estree": { 645 | "version": "1.0.0", 646 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", 647 | "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", 648 | "dev": true 649 | }, 650 | "node_modules/@types/istanbul-lib-coverage": { 651 | "version": "2.0.4", 652 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 653 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 654 | "dev": true 655 | }, 656 | "node_modules/@types/json-schema": { 657 | "version": "7.0.11", 658 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 659 | "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", 660 | "dev": true 661 | }, 662 | "node_modules/@types/node": { 663 | "version": "17.0.5", 664 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", 665 | "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", 666 | "dev": true 667 | }, 668 | "node_modules/@types/semver": { 669 | "version": "7.3.13", 670 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", 671 | "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", 672 | "dev": true 673 | }, 674 | "node_modules/@typescript-eslint/eslint-plugin": { 675 | "version": "5.54.0", 676 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", 677 | "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", 678 | "dev": true, 679 | "dependencies": { 680 | "@typescript-eslint/scope-manager": "5.54.0", 681 | "@typescript-eslint/type-utils": "5.54.0", 682 | "@typescript-eslint/utils": "5.54.0", 683 | "debug": "^4.3.4", 684 | "grapheme-splitter": "^1.0.4", 685 | "ignore": "^5.2.0", 686 | "natural-compare-lite": "^1.4.0", 687 | "regexpp": "^3.2.0", 688 | "semver": "^7.3.7", 689 | "tsutils": "^3.21.0" 690 | }, 691 | "engines": { 692 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 693 | }, 694 | "funding": { 695 | "type": "opencollective", 696 | "url": "https://opencollective.com/typescript-eslint" 697 | }, 698 | "peerDependencies": { 699 | "@typescript-eslint/parser": "^5.0.0", 700 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 701 | }, 702 | "peerDependenciesMeta": { 703 | "typescript": { 704 | "optional": true 705 | } 706 | } 707 | }, 708 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { 709 | "version": "7.3.8", 710 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 711 | "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 712 | "dev": true, 713 | "dependencies": { 714 | "lru-cache": "^6.0.0" 715 | }, 716 | "bin": { 717 | "semver": "bin/semver.js" 718 | }, 719 | "engines": { 720 | "node": ">=10" 721 | } 722 | }, 723 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/tslib": { 724 | "version": "1.14.1", 725 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 726 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 727 | "dev": true 728 | }, 729 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { 730 | "version": "3.21.0", 731 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 732 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 733 | "dev": true, 734 | "dependencies": { 735 | "tslib": "^1.8.1" 736 | }, 737 | "engines": { 738 | "node": ">= 6" 739 | }, 740 | "peerDependencies": { 741 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 742 | } 743 | }, 744 | "node_modules/@typescript-eslint/parser": { 745 | "version": "5.54.0", 746 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.0.tgz", 747 | "integrity": "sha512-aAVL3Mu2qTi+h/r04WI/5PfNWvO6pdhpeMRWk9R7rEV4mwJNzoWf5CCU5vDKBsPIFQFjEq1xg7XBI2rjiMXQbQ==", 748 | "dev": true, 749 | "dependencies": { 750 | "@typescript-eslint/scope-manager": "5.54.0", 751 | "@typescript-eslint/types": "5.54.0", 752 | "@typescript-eslint/typescript-estree": "5.54.0", 753 | "debug": "^4.3.4" 754 | }, 755 | "engines": { 756 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 757 | }, 758 | "funding": { 759 | "type": "opencollective", 760 | "url": "https://opencollective.com/typescript-eslint" 761 | }, 762 | "peerDependencies": { 763 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 764 | }, 765 | "peerDependenciesMeta": { 766 | "typescript": { 767 | "optional": true 768 | } 769 | } 770 | }, 771 | "node_modules/@typescript-eslint/scope-manager": { 772 | "version": "5.54.0", 773 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", 774 | "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", 775 | "dev": true, 776 | "dependencies": { 777 | "@typescript-eslint/types": "5.54.0", 778 | "@typescript-eslint/visitor-keys": "5.54.0" 779 | }, 780 | "engines": { 781 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 782 | }, 783 | "funding": { 784 | "type": "opencollective", 785 | "url": "https://opencollective.com/typescript-eslint" 786 | } 787 | }, 788 | "node_modules/@typescript-eslint/type-utils": { 789 | "version": "5.54.0", 790 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", 791 | "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", 792 | "dev": true, 793 | "dependencies": { 794 | "@typescript-eslint/typescript-estree": "5.54.0", 795 | "@typescript-eslint/utils": "5.54.0", 796 | "debug": "^4.3.4", 797 | "tsutils": "^3.21.0" 798 | }, 799 | "engines": { 800 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 801 | }, 802 | "funding": { 803 | "type": "opencollective", 804 | "url": "https://opencollective.com/typescript-eslint" 805 | }, 806 | "peerDependencies": { 807 | "eslint": "*" 808 | }, 809 | "peerDependenciesMeta": { 810 | "typescript": { 811 | "optional": true 812 | } 813 | } 814 | }, 815 | "node_modules/@typescript-eslint/type-utils/node_modules/tslib": { 816 | "version": "1.14.1", 817 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 818 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 819 | "dev": true 820 | }, 821 | "node_modules/@typescript-eslint/type-utils/node_modules/tsutils": { 822 | "version": "3.21.0", 823 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 824 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 825 | "dev": true, 826 | "dependencies": { 827 | "tslib": "^1.8.1" 828 | }, 829 | "engines": { 830 | "node": ">= 6" 831 | }, 832 | "peerDependencies": { 833 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 834 | } 835 | }, 836 | "node_modules/@typescript-eslint/types": { 837 | "version": "5.54.0", 838 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", 839 | "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", 840 | "dev": true, 841 | "engines": { 842 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 843 | }, 844 | "funding": { 845 | "type": "opencollective", 846 | "url": "https://opencollective.com/typescript-eslint" 847 | } 848 | }, 849 | "node_modules/@typescript-eslint/typescript-estree": { 850 | "version": "5.54.0", 851 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", 852 | "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", 853 | "dev": true, 854 | "dependencies": { 855 | "@typescript-eslint/types": "5.54.0", 856 | "@typescript-eslint/visitor-keys": "5.54.0", 857 | "debug": "^4.3.4", 858 | "globby": "^11.1.0", 859 | "is-glob": "^4.0.3", 860 | "semver": "^7.3.7", 861 | "tsutils": "^3.21.0" 862 | }, 863 | "engines": { 864 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 865 | }, 866 | "funding": { 867 | "type": "opencollective", 868 | "url": "https://opencollective.com/typescript-eslint" 869 | }, 870 | "peerDependenciesMeta": { 871 | "typescript": { 872 | "optional": true 873 | } 874 | } 875 | }, 876 | "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 877 | "version": "7.3.8", 878 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 879 | "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 880 | "dev": true, 881 | "dependencies": { 882 | "lru-cache": "^6.0.0" 883 | }, 884 | "bin": { 885 | "semver": "bin/semver.js" 886 | }, 887 | "engines": { 888 | "node": ">=10" 889 | } 890 | }, 891 | "node_modules/@typescript-eslint/typescript-estree/node_modules/tslib": { 892 | "version": "1.14.1", 893 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 894 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 895 | "dev": true 896 | }, 897 | "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { 898 | "version": "3.21.0", 899 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", 900 | "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", 901 | "dev": true, 902 | "dependencies": { 903 | "tslib": "^1.8.1" 904 | }, 905 | "engines": { 906 | "node": ">= 6" 907 | }, 908 | "peerDependencies": { 909 | "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" 910 | } 911 | }, 912 | "node_modules/@typescript-eslint/utils": { 913 | "version": "5.54.0", 914 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", 915 | "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", 916 | "dev": true, 917 | "dependencies": { 918 | "@types/json-schema": "^7.0.9", 919 | "@types/semver": "^7.3.12", 920 | "@typescript-eslint/scope-manager": "5.54.0", 921 | "@typescript-eslint/types": "5.54.0", 922 | "@typescript-eslint/typescript-estree": "5.54.0", 923 | "eslint-scope": "^5.1.1", 924 | "eslint-utils": "^3.0.0", 925 | "semver": "^7.3.7" 926 | }, 927 | "engines": { 928 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 929 | }, 930 | "funding": { 931 | "type": "opencollective", 932 | "url": "https://opencollective.com/typescript-eslint" 933 | }, 934 | "peerDependencies": { 935 | "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" 936 | } 937 | }, 938 | "node_modules/@typescript-eslint/utils/node_modules/semver": { 939 | "version": "7.3.8", 940 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", 941 | "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", 942 | "dev": true, 943 | "dependencies": { 944 | "lru-cache": "^6.0.0" 945 | }, 946 | "bin": { 947 | "semver": "bin/semver.js" 948 | }, 949 | "engines": { 950 | "node": ">=10" 951 | } 952 | }, 953 | "node_modules/@typescript-eslint/visitor-keys": { 954 | "version": "5.54.0", 955 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", 956 | "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", 957 | "dev": true, 958 | "dependencies": { 959 | "@typescript-eslint/types": "5.54.0", 960 | "eslint-visitor-keys": "^3.3.0" 961 | }, 962 | "engines": { 963 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 964 | }, 965 | "funding": { 966 | "type": "opencollective", 967 | "url": "https://opencollective.com/typescript-eslint" 968 | } 969 | }, 970 | "node_modules/@vitest/coverage-c8": { 971 | "version": "0.26.3", 972 | "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.26.3.tgz", 973 | "integrity": "sha512-sjmVYPozajWY2DawzuvhYX6hEe/LD6p2xv9VmPvh1zzDeNNVCAnyLcvXoaSMQD522x9bqciuyPrlrnh2iNkE/w==", 974 | "dev": true, 975 | "dependencies": { 976 | "c8": "^7.12.0", 977 | "vitest": "0.26.3" 978 | }, 979 | "funding": { 980 | "url": "https://github.com/sponsors/antfu" 981 | } 982 | }, 983 | "node_modules/abab": { 984 | "version": "2.0.5", 985 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", 986 | "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", 987 | "dev": true, 988 | "optional": true, 989 | "peer": true 990 | }, 991 | "node_modules/acorn": { 992 | "version": "8.8.2", 993 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 994 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 995 | "dev": true, 996 | "bin": { 997 | "acorn": "bin/acorn" 998 | }, 999 | "engines": { 1000 | "node": ">=0.4.0" 1001 | } 1002 | }, 1003 | "node_modules/acorn-globals": { 1004 | "version": "6.0.0", 1005 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", 1006 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", 1007 | "dev": true, 1008 | "optional": true, 1009 | "peer": true, 1010 | "dependencies": { 1011 | "acorn": "^7.1.1", 1012 | "acorn-walk": "^7.1.1" 1013 | } 1014 | }, 1015 | "node_modules/acorn-globals/node_modules/acorn": { 1016 | "version": "7.4.1", 1017 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1018 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1019 | "dev": true, 1020 | "optional": true, 1021 | "peer": true, 1022 | "bin": { 1023 | "acorn": "bin/acorn" 1024 | }, 1025 | "engines": { 1026 | "node": ">=0.4.0" 1027 | } 1028 | }, 1029 | "node_modules/acorn-jsx": { 1030 | "version": "5.3.2", 1031 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1032 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1033 | "dev": true, 1034 | "peerDependencies": { 1035 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1036 | } 1037 | }, 1038 | "node_modules/acorn-walk": { 1039 | "version": "7.2.0", 1040 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 1041 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 1042 | "dev": true, 1043 | "optional": true, 1044 | "peer": true, 1045 | "engines": { 1046 | "node": ">=0.4.0" 1047 | } 1048 | }, 1049 | "node_modules/agent-base": { 1050 | "version": "6.0.2", 1051 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1052 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1053 | "dev": true, 1054 | "optional": true, 1055 | "peer": true, 1056 | "dependencies": { 1057 | "debug": "4" 1058 | }, 1059 | "engines": { 1060 | "node": ">= 6.0.0" 1061 | } 1062 | }, 1063 | "node_modules/ajv": { 1064 | "version": "6.12.6", 1065 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1066 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1067 | "dev": true, 1068 | "dependencies": { 1069 | "fast-deep-equal": "^3.1.1", 1070 | "fast-json-stable-stringify": "^2.0.0", 1071 | "json-schema-traverse": "^0.4.1", 1072 | "uri-js": "^4.2.2" 1073 | }, 1074 | "funding": { 1075 | "type": "github", 1076 | "url": "https://github.com/sponsors/epoberezkin" 1077 | } 1078 | }, 1079 | "node_modules/ansi-regex": { 1080 | "version": "5.0.1", 1081 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1082 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1083 | "dev": true, 1084 | "engines": { 1085 | "node": ">=8" 1086 | } 1087 | }, 1088 | "node_modules/ansi-styles": { 1089 | "version": "4.3.0", 1090 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1091 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1092 | "dev": true, 1093 | "dependencies": { 1094 | "color-convert": "^2.0.1" 1095 | }, 1096 | "engines": { 1097 | "node": ">=8" 1098 | }, 1099 | "funding": { 1100 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1101 | } 1102 | }, 1103 | "node_modules/array-union": { 1104 | "version": "2.1.0", 1105 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 1106 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 1107 | "dev": true, 1108 | "engines": { 1109 | "node": ">=8" 1110 | } 1111 | }, 1112 | "node_modules/assertion-error": { 1113 | "version": "1.1.0", 1114 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1115 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": "*" 1119 | } 1120 | }, 1121 | "node_modules/asynckit": { 1122 | "version": "0.4.0", 1123 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1124 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 1125 | "dev": true, 1126 | "optional": true, 1127 | "peer": true 1128 | }, 1129 | "node_modules/balanced-match": { 1130 | "version": "1.0.2", 1131 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1132 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1133 | "dev": true 1134 | }, 1135 | "node_modules/brace-expansion": { 1136 | "version": "1.1.11", 1137 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1138 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "balanced-match": "^1.0.0", 1142 | "concat-map": "0.0.1" 1143 | } 1144 | }, 1145 | "node_modules/braces": { 1146 | "version": "3.0.2", 1147 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1148 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1149 | "dev": true, 1150 | "dependencies": { 1151 | "fill-range": "^7.0.1" 1152 | }, 1153 | "engines": { 1154 | "node": ">=8" 1155 | } 1156 | }, 1157 | "node_modules/browser-process-hrtime": { 1158 | "version": "1.0.0", 1159 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", 1160 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", 1161 | "dev": true, 1162 | "optional": true, 1163 | "peer": true 1164 | }, 1165 | "node_modules/buffer-from": { 1166 | "version": "1.1.2", 1167 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1168 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1169 | "dev": true 1170 | }, 1171 | "node_modules/c8": { 1172 | "version": "7.13.0", 1173 | "resolved": "https://registry.npmjs.org/c8/-/c8-7.13.0.tgz", 1174 | "integrity": "sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==", 1175 | "dev": true, 1176 | "dependencies": { 1177 | "@bcoe/v8-coverage": "^0.2.3", 1178 | "@istanbuljs/schema": "^0.1.3", 1179 | "find-up": "^5.0.0", 1180 | "foreground-child": "^2.0.0", 1181 | "istanbul-lib-coverage": "^3.2.0", 1182 | "istanbul-lib-report": "^3.0.0", 1183 | "istanbul-reports": "^3.1.4", 1184 | "rimraf": "^3.0.2", 1185 | "test-exclude": "^6.0.0", 1186 | "v8-to-istanbul": "^9.0.0", 1187 | "yargs": "^16.2.0", 1188 | "yargs-parser": "^20.2.9" 1189 | }, 1190 | "bin": { 1191 | "c8": "bin/c8.js" 1192 | }, 1193 | "engines": { 1194 | "node": ">=10.12.0" 1195 | } 1196 | }, 1197 | "node_modules/c8/node_modules/find-up": { 1198 | "version": "5.0.0", 1199 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1200 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1201 | "dev": true, 1202 | "dependencies": { 1203 | "locate-path": "^6.0.0", 1204 | "path-exists": "^4.0.0" 1205 | }, 1206 | "engines": { 1207 | "node": ">=10" 1208 | }, 1209 | "funding": { 1210 | "url": "https://github.com/sponsors/sindresorhus" 1211 | } 1212 | }, 1213 | "node_modules/c8/node_modules/locate-path": { 1214 | "version": "6.0.0", 1215 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1216 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1217 | "dev": true, 1218 | "dependencies": { 1219 | "p-locate": "^5.0.0" 1220 | }, 1221 | "engines": { 1222 | "node": ">=10" 1223 | }, 1224 | "funding": { 1225 | "url": "https://github.com/sponsors/sindresorhus" 1226 | } 1227 | }, 1228 | "node_modules/c8/node_modules/p-limit": { 1229 | "version": "3.1.0", 1230 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1231 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1232 | "dev": true, 1233 | "dependencies": { 1234 | "yocto-queue": "^0.1.0" 1235 | }, 1236 | "engines": { 1237 | "node": ">=10" 1238 | }, 1239 | "funding": { 1240 | "url": "https://github.com/sponsors/sindresorhus" 1241 | } 1242 | }, 1243 | "node_modules/c8/node_modules/p-locate": { 1244 | "version": "5.0.0", 1245 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1246 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1247 | "dev": true, 1248 | "dependencies": { 1249 | "p-limit": "^3.0.2" 1250 | }, 1251 | "engines": { 1252 | "node": ">=10" 1253 | }, 1254 | "funding": { 1255 | "url": "https://github.com/sponsors/sindresorhus" 1256 | } 1257 | }, 1258 | "node_modules/c8/node_modules/v8-to-istanbul": { 1259 | "version": "9.1.0", 1260 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", 1261 | "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", 1262 | "dev": true, 1263 | "dependencies": { 1264 | "@jridgewell/trace-mapping": "^0.3.12", 1265 | "@types/istanbul-lib-coverage": "^2.0.1", 1266 | "convert-source-map": "^1.6.0" 1267 | }, 1268 | "engines": { 1269 | "node": ">=10.12.0" 1270 | } 1271 | }, 1272 | "node_modules/callsites": { 1273 | "version": "3.1.0", 1274 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1275 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1276 | "dev": true, 1277 | "engines": { 1278 | "node": ">=6" 1279 | } 1280 | }, 1281 | "node_modules/chai": { 1282 | "version": "4.3.7", 1283 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", 1284 | "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", 1285 | "dev": true, 1286 | "dependencies": { 1287 | "assertion-error": "^1.1.0", 1288 | "check-error": "^1.0.2", 1289 | "deep-eql": "^4.1.2", 1290 | "get-func-name": "^2.0.0", 1291 | "loupe": "^2.3.1", 1292 | "pathval": "^1.1.1", 1293 | "type-detect": "^4.0.5" 1294 | }, 1295 | "engines": { 1296 | "node": ">=4" 1297 | } 1298 | }, 1299 | "node_modules/chalk": { 1300 | "version": "4.1.2", 1301 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1302 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1303 | "dev": true, 1304 | "dependencies": { 1305 | "ansi-styles": "^4.1.0", 1306 | "supports-color": "^7.1.0" 1307 | }, 1308 | "engines": { 1309 | "node": ">=10" 1310 | }, 1311 | "funding": { 1312 | "url": "https://github.com/chalk/chalk?sponsor=1" 1313 | } 1314 | }, 1315 | "node_modules/check-error": { 1316 | "version": "1.0.2", 1317 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 1318 | "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", 1319 | "dev": true, 1320 | "engines": { 1321 | "node": "*" 1322 | } 1323 | }, 1324 | "node_modules/cliui": { 1325 | "version": "7.0.4", 1326 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1327 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "string-width": "^4.2.0", 1331 | "strip-ansi": "^6.0.0", 1332 | "wrap-ansi": "^7.0.0" 1333 | } 1334 | }, 1335 | "node_modules/color-convert": { 1336 | "version": "2.0.1", 1337 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1338 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1339 | "dev": true, 1340 | "dependencies": { 1341 | "color-name": "~1.1.4" 1342 | }, 1343 | "engines": { 1344 | "node": ">=7.0.0" 1345 | } 1346 | }, 1347 | "node_modules/color-name": { 1348 | "version": "1.1.4", 1349 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1350 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1351 | "dev": true 1352 | }, 1353 | "node_modules/combined-stream": { 1354 | "version": "1.0.8", 1355 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1356 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1357 | "dev": true, 1358 | "optional": true, 1359 | "peer": true, 1360 | "dependencies": { 1361 | "delayed-stream": "~1.0.0" 1362 | }, 1363 | "engines": { 1364 | "node": ">= 0.8" 1365 | } 1366 | }, 1367 | "node_modules/concat-map": { 1368 | "version": "0.0.1", 1369 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1370 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1371 | "dev": true 1372 | }, 1373 | "node_modules/convert-source-map": { 1374 | "version": "1.8.0", 1375 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 1376 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 1377 | "dev": true, 1378 | "dependencies": { 1379 | "safe-buffer": "~5.1.1" 1380 | } 1381 | }, 1382 | "node_modules/cross-spawn": { 1383 | "version": "7.0.3", 1384 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1385 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1386 | "dev": true, 1387 | "dependencies": { 1388 | "path-key": "^3.1.0", 1389 | "shebang-command": "^2.0.0", 1390 | "which": "^2.0.1" 1391 | }, 1392 | "engines": { 1393 | "node": ">= 8" 1394 | } 1395 | }, 1396 | "node_modules/cssom": { 1397 | "version": "0.4.4", 1398 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", 1399 | "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", 1400 | "dev": true, 1401 | "optional": true, 1402 | "peer": true 1403 | }, 1404 | "node_modules/cssstyle": { 1405 | "version": "2.3.0", 1406 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", 1407 | "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", 1408 | "dev": true, 1409 | "optional": true, 1410 | "peer": true, 1411 | "dependencies": { 1412 | "cssom": "~0.3.6" 1413 | }, 1414 | "engines": { 1415 | "node": ">=8" 1416 | } 1417 | }, 1418 | "node_modules/cssstyle/node_modules/cssom": { 1419 | "version": "0.3.8", 1420 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", 1421 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", 1422 | "dev": true, 1423 | "optional": true, 1424 | "peer": true 1425 | }, 1426 | "node_modules/data-urls": { 1427 | "version": "2.0.0", 1428 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", 1429 | "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", 1430 | "dev": true, 1431 | "optional": true, 1432 | "peer": true, 1433 | "dependencies": { 1434 | "abab": "^2.0.3", 1435 | "whatwg-mimetype": "^2.3.0", 1436 | "whatwg-url": "^8.0.0" 1437 | }, 1438 | "engines": { 1439 | "node": ">=10" 1440 | } 1441 | }, 1442 | "node_modules/debug": { 1443 | "version": "4.3.4", 1444 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1445 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1446 | "dev": true, 1447 | "dependencies": { 1448 | "ms": "2.1.2" 1449 | }, 1450 | "engines": { 1451 | "node": ">=6.0" 1452 | }, 1453 | "peerDependenciesMeta": { 1454 | "supports-color": { 1455 | "optional": true 1456 | } 1457 | } 1458 | }, 1459 | "node_modules/decimal.js": { 1460 | "version": "10.3.1", 1461 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", 1462 | "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", 1463 | "dev": true, 1464 | "optional": true, 1465 | "peer": true 1466 | }, 1467 | "node_modules/deep-eql": { 1468 | "version": "4.1.3", 1469 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 1470 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 1471 | "dev": true, 1472 | "dependencies": { 1473 | "type-detect": "^4.0.0" 1474 | }, 1475 | "engines": { 1476 | "node": ">=6" 1477 | } 1478 | }, 1479 | "node_modules/deep-is": { 1480 | "version": "0.1.4", 1481 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1482 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1483 | "dev": true 1484 | }, 1485 | "node_modules/delayed-stream": { 1486 | "version": "1.0.0", 1487 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1488 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 1489 | "dev": true, 1490 | "optional": true, 1491 | "peer": true, 1492 | "engines": { 1493 | "node": ">=0.4.0" 1494 | } 1495 | }, 1496 | "node_modules/dir-glob": { 1497 | "version": "3.0.1", 1498 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1499 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1500 | "dev": true, 1501 | "dependencies": { 1502 | "path-type": "^4.0.0" 1503 | }, 1504 | "engines": { 1505 | "node": ">=8" 1506 | } 1507 | }, 1508 | "node_modules/domexception": { 1509 | "version": "2.0.1", 1510 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", 1511 | "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", 1512 | "dev": true, 1513 | "optional": true, 1514 | "peer": true, 1515 | "dependencies": { 1516 | "webidl-conversions": "^5.0.0" 1517 | }, 1518 | "engines": { 1519 | "node": ">=8" 1520 | } 1521 | }, 1522 | "node_modules/domexception/node_modules/webidl-conversions": { 1523 | "version": "5.0.0", 1524 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", 1525 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", 1526 | "dev": true, 1527 | "optional": true, 1528 | "peer": true, 1529 | "engines": { 1530 | "node": ">=8" 1531 | } 1532 | }, 1533 | "node_modules/emoji-regex": { 1534 | "version": "8.0.0", 1535 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1536 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1537 | "dev": true 1538 | }, 1539 | "node_modules/esbuild": { 1540 | "version": "0.17.19", 1541 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", 1542 | "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", 1543 | "dev": true, 1544 | "hasInstallScript": true, 1545 | "bin": { 1546 | "esbuild": "bin/esbuild" 1547 | }, 1548 | "engines": { 1549 | "node": ">=12" 1550 | }, 1551 | "optionalDependencies": { 1552 | "@esbuild/android-arm": "0.17.19", 1553 | "@esbuild/android-arm64": "0.17.19", 1554 | "@esbuild/android-x64": "0.17.19", 1555 | "@esbuild/darwin-arm64": "0.17.19", 1556 | "@esbuild/darwin-x64": "0.17.19", 1557 | "@esbuild/freebsd-arm64": "0.17.19", 1558 | "@esbuild/freebsd-x64": "0.17.19", 1559 | "@esbuild/linux-arm": "0.17.19", 1560 | "@esbuild/linux-arm64": "0.17.19", 1561 | "@esbuild/linux-ia32": "0.17.19", 1562 | "@esbuild/linux-loong64": "0.17.19", 1563 | "@esbuild/linux-mips64el": "0.17.19", 1564 | "@esbuild/linux-ppc64": "0.17.19", 1565 | "@esbuild/linux-riscv64": "0.17.19", 1566 | "@esbuild/linux-s390x": "0.17.19", 1567 | "@esbuild/linux-x64": "0.17.19", 1568 | "@esbuild/netbsd-x64": "0.17.19", 1569 | "@esbuild/openbsd-x64": "0.17.19", 1570 | "@esbuild/sunos-x64": "0.17.19", 1571 | "@esbuild/win32-arm64": "0.17.19", 1572 | "@esbuild/win32-ia32": "0.17.19", 1573 | "@esbuild/win32-x64": "0.17.19" 1574 | } 1575 | }, 1576 | "node_modules/escalade": { 1577 | "version": "3.1.1", 1578 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1579 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1580 | "dev": true, 1581 | "engines": { 1582 | "node": ">=6" 1583 | } 1584 | }, 1585 | "node_modules/escodegen": { 1586 | "version": "2.0.0", 1587 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", 1588 | "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", 1589 | "dev": true, 1590 | "optional": true, 1591 | "peer": true, 1592 | "dependencies": { 1593 | "esprima": "^4.0.1", 1594 | "estraverse": "^5.2.0", 1595 | "esutils": "^2.0.2", 1596 | "optionator": "^0.8.1" 1597 | }, 1598 | "bin": { 1599 | "escodegen": "bin/escodegen.js", 1600 | "esgenerate": "bin/esgenerate.js" 1601 | }, 1602 | "engines": { 1603 | "node": ">=6.0" 1604 | }, 1605 | "optionalDependencies": { 1606 | "source-map": "~0.6.1" 1607 | } 1608 | }, 1609 | "node_modules/eslint": { 1610 | "version": "8.35.0", 1611 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", 1612 | "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", 1613 | "dev": true, 1614 | "dependencies": { 1615 | "@eslint/eslintrc": "^2.0.0", 1616 | "@eslint/js": "8.35.0", 1617 | "@humanwhocodes/config-array": "^0.11.8", 1618 | "@humanwhocodes/module-importer": "^1.0.1", 1619 | "@nodelib/fs.walk": "^1.2.8", 1620 | "ajv": "^6.10.0", 1621 | "chalk": "^4.0.0", 1622 | "cross-spawn": "^7.0.2", 1623 | "debug": "^4.3.2", 1624 | "doctrine": "^3.0.0", 1625 | "escape-string-regexp": "^4.0.0", 1626 | "eslint-scope": "^7.1.1", 1627 | "eslint-utils": "^3.0.0", 1628 | "eslint-visitor-keys": "^3.3.0", 1629 | "espree": "^9.4.0", 1630 | "esquery": "^1.4.2", 1631 | "esutils": "^2.0.2", 1632 | "fast-deep-equal": "^3.1.3", 1633 | "file-entry-cache": "^6.0.1", 1634 | "find-up": "^5.0.0", 1635 | "glob-parent": "^6.0.2", 1636 | "globals": "^13.19.0", 1637 | "grapheme-splitter": "^1.0.4", 1638 | "ignore": "^5.2.0", 1639 | "import-fresh": "^3.0.0", 1640 | "imurmurhash": "^0.1.4", 1641 | "is-glob": "^4.0.0", 1642 | "is-path-inside": "^3.0.3", 1643 | "js-sdsl": "^4.1.4", 1644 | "js-yaml": "^4.1.0", 1645 | "json-stable-stringify-without-jsonify": "^1.0.1", 1646 | "levn": "^0.4.1", 1647 | "lodash.merge": "^4.6.2", 1648 | "minimatch": "^3.1.2", 1649 | "natural-compare": "^1.4.0", 1650 | "optionator": "^0.9.1", 1651 | "regexpp": "^3.2.0", 1652 | "strip-ansi": "^6.0.1", 1653 | "strip-json-comments": "^3.1.0", 1654 | "text-table": "^0.2.0" 1655 | }, 1656 | "bin": { 1657 | "eslint": "bin/eslint.js" 1658 | }, 1659 | "engines": { 1660 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1661 | }, 1662 | "funding": { 1663 | "url": "https://opencollective.com/eslint" 1664 | } 1665 | }, 1666 | "node_modules/eslint-config-prettier": { 1667 | "version": "8.6.0", 1668 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", 1669 | "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", 1670 | "dev": true, 1671 | "bin": { 1672 | "eslint-config-prettier": "bin/cli.js" 1673 | }, 1674 | "peerDependencies": { 1675 | "eslint": ">=7.0.0" 1676 | } 1677 | }, 1678 | "node_modules/eslint-scope": { 1679 | "version": "5.1.1", 1680 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 1681 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 1682 | "dev": true, 1683 | "dependencies": { 1684 | "esrecurse": "^4.3.0", 1685 | "estraverse": "^4.1.1" 1686 | }, 1687 | "engines": { 1688 | "node": ">=8.0.0" 1689 | } 1690 | }, 1691 | "node_modules/eslint-scope/node_modules/estraverse": { 1692 | "version": "4.3.0", 1693 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1694 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1695 | "dev": true, 1696 | "engines": { 1697 | "node": ">=4.0" 1698 | } 1699 | }, 1700 | "node_modules/eslint-utils": { 1701 | "version": "3.0.0", 1702 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1703 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1704 | "dev": true, 1705 | "dependencies": { 1706 | "eslint-visitor-keys": "^2.0.0" 1707 | }, 1708 | "engines": { 1709 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1710 | }, 1711 | "funding": { 1712 | "url": "https://github.com/sponsors/mysticatea" 1713 | }, 1714 | "peerDependencies": { 1715 | "eslint": ">=5" 1716 | } 1717 | }, 1718 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1719 | "version": "2.1.0", 1720 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1721 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1722 | "dev": true, 1723 | "engines": { 1724 | "node": ">=10" 1725 | } 1726 | }, 1727 | "node_modules/eslint-visitor-keys": { 1728 | "version": "3.3.0", 1729 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 1730 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 1731 | "dev": true, 1732 | "engines": { 1733 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1734 | } 1735 | }, 1736 | "node_modules/eslint/node_modules/argparse": { 1737 | "version": "2.0.1", 1738 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1739 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1740 | "dev": true 1741 | }, 1742 | "node_modules/eslint/node_modules/doctrine": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1745 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1746 | "dev": true, 1747 | "dependencies": { 1748 | "esutils": "^2.0.2" 1749 | }, 1750 | "engines": { 1751 | "node": ">=6.0.0" 1752 | } 1753 | }, 1754 | "node_modules/eslint/node_modules/escape-string-regexp": { 1755 | "version": "4.0.0", 1756 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1757 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1758 | "dev": true, 1759 | "engines": { 1760 | "node": ">=10" 1761 | }, 1762 | "funding": { 1763 | "url": "https://github.com/sponsors/sindresorhus" 1764 | } 1765 | }, 1766 | "node_modules/eslint/node_modules/eslint-scope": { 1767 | "version": "7.1.1", 1768 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1769 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1770 | "dev": true, 1771 | "dependencies": { 1772 | "esrecurse": "^4.3.0", 1773 | "estraverse": "^5.2.0" 1774 | }, 1775 | "engines": { 1776 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1777 | } 1778 | }, 1779 | "node_modules/eslint/node_modules/find-up": { 1780 | "version": "5.0.0", 1781 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1782 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1783 | "dev": true, 1784 | "dependencies": { 1785 | "locate-path": "^6.0.0", 1786 | "path-exists": "^4.0.0" 1787 | }, 1788 | "engines": { 1789 | "node": ">=10" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/sponsors/sindresorhus" 1793 | } 1794 | }, 1795 | "node_modules/eslint/node_modules/globals": { 1796 | "version": "13.20.0", 1797 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 1798 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 1799 | "dev": true, 1800 | "dependencies": { 1801 | "type-fest": "^0.20.2" 1802 | }, 1803 | "engines": { 1804 | "node": ">=8" 1805 | }, 1806 | "funding": { 1807 | "url": "https://github.com/sponsors/sindresorhus" 1808 | } 1809 | }, 1810 | "node_modules/eslint/node_modules/js-yaml": { 1811 | "version": "4.1.0", 1812 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1813 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1814 | "dev": true, 1815 | "dependencies": { 1816 | "argparse": "^2.0.1" 1817 | }, 1818 | "bin": { 1819 | "js-yaml": "bin/js-yaml.js" 1820 | } 1821 | }, 1822 | "node_modules/eslint/node_modules/levn": { 1823 | "version": "0.4.1", 1824 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1825 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1826 | "dev": true, 1827 | "dependencies": { 1828 | "prelude-ls": "^1.2.1", 1829 | "type-check": "~0.4.0" 1830 | }, 1831 | "engines": { 1832 | "node": ">= 0.8.0" 1833 | } 1834 | }, 1835 | "node_modules/eslint/node_modules/locate-path": { 1836 | "version": "6.0.0", 1837 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1838 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1839 | "dev": true, 1840 | "dependencies": { 1841 | "p-locate": "^5.0.0" 1842 | }, 1843 | "engines": { 1844 | "node": ">=10" 1845 | }, 1846 | "funding": { 1847 | "url": "https://github.com/sponsors/sindresorhus" 1848 | } 1849 | }, 1850 | "node_modules/eslint/node_modules/optionator": { 1851 | "version": "0.9.1", 1852 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1853 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1854 | "dev": true, 1855 | "dependencies": { 1856 | "deep-is": "^0.1.3", 1857 | "fast-levenshtein": "^2.0.6", 1858 | "levn": "^0.4.1", 1859 | "prelude-ls": "^1.2.1", 1860 | "type-check": "^0.4.0", 1861 | "word-wrap": "^1.2.3" 1862 | }, 1863 | "engines": { 1864 | "node": ">= 0.8.0" 1865 | } 1866 | }, 1867 | "node_modules/eslint/node_modules/p-limit": { 1868 | "version": "3.1.0", 1869 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1870 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1871 | "dev": true, 1872 | "dependencies": { 1873 | "yocto-queue": "^0.1.0" 1874 | }, 1875 | "engines": { 1876 | "node": ">=10" 1877 | }, 1878 | "funding": { 1879 | "url": "https://github.com/sponsors/sindresorhus" 1880 | } 1881 | }, 1882 | "node_modules/eslint/node_modules/p-locate": { 1883 | "version": "5.0.0", 1884 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1885 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1886 | "dev": true, 1887 | "dependencies": { 1888 | "p-limit": "^3.0.2" 1889 | }, 1890 | "engines": { 1891 | "node": ">=10" 1892 | }, 1893 | "funding": { 1894 | "url": "https://github.com/sponsors/sindresorhus" 1895 | } 1896 | }, 1897 | "node_modules/eslint/node_modules/prelude-ls": { 1898 | "version": "1.2.1", 1899 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1900 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1901 | "dev": true, 1902 | "engines": { 1903 | "node": ">= 0.8.0" 1904 | } 1905 | }, 1906 | "node_modules/eslint/node_modules/type-check": { 1907 | "version": "0.4.0", 1908 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1909 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1910 | "dev": true, 1911 | "dependencies": { 1912 | "prelude-ls": "^1.2.1" 1913 | }, 1914 | "engines": { 1915 | "node": ">= 0.8.0" 1916 | } 1917 | }, 1918 | "node_modules/eslint/node_modules/type-fest": { 1919 | "version": "0.20.2", 1920 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1921 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1922 | "dev": true, 1923 | "engines": { 1924 | "node": ">=10" 1925 | }, 1926 | "funding": { 1927 | "url": "https://github.com/sponsors/sindresorhus" 1928 | } 1929 | }, 1930 | "node_modules/espree": { 1931 | "version": "9.4.1", 1932 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 1933 | "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 1934 | "dev": true, 1935 | "dependencies": { 1936 | "acorn": "^8.8.0", 1937 | "acorn-jsx": "^5.3.2", 1938 | "eslint-visitor-keys": "^3.3.0" 1939 | }, 1940 | "engines": { 1941 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 1942 | }, 1943 | "funding": { 1944 | "url": "https://opencollective.com/eslint" 1945 | } 1946 | }, 1947 | "node_modules/esprima": { 1948 | "version": "4.0.1", 1949 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1950 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1951 | "dev": true, 1952 | "optional": true, 1953 | "peer": true, 1954 | "bin": { 1955 | "esparse": "bin/esparse.js", 1956 | "esvalidate": "bin/esvalidate.js" 1957 | }, 1958 | "engines": { 1959 | "node": ">=4" 1960 | } 1961 | }, 1962 | "node_modules/esquery": { 1963 | "version": "1.5.0", 1964 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 1965 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 1966 | "dev": true, 1967 | "dependencies": { 1968 | "estraverse": "^5.1.0" 1969 | }, 1970 | "engines": { 1971 | "node": ">=0.10" 1972 | } 1973 | }, 1974 | "node_modules/esrecurse": { 1975 | "version": "4.3.0", 1976 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1977 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1978 | "dev": true, 1979 | "dependencies": { 1980 | "estraverse": "^5.2.0" 1981 | }, 1982 | "engines": { 1983 | "node": ">=4.0" 1984 | } 1985 | }, 1986 | "node_modules/estraverse": { 1987 | "version": "5.3.0", 1988 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1989 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1990 | "dev": true, 1991 | "engines": { 1992 | "node": ">=4.0" 1993 | } 1994 | }, 1995 | "node_modules/esutils": { 1996 | "version": "2.0.3", 1997 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1998 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1999 | "dev": true, 2000 | "engines": { 2001 | "node": ">=0.10.0" 2002 | } 2003 | }, 2004 | "node_modules/fast-deep-equal": { 2005 | "version": "3.1.3", 2006 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2007 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2008 | "dev": true 2009 | }, 2010 | "node_modules/fast-glob": { 2011 | "version": "3.2.12", 2012 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 2013 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 2014 | "dev": true, 2015 | "dependencies": { 2016 | "@nodelib/fs.stat": "^2.0.2", 2017 | "@nodelib/fs.walk": "^1.2.3", 2018 | "glob-parent": "^5.1.2", 2019 | "merge2": "^1.3.0", 2020 | "micromatch": "^4.0.4" 2021 | }, 2022 | "engines": { 2023 | "node": ">=8.6.0" 2024 | } 2025 | }, 2026 | "node_modules/fast-glob/node_modules/glob-parent": { 2027 | "version": "5.1.2", 2028 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2029 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2030 | "dev": true, 2031 | "dependencies": { 2032 | "is-glob": "^4.0.1" 2033 | }, 2034 | "engines": { 2035 | "node": ">= 6" 2036 | } 2037 | }, 2038 | "node_modules/fast-json-stable-stringify": { 2039 | "version": "2.1.0", 2040 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2041 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2042 | "dev": true 2043 | }, 2044 | "node_modules/fast-levenshtein": { 2045 | "version": "2.0.6", 2046 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2047 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 2048 | "dev": true 2049 | }, 2050 | "node_modules/fastq": { 2051 | "version": "1.15.0", 2052 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 2053 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 2054 | "dev": true, 2055 | "dependencies": { 2056 | "reusify": "^1.0.4" 2057 | } 2058 | }, 2059 | "node_modules/file-entry-cache": { 2060 | "version": "6.0.1", 2061 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 2062 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 2063 | "dev": true, 2064 | "dependencies": { 2065 | "flat-cache": "^3.0.4" 2066 | }, 2067 | "engines": { 2068 | "node": "^10.12.0 || >=12.0.0" 2069 | } 2070 | }, 2071 | "node_modules/fill-range": { 2072 | "version": "7.0.1", 2073 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2074 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2075 | "dev": true, 2076 | "dependencies": { 2077 | "to-regex-range": "^5.0.1" 2078 | }, 2079 | "engines": { 2080 | "node": ">=8" 2081 | } 2082 | }, 2083 | "node_modules/flat-cache": { 2084 | "version": "3.0.4", 2085 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 2086 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 2087 | "dev": true, 2088 | "dependencies": { 2089 | "flatted": "^3.1.0", 2090 | "rimraf": "^3.0.2" 2091 | }, 2092 | "engines": { 2093 | "node": "^10.12.0 || >=12.0.0" 2094 | } 2095 | }, 2096 | "node_modules/flatted": { 2097 | "version": "3.2.7", 2098 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 2099 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 2100 | "dev": true 2101 | }, 2102 | "node_modules/foreground-child": { 2103 | "version": "2.0.0", 2104 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 2105 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 2106 | "dev": true, 2107 | "dependencies": { 2108 | "cross-spawn": "^7.0.0", 2109 | "signal-exit": "^3.0.2" 2110 | }, 2111 | "engines": { 2112 | "node": ">=8.0.0" 2113 | } 2114 | }, 2115 | "node_modules/form-data": { 2116 | "version": "3.0.1", 2117 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 2118 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 2119 | "dev": true, 2120 | "optional": true, 2121 | "peer": true, 2122 | "dependencies": { 2123 | "asynckit": "^0.4.0", 2124 | "combined-stream": "^1.0.8", 2125 | "mime-types": "^2.1.12" 2126 | }, 2127 | "engines": { 2128 | "node": ">= 6" 2129 | } 2130 | }, 2131 | "node_modules/fs.realpath": { 2132 | "version": "1.0.0", 2133 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2134 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2135 | "dev": true 2136 | }, 2137 | "node_modules/fsevents": { 2138 | "version": "2.3.2", 2139 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2140 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2141 | "dev": true, 2142 | "hasInstallScript": true, 2143 | "optional": true, 2144 | "os": [ 2145 | "darwin" 2146 | ], 2147 | "engines": { 2148 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2149 | } 2150 | }, 2151 | "node_modules/function-bind": { 2152 | "version": "1.1.1", 2153 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2154 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2155 | "dev": true 2156 | }, 2157 | "node_modules/get-caller-file": { 2158 | "version": "2.0.5", 2159 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2160 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 2161 | "dev": true, 2162 | "engines": { 2163 | "node": "6.* || 8.* || >= 10.*" 2164 | } 2165 | }, 2166 | "node_modules/get-func-name": { 2167 | "version": "2.0.0", 2168 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 2169 | "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", 2170 | "dev": true, 2171 | "engines": { 2172 | "node": "*" 2173 | } 2174 | }, 2175 | "node_modules/glob": { 2176 | "version": "7.2.0", 2177 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2178 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2179 | "dev": true, 2180 | "dependencies": { 2181 | "fs.realpath": "^1.0.0", 2182 | "inflight": "^1.0.4", 2183 | "inherits": "2", 2184 | "minimatch": "^3.0.4", 2185 | "once": "^1.3.0", 2186 | "path-is-absolute": "^1.0.0" 2187 | }, 2188 | "engines": { 2189 | "node": "*" 2190 | }, 2191 | "funding": { 2192 | "url": "https://github.com/sponsors/isaacs" 2193 | } 2194 | }, 2195 | "node_modules/glob-parent": { 2196 | "version": "6.0.2", 2197 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 2198 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 2199 | "dev": true, 2200 | "dependencies": { 2201 | "is-glob": "^4.0.3" 2202 | }, 2203 | "engines": { 2204 | "node": ">=10.13.0" 2205 | } 2206 | }, 2207 | "node_modules/globby": { 2208 | "version": "11.1.0", 2209 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 2210 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 2211 | "dev": true, 2212 | "dependencies": { 2213 | "array-union": "^2.1.0", 2214 | "dir-glob": "^3.0.1", 2215 | "fast-glob": "^3.2.9", 2216 | "ignore": "^5.2.0", 2217 | "merge2": "^1.4.1", 2218 | "slash": "^3.0.0" 2219 | }, 2220 | "engines": { 2221 | "node": ">=10" 2222 | }, 2223 | "funding": { 2224 | "url": "https://github.com/sponsors/sindresorhus" 2225 | } 2226 | }, 2227 | "node_modules/grapheme-splitter": { 2228 | "version": "1.0.4", 2229 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 2230 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 2231 | "dev": true 2232 | }, 2233 | "node_modules/has": { 2234 | "version": "1.0.3", 2235 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2236 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2237 | "dev": true, 2238 | "dependencies": { 2239 | "function-bind": "^1.1.1" 2240 | }, 2241 | "engines": { 2242 | "node": ">= 0.4.0" 2243 | } 2244 | }, 2245 | "node_modules/has-flag": { 2246 | "version": "4.0.0", 2247 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2248 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2249 | "dev": true, 2250 | "engines": { 2251 | "node": ">=8" 2252 | } 2253 | }, 2254 | "node_modules/html-encoding-sniffer": { 2255 | "version": "2.0.1", 2256 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", 2257 | "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", 2258 | "dev": true, 2259 | "optional": true, 2260 | "peer": true, 2261 | "dependencies": { 2262 | "whatwg-encoding": "^1.0.5" 2263 | }, 2264 | "engines": { 2265 | "node": ">=10" 2266 | } 2267 | }, 2268 | "node_modules/html-escaper": { 2269 | "version": "2.0.2", 2270 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 2271 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 2272 | "dev": true 2273 | }, 2274 | "node_modules/http-proxy-agent": { 2275 | "version": "4.0.1", 2276 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 2277 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 2278 | "dev": true, 2279 | "optional": true, 2280 | "peer": true, 2281 | "dependencies": { 2282 | "@tootallnate/once": "1", 2283 | "agent-base": "6", 2284 | "debug": "4" 2285 | }, 2286 | "engines": { 2287 | "node": ">= 6" 2288 | } 2289 | }, 2290 | "node_modules/https-proxy-agent": { 2291 | "version": "5.0.0", 2292 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 2293 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 2294 | "dev": true, 2295 | "optional": true, 2296 | "peer": true, 2297 | "dependencies": { 2298 | "agent-base": "6", 2299 | "debug": "4" 2300 | }, 2301 | "engines": { 2302 | "node": ">= 6" 2303 | } 2304 | }, 2305 | "node_modules/iconv-lite": { 2306 | "version": "0.4.24", 2307 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2308 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2309 | "dev": true, 2310 | "optional": true, 2311 | "peer": true, 2312 | "dependencies": { 2313 | "safer-buffer": ">= 2.1.2 < 3" 2314 | }, 2315 | "engines": { 2316 | "node": ">=0.10.0" 2317 | } 2318 | }, 2319 | "node_modules/ignore": { 2320 | "version": "5.2.4", 2321 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 2322 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 2323 | "dev": true, 2324 | "engines": { 2325 | "node": ">= 4" 2326 | } 2327 | }, 2328 | "node_modules/import-fresh": { 2329 | "version": "3.3.0", 2330 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2331 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2332 | "dev": true, 2333 | "dependencies": { 2334 | "parent-module": "^1.0.0", 2335 | "resolve-from": "^4.0.0" 2336 | }, 2337 | "engines": { 2338 | "node": ">=6" 2339 | }, 2340 | "funding": { 2341 | "url": "https://github.com/sponsors/sindresorhus" 2342 | } 2343 | }, 2344 | "node_modules/import-fresh/node_modules/resolve-from": { 2345 | "version": "4.0.0", 2346 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2347 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2348 | "dev": true, 2349 | "engines": { 2350 | "node": ">=4" 2351 | } 2352 | }, 2353 | "node_modules/imurmurhash": { 2354 | "version": "0.1.4", 2355 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2356 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2357 | "dev": true, 2358 | "engines": { 2359 | "node": ">=0.8.19" 2360 | } 2361 | }, 2362 | "node_modules/inflight": { 2363 | "version": "1.0.6", 2364 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2365 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2366 | "dev": true, 2367 | "dependencies": { 2368 | "once": "^1.3.0", 2369 | "wrappy": "1" 2370 | } 2371 | }, 2372 | "node_modules/inherits": { 2373 | "version": "2.0.4", 2374 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2375 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2376 | "dev": true 2377 | }, 2378 | "node_modules/is-core-module": { 2379 | "version": "2.11.0", 2380 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", 2381 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", 2382 | "dev": true, 2383 | "dependencies": { 2384 | "has": "^1.0.3" 2385 | }, 2386 | "funding": { 2387 | "url": "https://github.com/sponsors/ljharb" 2388 | } 2389 | }, 2390 | "node_modules/is-extglob": { 2391 | "version": "2.1.1", 2392 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2393 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2394 | "dev": true, 2395 | "engines": { 2396 | "node": ">=0.10.0" 2397 | } 2398 | }, 2399 | "node_modules/is-fullwidth-code-point": { 2400 | "version": "3.0.0", 2401 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2402 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2403 | "dev": true, 2404 | "engines": { 2405 | "node": ">=8" 2406 | } 2407 | }, 2408 | "node_modules/is-glob": { 2409 | "version": "4.0.3", 2410 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2411 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2412 | "dev": true, 2413 | "dependencies": { 2414 | "is-extglob": "^2.1.1" 2415 | }, 2416 | "engines": { 2417 | "node": ">=0.10.0" 2418 | } 2419 | }, 2420 | "node_modules/is-number": { 2421 | "version": "7.0.0", 2422 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2423 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2424 | "dev": true, 2425 | "engines": { 2426 | "node": ">=0.12.0" 2427 | } 2428 | }, 2429 | "node_modules/is-path-inside": { 2430 | "version": "3.0.3", 2431 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 2432 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 2433 | "dev": true, 2434 | "engines": { 2435 | "node": ">=8" 2436 | } 2437 | }, 2438 | "node_modules/is-potential-custom-element-name": { 2439 | "version": "1.0.1", 2440 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 2441 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 2442 | "dev": true, 2443 | "optional": true, 2444 | "peer": true 2445 | }, 2446 | "node_modules/isexe": { 2447 | "version": "2.0.0", 2448 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2449 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2450 | "dev": true 2451 | }, 2452 | "node_modules/istanbul-lib-coverage": { 2453 | "version": "3.2.0", 2454 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 2455 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 2456 | "dev": true, 2457 | "engines": { 2458 | "node": ">=8" 2459 | } 2460 | }, 2461 | "node_modules/istanbul-lib-report": { 2462 | "version": "3.0.0", 2463 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 2464 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 2465 | "dev": true, 2466 | "dependencies": { 2467 | "istanbul-lib-coverage": "^3.0.0", 2468 | "make-dir": "^3.0.0", 2469 | "supports-color": "^7.1.0" 2470 | }, 2471 | "engines": { 2472 | "node": ">=8" 2473 | } 2474 | }, 2475 | "node_modules/istanbul-reports": { 2476 | "version": "3.1.5", 2477 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 2478 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 2479 | "dev": true, 2480 | "dependencies": { 2481 | "html-escaper": "^2.0.0", 2482 | "istanbul-lib-report": "^3.0.0" 2483 | }, 2484 | "engines": { 2485 | "node": ">=8" 2486 | } 2487 | }, 2488 | "node_modules/js-sdsl": { 2489 | "version": "4.3.0", 2490 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", 2491 | "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", 2492 | "dev": true, 2493 | "funding": { 2494 | "type": "opencollective", 2495 | "url": "https://opencollective.com/js-sdsl" 2496 | } 2497 | }, 2498 | "node_modules/jsdom": { 2499 | "version": "16.7.0", 2500 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", 2501 | "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", 2502 | "dev": true, 2503 | "optional": true, 2504 | "peer": true, 2505 | "dependencies": { 2506 | "abab": "^2.0.5", 2507 | "acorn": "^8.2.4", 2508 | "acorn-globals": "^6.0.0", 2509 | "cssom": "^0.4.4", 2510 | "cssstyle": "^2.3.0", 2511 | "data-urls": "^2.0.0", 2512 | "decimal.js": "^10.2.1", 2513 | "domexception": "^2.0.1", 2514 | "escodegen": "^2.0.0", 2515 | "form-data": "^3.0.0", 2516 | "html-encoding-sniffer": "^2.0.1", 2517 | "http-proxy-agent": "^4.0.1", 2518 | "https-proxy-agent": "^5.0.0", 2519 | "is-potential-custom-element-name": "^1.0.1", 2520 | "nwsapi": "^2.2.0", 2521 | "parse5": "6.0.1", 2522 | "saxes": "^5.0.1", 2523 | "symbol-tree": "^3.2.4", 2524 | "tough-cookie": "^4.0.0", 2525 | "w3c-hr-time": "^1.0.2", 2526 | "w3c-xmlserializer": "^2.0.0", 2527 | "webidl-conversions": "^6.1.0", 2528 | "whatwg-encoding": "^1.0.5", 2529 | "whatwg-mimetype": "^2.3.0", 2530 | "whatwg-url": "^8.5.0", 2531 | "ws": "^7.4.6", 2532 | "xml-name-validator": "^3.0.0" 2533 | }, 2534 | "engines": { 2535 | "node": ">=10" 2536 | }, 2537 | "peerDependencies": { 2538 | "canvas": "^2.5.0" 2539 | }, 2540 | "peerDependenciesMeta": { 2541 | "canvas": { 2542 | "optional": true 2543 | } 2544 | } 2545 | }, 2546 | "node_modules/json-schema-traverse": { 2547 | "version": "0.4.1", 2548 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2549 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2550 | "dev": true 2551 | }, 2552 | "node_modules/json-stable-stringify-without-jsonify": { 2553 | "version": "1.0.1", 2554 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2555 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2556 | "dev": true 2557 | }, 2558 | "node_modules/jsonc-parser": { 2559 | "version": "3.2.0", 2560 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 2561 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 2562 | "dev": true 2563 | }, 2564 | "node_modules/levn": { 2565 | "version": "0.3.0", 2566 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 2567 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 2568 | "dev": true, 2569 | "optional": true, 2570 | "peer": true, 2571 | "dependencies": { 2572 | "prelude-ls": "~1.1.2", 2573 | "type-check": "~0.3.2" 2574 | }, 2575 | "engines": { 2576 | "node": ">= 0.8.0" 2577 | } 2578 | }, 2579 | "node_modules/local-pkg": { 2580 | "version": "0.4.3", 2581 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", 2582 | "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", 2583 | "dev": true, 2584 | "engines": { 2585 | "node": ">=14" 2586 | }, 2587 | "funding": { 2588 | "url": "https://github.com/sponsors/antfu" 2589 | } 2590 | }, 2591 | "node_modules/lodash": { 2592 | "version": "4.17.21", 2593 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2594 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2595 | "dev": true, 2596 | "optional": true, 2597 | "peer": true 2598 | }, 2599 | "node_modules/lodash.merge": { 2600 | "version": "4.6.2", 2601 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2602 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2603 | "dev": true 2604 | }, 2605 | "node_modules/loupe": { 2606 | "version": "2.3.6", 2607 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", 2608 | "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", 2609 | "dev": true, 2610 | "dependencies": { 2611 | "get-func-name": "^2.0.0" 2612 | } 2613 | }, 2614 | "node_modules/lru-cache": { 2615 | "version": "6.0.0", 2616 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2617 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2618 | "dev": true, 2619 | "dependencies": { 2620 | "yallist": "^4.0.0" 2621 | }, 2622 | "engines": { 2623 | "node": ">=10" 2624 | } 2625 | }, 2626 | "node_modules/make-dir": { 2627 | "version": "3.1.0", 2628 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2629 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2630 | "dev": true, 2631 | "dependencies": { 2632 | "semver": "^6.0.0" 2633 | }, 2634 | "engines": { 2635 | "node": ">=8" 2636 | }, 2637 | "funding": { 2638 | "url": "https://github.com/sponsors/sindresorhus" 2639 | } 2640 | }, 2641 | "node_modules/merge2": { 2642 | "version": "1.4.1", 2643 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2644 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2645 | "dev": true, 2646 | "engines": { 2647 | "node": ">= 8" 2648 | } 2649 | }, 2650 | "node_modules/micromatch": { 2651 | "version": "4.0.4", 2652 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 2653 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 2654 | "dev": true, 2655 | "dependencies": { 2656 | "braces": "^3.0.1", 2657 | "picomatch": "^2.2.3" 2658 | }, 2659 | "engines": { 2660 | "node": ">=8.6" 2661 | } 2662 | }, 2663 | "node_modules/mime-db": { 2664 | "version": "1.51.0", 2665 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 2666 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 2667 | "dev": true, 2668 | "optional": true, 2669 | "peer": true, 2670 | "engines": { 2671 | "node": ">= 0.6" 2672 | } 2673 | }, 2674 | "node_modules/mime-types": { 2675 | "version": "2.1.34", 2676 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 2677 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 2678 | "dev": true, 2679 | "optional": true, 2680 | "peer": true, 2681 | "dependencies": { 2682 | "mime-db": "1.51.0" 2683 | }, 2684 | "engines": { 2685 | "node": ">= 0.6" 2686 | } 2687 | }, 2688 | "node_modules/minimatch": { 2689 | "version": "3.1.2", 2690 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2691 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2692 | "dev": true, 2693 | "dependencies": { 2694 | "brace-expansion": "^1.1.7" 2695 | }, 2696 | "engines": { 2697 | "node": "*" 2698 | } 2699 | }, 2700 | "node_modules/mlly": { 2701 | "version": "1.1.1", 2702 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", 2703 | "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", 2704 | "dev": true, 2705 | "dependencies": { 2706 | "acorn": "^8.8.2", 2707 | "pathe": "^1.1.0", 2708 | "pkg-types": "^1.0.1", 2709 | "ufo": "^1.1.0" 2710 | } 2711 | }, 2712 | "node_modules/mlly/node_modules/pathe": { 2713 | "version": "1.1.0", 2714 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", 2715 | "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", 2716 | "dev": true 2717 | }, 2718 | "node_modules/ms": { 2719 | "version": "2.1.2", 2720 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2721 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2722 | "dev": true 2723 | }, 2724 | "node_modules/nanoid": { 2725 | "version": "3.3.7", 2726 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2727 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2728 | "dev": true, 2729 | "funding": [ 2730 | { 2731 | "type": "github", 2732 | "url": "https://github.com/sponsors/ai" 2733 | } 2734 | ], 2735 | "bin": { 2736 | "nanoid": "bin/nanoid.cjs" 2737 | }, 2738 | "engines": { 2739 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2740 | } 2741 | }, 2742 | "node_modules/natural-compare": { 2743 | "version": "1.4.0", 2744 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2745 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2746 | "dev": true 2747 | }, 2748 | "node_modules/natural-compare-lite": { 2749 | "version": "1.4.0", 2750 | "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", 2751 | "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", 2752 | "dev": true 2753 | }, 2754 | "node_modules/nwsapi": { 2755 | "version": "2.2.0", 2756 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", 2757 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", 2758 | "dev": true, 2759 | "optional": true, 2760 | "peer": true 2761 | }, 2762 | "node_modules/once": { 2763 | "version": "1.4.0", 2764 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2765 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2766 | "dev": true, 2767 | "dependencies": { 2768 | "wrappy": "1" 2769 | } 2770 | }, 2771 | "node_modules/optionator": { 2772 | "version": "0.8.3", 2773 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2774 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2775 | "dev": true, 2776 | "optional": true, 2777 | "peer": true, 2778 | "dependencies": { 2779 | "deep-is": "~0.1.3", 2780 | "fast-levenshtein": "~2.0.6", 2781 | "levn": "~0.3.0", 2782 | "prelude-ls": "~1.1.2", 2783 | "type-check": "~0.3.2", 2784 | "word-wrap": "~1.2.3" 2785 | }, 2786 | "engines": { 2787 | "node": ">= 0.8.0" 2788 | } 2789 | }, 2790 | "node_modules/parent-module": { 2791 | "version": "1.0.1", 2792 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2793 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2794 | "dev": true, 2795 | "dependencies": { 2796 | "callsites": "^3.0.0" 2797 | }, 2798 | "engines": { 2799 | "node": ">=6" 2800 | } 2801 | }, 2802 | "node_modules/parse5": { 2803 | "version": "6.0.1", 2804 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 2805 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", 2806 | "dev": true, 2807 | "optional": true, 2808 | "peer": true 2809 | }, 2810 | "node_modules/path-exists": { 2811 | "version": "4.0.0", 2812 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2813 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2814 | "dev": true, 2815 | "engines": { 2816 | "node": ">=8" 2817 | } 2818 | }, 2819 | "node_modules/path-is-absolute": { 2820 | "version": "1.0.1", 2821 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2822 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2823 | "dev": true, 2824 | "engines": { 2825 | "node": ">=0.10.0" 2826 | } 2827 | }, 2828 | "node_modules/path-key": { 2829 | "version": "3.1.1", 2830 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2831 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2832 | "dev": true, 2833 | "engines": { 2834 | "node": ">=8" 2835 | } 2836 | }, 2837 | "node_modules/path-parse": { 2838 | "version": "1.0.7", 2839 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2840 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2841 | "dev": true 2842 | }, 2843 | "node_modules/path-type": { 2844 | "version": "4.0.0", 2845 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2846 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2847 | "dev": true, 2848 | "engines": { 2849 | "node": ">=8" 2850 | } 2851 | }, 2852 | "node_modules/pathe": { 2853 | "version": "0.2.0", 2854 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", 2855 | "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", 2856 | "dev": true 2857 | }, 2858 | "node_modules/pathval": { 2859 | "version": "1.1.1", 2860 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 2861 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 2862 | "dev": true, 2863 | "engines": { 2864 | "node": "*" 2865 | } 2866 | }, 2867 | "node_modules/picocolors": { 2868 | "version": "1.0.0", 2869 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2870 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2871 | "dev": true 2872 | }, 2873 | "node_modules/picomatch": { 2874 | "version": "2.3.1", 2875 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2876 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2877 | "dev": true, 2878 | "engines": { 2879 | "node": ">=8.6" 2880 | }, 2881 | "funding": { 2882 | "url": "https://github.com/sponsors/jonschlinkert" 2883 | } 2884 | }, 2885 | "node_modules/pkg-types": { 2886 | "version": "1.0.2", 2887 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", 2888 | "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", 2889 | "dev": true, 2890 | "dependencies": { 2891 | "jsonc-parser": "^3.2.0", 2892 | "mlly": "^1.1.1", 2893 | "pathe": "^1.1.0" 2894 | } 2895 | }, 2896 | "node_modules/pkg-types/node_modules/pathe": { 2897 | "version": "1.1.0", 2898 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", 2899 | "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", 2900 | "dev": true 2901 | }, 2902 | "node_modules/postcss": { 2903 | "version": "8.4.32", 2904 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", 2905 | "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", 2906 | "dev": true, 2907 | "funding": [ 2908 | { 2909 | "type": "opencollective", 2910 | "url": "https://opencollective.com/postcss/" 2911 | }, 2912 | { 2913 | "type": "tidelift", 2914 | "url": "https://tidelift.com/funding/github/npm/postcss" 2915 | }, 2916 | { 2917 | "type": "github", 2918 | "url": "https://github.com/sponsors/ai" 2919 | } 2920 | ], 2921 | "dependencies": { 2922 | "nanoid": "^3.3.7", 2923 | "picocolors": "^1.0.0", 2924 | "source-map-js": "^1.0.2" 2925 | }, 2926 | "engines": { 2927 | "node": "^10 || ^12 || >=14" 2928 | } 2929 | }, 2930 | "node_modules/prelude-ls": { 2931 | "version": "1.1.2", 2932 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2933 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2934 | "dev": true, 2935 | "optional": true, 2936 | "peer": true, 2937 | "engines": { 2938 | "node": ">= 0.8.0" 2939 | } 2940 | }, 2941 | "node_modules/prettier": { 2942 | "version": "2.8.4", 2943 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", 2944 | "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", 2945 | "dev": true, 2946 | "bin": { 2947 | "prettier": "bin-prettier.js" 2948 | }, 2949 | "engines": { 2950 | "node": ">=10.13.0" 2951 | }, 2952 | "funding": { 2953 | "url": "https://github.com/prettier/prettier?sponsor=1" 2954 | } 2955 | }, 2956 | "node_modules/psl": { 2957 | "version": "1.8.0", 2958 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 2959 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 2960 | "dev": true, 2961 | "optional": true, 2962 | "peer": true 2963 | }, 2964 | "node_modules/punycode": { 2965 | "version": "2.1.1", 2966 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2967 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2968 | "dev": true, 2969 | "engines": { 2970 | "node": ">=6" 2971 | } 2972 | }, 2973 | "node_modules/querystringify": { 2974 | "version": "2.2.0", 2975 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", 2976 | "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", 2977 | "dev": true, 2978 | "optional": true, 2979 | "peer": true 2980 | }, 2981 | "node_modules/queue-microtask": { 2982 | "version": "1.2.3", 2983 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2984 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2985 | "dev": true, 2986 | "funding": [ 2987 | { 2988 | "type": "github", 2989 | "url": "https://github.com/sponsors/feross" 2990 | }, 2991 | { 2992 | "type": "patreon", 2993 | "url": "https://www.patreon.com/feross" 2994 | }, 2995 | { 2996 | "type": "consulting", 2997 | "url": "https://feross.org/support" 2998 | } 2999 | ] 3000 | }, 3001 | "node_modules/regexpp": { 3002 | "version": "3.2.0", 3003 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 3004 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 3005 | "dev": true, 3006 | "engines": { 3007 | "node": ">=8" 3008 | }, 3009 | "funding": { 3010 | "url": "https://github.com/sponsors/mysticatea" 3011 | } 3012 | }, 3013 | "node_modules/require-directory": { 3014 | "version": "2.1.1", 3015 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3016 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 3017 | "dev": true, 3018 | "engines": { 3019 | "node": ">=0.10.0" 3020 | } 3021 | }, 3022 | "node_modules/requires-port": { 3023 | "version": "1.0.0", 3024 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 3025 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 3026 | "dev": true, 3027 | "optional": true, 3028 | "peer": true 3029 | }, 3030 | "node_modules/resolve": { 3031 | "version": "1.22.1", 3032 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3033 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3034 | "dev": true, 3035 | "dependencies": { 3036 | "is-core-module": "^2.9.0", 3037 | "path-parse": "^1.0.7", 3038 | "supports-preserve-symlinks-flag": "^1.0.0" 3039 | }, 3040 | "bin": { 3041 | "resolve": "bin/resolve" 3042 | }, 3043 | "funding": { 3044 | "url": "https://github.com/sponsors/ljharb" 3045 | } 3046 | }, 3047 | "node_modules/reusify": { 3048 | "version": "1.0.4", 3049 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3050 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3051 | "dev": true, 3052 | "engines": { 3053 | "iojs": ">=1.0.0", 3054 | "node": ">=0.10.0" 3055 | } 3056 | }, 3057 | "node_modules/rimraf": { 3058 | "version": "3.0.2", 3059 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3060 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3061 | "dev": true, 3062 | "dependencies": { 3063 | "glob": "^7.1.3" 3064 | }, 3065 | "bin": { 3066 | "rimraf": "bin.js" 3067 | }, 3068 | "funding": { 3069 | "url": "https://github.com/sponsors/isaacs" 3070 | } 3071 | }, 3072 | "node_modules/rollup": { 3073 | "version": "3.23.1", 3074 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.1.tgz", 3075 | "integrity": "sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==", 3076 | "dev": true, 3077 | "bin": { 3078 | "rollup": "dist/bin/rollup" 3079 | }, 3080 | "engines": { 3081 | "node": ">=14.18.0", 3082 | "npm": ">=8.0.0" 3083 | }, 3084 | "optionalDependencies": { 3085 | "fsevents": "~2.3.2" 3086 | } 3087 | }, 3088 | "node_modules/run-parallel": { 3089 | "version": "1.2.0", 3090 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3091 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3092 | "dev": true, 3093 | "funding": [ 3094 | { 3095 | "type": "github", 3096 | "url": "https://github.com/sponsors/feross" 3097 | }, 3098 | { 3099 | "type": "patreon", 3100 | "url": "https://www.patreon.com/feross" 3101 | }, 3102 | { 3103 | "type": "consulting", 3104 | "url": "https://feross.org/support" 3105 | } 3106 | ], 3107 | "dependencies": { 3108 | "queue-microtask": "^1.2.2" 3109 | } 3110 | }, 3111 | "node_modules/safe-buffer": { 3112 | "version": "5.1.2", 3113 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3114 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 3115 | "dev": true 3116 | }, 3117 | "node_modules/safer-buffer": { 3118 | "version": "2.1.2", 3119 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3120 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3121 | "dev": true, 3122 | "optional": true, 3123 | "peer": true 3124 | }, 3125 | "node_modules/saxes": { 3126 | "version": "5.0.1", 3127 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 3128 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 3129 | "dev": true, 3130 | "optional": true, 3131 | "peer": true, 3132 | "dependencies": { 3133 | "xmlchars": "^2.2.0" 3134 | }, 3135 | "engines": { 3136 | "node": ">=10" 3137 | } 3138 | }, 3139 | "node_modules/semver": { 3140 | "version": "6.3.0", 3141 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3142 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3143 | "dev": true, 3144 | "bin": { 3145 | "semver": "bin/semver.js" 3146 | } 3147 | }, 3148 | "node_modules/shebang-command": { 3149 | "version": "2.0.0", 3150 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3151 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3152 | "dev": true, 3153 | "dependencies": { 3154 | "shebang-regex": "^3.0.0" 3155 | }, 3156 | "engines": { 3157 | "node": ">=8" 3158 | } 3159 | }, 3160 | "node_modules/shebang-regex": { 3161 | "version": "3.0.0", 3162 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3163 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3164 | "dev": true, 3165 | "engines": { 3166 | "node": ">=8" 3167 | } 3168 | }, 3169 | "node_modules/signal-exit": { 3170 | "version": "3.0.6", 3171 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", 3172 | "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", 3173 | "dev": true 3174 | }, 3175 | "node_modules/slash": { 3176 | "version": "3.0.0", 3177 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3178 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3179 | "dev": true, 3180 | "engines": { 3181 | "node": ">=8" 3182 | } 3183 | }, 3184 | "node_modules/source-map": { 3185 | "version": "0.6.1", 3186 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3187 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3188 | "dev": true, 3189 | "engines": { 3190 | "node": ">=0.10.0" 3191 | } 3192 | }, 3193 | "node_modules/source-map-js": { 3194 | "version": "1.0.2", 3195 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 3196 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 3197 | "dev": true, 3198 | "engines": { 3199 | "node": ">=0.10.0" 3200 | } 3201 | }, 3202 | "node_modules/source-map-support": { 3203 | "version": "0.5.21", 3204 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 3205 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 3206 | "dev": true, 3207 | "dependencies": { 3208 | "buffer-from": "^1.0.0", 3209 | "source-map": "^0.6.0" 3210 | } 3211 | }, 3212 | "node_modules/string-width": { 3213 | "version": "4.2.3", 3214 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3215 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3216 | "dev": true, 3217 | "dependencies": { 3218 | "emoji-regex": "^8.0.0", 3219 | "is-fullwidth-code-point": "^3.0.0", 3220 | "strip-ansi": "^6.0.1" 3221 | }, 3222 | "engines": { 3223 | "node": ">=8" 3224 | } 3225 | }, 3226 | "node_modules/strip-ansi": { 3227 | "version": "6.0.1", 3228 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3229 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3230 | "dev": true, 3231 | "dependencies": { 3232 | "ansi-regex": "^5.0.1" 3233 | }, 3234 | "engines": { 3235 | "node": ">=8" 3236 | } 3237 | }, 3238 | "node_modules/strip-json-comments": { 3239 | "version": "3.1.1", 3240 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3241 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3242 | "dev": true, 3243 | "engines": { 3244 | "node": ">=8" 3245 | }, 3246 | "funding": { 3247 | "url": "https://github.com/sponsors/sindresorhus" 3248 | } 3249 | }, 3250 | "node_modules/strip-literal": { 3251 | "version": "1.0.1", 3252 | "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", 3253 | "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", 3254 | "dev": true, 3255 | "dependencies": { 3256 | "acorn": "^8.8.2" 3257 | }, 3258 | "funding": { 3259 | "url": "https://github.com/sponsors/antfu" 3260 | } 3261 | }, 3262 | "node_modules/supports-color": { 3263 | "version": "7.2.0", 3264 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3265 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3266 | "dev": true, 3267 | "dependencies": { 3268 | "has-flag": "^4.0.0" 3269 | }, 3270 | "engines": { 3271 | "node": ">=8" 3272 | } 3273 | }, 3274 | "node_modules/supports-preserve-symlinks-flag": { 3275 | "version": "1.0.0", 3276 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3277 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3278 | "dev": true, 3279 | "engines": { 3280 | "node": ">= 0.4" 3281 | }, 3282 | "funding": { 3283 | "url": "https://github.com/sponsors/ljharb" 3284 | } 3285 | }, 3286 | "node_modules/symbol-tree": { 3287 | "version": "3.2.4", 3288 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 3289 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 3290 | "dev": true, 3291 | "optional": true, 3292 | "peer": true 3293 | }, 3294 | "node_modules/test-exclude": { 3295 | "version": "6.0.0", 3296 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 3297 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 3298 | "dev": true, 3299 | "dependencies": { 3300 | "@istanbuljs/schema": "^0.1.2", 3301 | "glob": "^7.1.4", 3302 | "minimatch": "^3.0.4" 3303 | }, 3304 | "engines": { 3305 | "node": ">=8" 3306 | } 3307 | }, 3308 | "node_modules/text-table": { 3309 | "version": "0.2.0", 3310 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3311 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 3312 | "dev": true 3313 | }, 3314 | "node_modules/tinybench": { 3315 | "version": "2.3.1", 3316 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", 3317 | "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", 3318 | "dev": true 3319 | }, 3320 | "node_modules/tinypool": { 3321 | "version": "0.3.1", 3322 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", 3323 | "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", 3324 | "dev": true, 3325 | "engines": { 3326 | "node": ">=14.0.0" 3327 | } 3328 | }, 3329 | "node_modules/tinyspy": { 3330 | "version": "1.1.1", 3331 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", 3332 | "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", 3333 | "dev": true, 3334 | "engines": { 3335 | "node": ">=14.0.0" 3336 | } 3337 | }, 3338 | "node_modules/to-regex-range": { 3339 | "version": "5.0.1", 3340 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3341 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3342 | "dev": true, 3343 | "dependencies": { 3344 | "is-number": "^7.0.0" 3345 | }, 3346 | "engines": { 3347 | "node": ">=8.0" 3348 | } 3349 | }, 3350 | "node_modules/tough-cookie": { 3351 | "version": "4.1.3", 3352 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", 3353 | "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", 3354 | "dev": true, 3355 | "optional": true, 3356 | "peer": true, 3357 | "dependencies": { 3358 | "psl": "^1.1.33", 3359 | "punycode": "^2.1.1", 3360 | "universalify": "^0.2.0", 3361 | "url-parse": "^1.5.3" 3362 | }, 3363 | "engines": { 3364 | "node": ">=6" 3365 | } 3366 | }, 3367 | "node_modules/tr46": { 3368 | "version": "2.1.0", 3369 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", 3370 | "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", 3371 | "dev": true, 3372 | "optional": true, 3373 | "peer": true, 3374 | "dependencies": { 3375 | "punycode": "^2.1.1" 3376 | }, 3377 | "engines": { 3378 | "node": ">=8" 3379 | } 3380 | }, 3381 | "node_modules/tslib": { 3382 | "version": "2.3.1", 3383 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 3384 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", 3385 | "dev": true, 3386 | "optional": true, 3387 | "peer": true 3388 | }, 3389 | "node_modules/type-check": { 3390 | "version": "0.3.2", 3391 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3392 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3393 | "dev": true, 3394 | "optional": true, 3395 | "peer": true, 3396 | "dependencies": { 3397 | "prelude-ls": "~1.1.2" 3398 | }, 3399 | "engines": { 3400 | "node": ">= 0.8.0" 3401 | } 3402 | }, 3403 | "node_modules/type-detect": { 3404 | "version": "4.0.8", 3405 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 3406 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 3407 | "dev": true, 3408 | "engines": { 3409 | "node": ">=4" 3410 | } 3411 | }, 3412 | "node_modules/typescript": { 3413 | "version": "4.9.5", 3414 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 3415 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 3416 | "dev": true, 3417 | "bin": { 3418 | "tsc": "bin/tsc", 3419 | "tsserver": "bin/tsserver" 3420 | }, 3421 | "engines": { 3422 | "node": ">=4.2.0" 3423 | } 3424 | }, 3425 | "node_modules/ufo": { 3426 | "version": "1.1.1", 3427 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", 3428 | "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", 3429 | "dev": true 3430 | }, 3431 | "node_modules/universalify": { 3432 | "version": "0.2.0", 3433 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", 3434 | "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", 3435 | "dev": true, 3436 | "optional": true, 3437 | "peer": true, 3438 | "engines": { 3439 | "node": ">= 4.0.0" 3440 | } 3441 | }, 3442 | "node_modules/uri-js": { 3443 | "version": "4.4.1", 3444 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 3445 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 3446 | "dev": true, 3447 | "dependencies": { 3448 | "punycode": "^2.1.0" 3449 | } 3450 | }, 3451 | "node_modules/url-parse": { 3452 | "version": "1.5.10", 3453 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", 3454 | "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", 3455 | "dev": true, 3456 | "optional": true, 3457 | "peer": true, 3458 | "dependencies": { 3459 | "querystringify": "^2.1.1", 3460 | "requires-port": "^1.0.0" 3461 | } 3462 | }, 3463 | "node_modules/vite": { 3464 | "version": "4.3.9", 3465 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", 3466 | "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", 3467 | "dev": true, 3468 | "dependencies": { 3469 | "esbuild": "^0.17.5", 3470 | "postcss": "^8.4.23", 3471 | "rollup": "^3.21.0" 3472 | }, 3473 | "bin": { 3474 | "vite": "bin/vite.js" 3475 | }, 3476 | "engines": { 3477 | "node": "^14.18.0 || >=16.0.0" 3478 | }, 3479 | "optionalDependencies": { 3480 | "fsevents": "~2.3.2" 3481 | }, 3482 | "peerDependencies": { 3483 | "@types/node": ">= 14", 3484 | "less": "*", 3485 | "sass": "*", 3486 | "stylus": "*", 3487 | "sugarss": "*", 3488 | "terser": "^5.4.0" 3489 | }, 3490 | "peerDependenciesMeta": { 3491 | "@types/node": { 3492 | "optional": true 3493 | }, 3494 | "less": { 3495 | "optional": true 3496 | }, 3497 | "sass": { 3498 | "optional": true 3499 | }, 3500 | "stylus": { 3501 | "optional": true 3502 | }, 3503 | "sugarss": { 3504 | "optional": true 3505 | }, 3506 | "terser": { 3507 | "optional": true 3508 | } 3509 | } 3510 | }, 3511 | "node_modules/vite-node": { 3512 | "version": "0.26.3", 3513 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.26.3.tgz", 3514 | "integrity": "sha512-Te2bq0Bfvq6XiO718I+1EinMjpNYKws6SNHKOmVbILAQimKoZKDd+IZLlkaYcBXPpK3HFe2U80k8Zw+m3w/a2w==", 3515 | "dev": true, 3516 | "dependencies": { 3517 | "debug": "^4.3.4", 3518 | "mlly": "^1.0.0", 3519 | "pathe": "^0.2.0", 3520 | "source-map": "^0.6.1", 3521 | "source-map-support": "^0.5.21", 3522 | "vite": "^3.0.0 || ^4.0.0" 3523 | }, 3524 | "bin": { 3525 | "vite-node": "vite-node.mjs" 3526 | }, 3527 | "engines": { 3528 | "node": ">=v14.16.0" 3529 | }, 3530 | "funding": { 3531 | "url": "https://github.com/sponsors/antfu" 3532 | } 3533 | }, 3534 | "node_modules/vitest": { 3535 | "version": "0.26.3", 3536 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.26.3.tgz", 3537 | "integrity": "sha512-FmHxU9aUCxTi23keF3vxb/Qp0lYXaaJ+jRLGOUmMS3qVTOJvgGE+f1VArupA6pEhaG2Ans4X+zV9dqM5WISMbg==", 3538 | "dev": true, 3539 | "dependencies": { 3540 | "@types/chai": "^4.3.4", 3541 | "@types/chai-subset": "^1.3.3", 3542 | "@types/node": "*", 3543 | "acorn": "^8.8.1", 3544 | "acorn-walk": "^8.2.0", 3545 | "chai": "^4.3.7", 3546 | "debug": "^4.3.4", 3547 | "local-pkg": "^0.4.2", 3548 | "source-map": "^0.6.1", 3549 | "strip-literal": "^1.0.0", 3550 | "tinybench": "^2.3.1", 3551 | "tinypool": "^0.3.0", 3552 | "tinyspy": "^1.0.2", 3553 | "vite": "^3.0.0 || ^4.0.0", 3554 | "vite-node": "0.26.3" 3555 | }, 3556 | "bin": { 3557 | "vitest": "vitest.mjs" 3558 | }, 3559 | "engines": { 3560 | "node": ">=v14.16.0" 3561 | }, 3562 | "funding": { 3563 | "url": "https://github.com/sponsors/antfu" 3564 | }, 3565 | "peerDependencies": { 3566 | "@edge-runtime/vm": "*", 3567 | "@vitest/browser": "*", 3568 | "@vitest/ui": "*", 3569 | "happy-dom": "*", 3570 | "jsdom": "*" 3571 | }, 3572 | "peerDependenciesMeta": { 3573 | "@edge-runtime/vm": { 3574 | "optional": true 3575 | }, 3576 | "@vitest/browser": { 3577 | "optional": true 3578 | }, 3579 | "@vitest/ui": { 3580 | "optional": true 3581 | }, 3582 | "happy-dom": { 3583 | "optional": true 3584 | }, 3585 | "jsdom": { 3586 | "optional": true 3587 | } 3588 | } 3589 | }, 3590 | "node_modules/vitest/node_modules/acorn-walk": { 3591 | "version": "8.2.0", 3592 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 3593 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 3594 | "dev": true, 3595 | "engines": { 3596 | "node": ">=0.4.0" 3597 | } 3598 | }, 3599 | "node_modules/w3c-hr-time": { 3600 | "version": "1.0.2", 3601 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", 3602 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", 3603 | "dev": true, 3604 | "optional": true, 3605 | "peer": true, 3606 | "dependencies": { 3607 | "browser-process-hrtime": "^1.0.0" 3608 | } 3609 | }, 3610 | "node_modules/w3c-xmlserializer": { 3611 | "version": "2.0.0", 3612 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", 3613 | "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", 3614 | "dev": true, 3615 | "optional": true, 3616 | "peer": true, 3617 | "dependencies": { 3618 | "xml-name-validator": "^3.0.0" 3619 | }, 3620 | "engines": { 3621 | "node": ">=10" 3622 | } 3623 | }, 3624 | "node_modules/webidl-conversions": { 3625 | "version": "6.1.0", 3626 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", 3627 | "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", 3628 | "dev": true, 3629 | "optional": true, 3630 | "peer": true, 3631 | "engines": { 3632 | "node": ">=10.4" 3633 | } 3634 | }, 3635 | "node_modules/whatwg-encoding": { 3636 | "version": "1.0.5", 3637 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", 3638 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", 3639 | "dev": true, 3640 | "optional": true, 3641 | "peer": true, 3642 | "dependencies": { 3643 | "iconv-lite": "0.4.24" 3644 | } 3645 | }, 3646 | "node_modules/whatwg-mimetype": { 3647 | "version": "2.3.0", 3648 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", 3649 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", 3650 | "dev": true, 3651 | "optional": true, 3652 | "peer": true 3653 | }, 3654 | "node_modules/whatwg-url": { 3655 | "version": "8.7.0", 3656 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", 3657 | "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", 3658 | "dev": true, 3659 | "optional": true, 3660 | "peer": true, 3661 | "dependencies": { 3662 | "lodash": "^4.7.0", 3663 | "tr46": "^2.1.0", 3664 | "webidl-conversions": "^6.1.0" 3665 | }, 3666 | "engines": { 3667 | "node": ">=10" 3668 | } 3669 | }, 3670 | "node_modules/which": { 3671 | "version": "2.0.2", 3672 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3673 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3674 | "dev": true, 3675 | "dependencies": { 3676 | "isexe": "^2.0.0" 3677 | }, 3678 | "bin": { 3679 | "node-which": "bin/node-which" 3680 | }, 3681 | "engines": { 3682 | "node": ">= 8" 3683 | } 3684 | }, 3685 | "node_modules/word-wrap": { 3686 | "version": "1.2.4", 3687 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", 3688 | "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", 3689 | "dev": true, 3690 | "engines": { 3691 | "node": ">=0.10.0" 3692 | } 3693 | }, 3694 | "node_modules/wrap-ansi": { 3695 | "version": "7.0.0", 3696 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3697 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3698 | "dev": true, 3699 | "dependencies": { 3700 | "ansi-styles": "^4.0.0", 3701 | "string-width": "^4.1.0", 3702 | "strip-ansi": "^6.0.0" 3703 | }, 3704 | "engines": { 3705 | "node": ">=10" 3706 | }, 3707 | "funding": { 3708 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3709 | } 3710 | }, 3711 | "node_modules/wrappy": { 3712 | "version": "1.0.2", 3713 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3714 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3715 | "dev": true 3716 | }, 3717 | "node_modules/ws": { 3718 | "version": "7.5.6", 3719 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", 3720 | "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", 3721 | "dev": true, 3722 | "optional": true, 3723 | "peer": true, 3724 | "engines": { 3725 | "node": ">=8.3.0" 3726 | }, 3727 | "peerDependencies": { 3728 | "bufferutil": "^4.0.1", 3729 | "utf-8-validate": "^5.0.2" 3730 | }, 3731 | "peerDependenciesMeta": { 3732 | "bufferutil": { 3733 | "optional": true 3734 | }, 3735 | "utf-8-validate": { 3736 | "optional": true 3737 | } 3738 | } 3739 | }, 3740 | "node_modules/xml-name-validator": { 3741 | "version": "3.0.0", 3742 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", 3743 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", 3744 | "dev": true, 3745 | "optional": true, 3746 | "peer": true 3747 | }, 3748 | "node_modules/xmlchars": { 3749 | "version": "2.2.0", 3750 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 3751 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 3752 | "dev": true, 3753 | "optional": true, 3754 | "peer": true 3755 | }, 3756 | "node_modules/y18n": { 3757 | "version": "5.0.8", 3758 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3759 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3760 | "dev": true, 3761 | "engines": { 3762 | "node": ">=10" 3763 | } 3764 | }, 3765 | "node_modules/yallist": { 3766 | "version": "4.0.0", 3767 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3768 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3769 | "dev": true 3770 | }, 3771 | "node_modules/yargs": { 3772 | "version": "16.2.0", 3773 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 3774 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 3775 | "dev": true, 3776 | "dependencies": { 3777 | "cliui": "^7.0.2", 3778 | "escalade": "^3.1.1", 3779 | "get-caller-file": "^2.0.5", 3780 | "require-directory": "^2.1.1", 3781 | "string-width": "^4.2.0", 3782 | "y18n": "^5.0.5", 3783 | "yargs-parser": "^20.2.2" 3784 | }, 3785 | "engines": { 3786 | "node": ">=10" 3787 | } 3788 | }, 3789 | "node_modules/yargs-parser": { 3790 | "version": "20.2.9", 3791 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 3792 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 3793 | "dev": true, 3794 | "engines": { 3795 | "node": ">=10" 3796 | } 3797 | }, 3798 | "node_modules/yocto-queue": { 3799 | "version": "0.1.0", 3800 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3801 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3802 | "dev": true, 3803 | "engines": { 3804 | "node": ">=10" 3805 | }, 3806 | "funding": { 3807 | "url": "https://github.com/sponsors/sindresorhus" 3808 | } 3809 | } 3810 | } 3811 | } 3812 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "feiertagejs", 3 | "version": "1.4.1", 4 | "description": "A module to calculate German holidays made for node.js", 5 | "type": "module", 6 | "main": "build/feiertage.umd.cjs", 7 | "module": "build/feiertage.js", 8 | "types": "index.d.ts", 9 | "scripts": { 10 | "test": "vitest run --coverage", 11 | "test:w": "vitest watch", 12 | "format": "prettier --write \"{**/*,*}.{ts,json}\" \"!coverage/**\" \"!build/**\" \"!package.json\" \"!package-lock.json\" --cache", 13 | "lint": "eslint \"src\" \"spec\"", 14 | "build": "rollup -c" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "https://github.com/sfakir/feiertagejs" 19 | }, 20 | "keywords": [ 21 | "node", 22 | "holidays", 23 | "feiertage", 24 | "javascript" 25 | ], 26 | "engines": { 27 | "node": ">=8.0.0" 28 | }, 29 | "author": "Simon Fakir", 30 | "license": "MIT", 31 | "bugs": { 32 | "url": "https://github.com/sfakir/feiertagejs/issues" 33 | }, 34 | "homepage": "https://github.com/sfakir/feiertagejs", 35 | "devDependencies": { 36 | "@vitest/coverage-c8": "^0.26.2", 37 | "prettier": "^2.8.1", 38 | "rollup": "^3.9.0", 39 | "@rollup/plugin-typescript": "^10.0.1", 40 | "typescript": "^4.9.4", 41 | "vitest": "^0.26.2", 42 | "@typescript-eslint/eslint-plugin": "^5.47.1", 43 | "@typescript-eslint/parser": "^5.47.1", 44 | "eslint": "^8.30.0", 45 | "eslint-config-prettier": "^8.5.0" 46 | }, 47 | "files": [ 48 | "build", 49 | "docs.md", 50 | "Readme.md", 51 | "index.d.ts" 52 | ] 53 | } 54 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from '@rollup/plugin-typescript'; 2 | 3 | export default [ 4 | // build ES modules for bundlers (webpack, rollup, ...) 5 | { 6 | input: 'src/feiertage.ts', 7 | output: { 8 | file: 'build/feiertage.js', 9 | format: 'es', 10 | sourcemap: true, 11 | }, 12 | plugins: [typescript()], 13 | }, 14 | 15 | // ... and umd for the rest (node, browser) 16 | { 17 | input: 'src/feiertage.ts', 18 | output: { 19 | file: 'build/feiertage.umd.cjs', 20 | name: 'feiertagejs', 21 | format: 'umd', 22 | noConflict: true, 23 | sourcemap: true, 24 | }, 25 | plugins: [typescript()], 26 | }, 27 | // .. esm 28 | { 29 | input: 'src/feiertage.ts', 30 | output: { 31 | file: 'build/feiertage.esm.js', 32 | name: 'feiertagejs', 33 | format: 'esm', 34 | noConflict: true, 35 | sourcemap: true, 36 | }, 37 | plugins: [typescript()], 38 | }, 39 | 40 | ]; 41 | -------------------------------------------------------------------------------- /sample/typescript_example.ts: -------------------------------------------------------------------------------- 1 | import { isHoliday, isSpecificHoliday } from '../src/feiertage'; 2 | import { getHolidays } from '../src/feiertage'; 3 | 4 | // get Holidays in 2021 5 | const holidaysIn2021 = getHolidays(2021, 'ALL'); 6 | console.log({ holidaysIn2021 }); 7 | 8 | const today = new Date(); 9 | console.log(isHoliday(today, 'BW')); 10 | // probably false, because you are working ;) 11 | 12 | // check if a day is a specific holiday: 13 | console.log(isSpecificHoliday(today, 'CHRISTIHIMMELFAHRT', 'ALL')); 14 | 15 | // get all holiday for a single year: getHolidays() 16 | // returns an array of objects [ {name: '', date: ''} ,...] 17 | 18 | const holidays2018 = getHolidays('2018', 'BUND'); 19 | 20 | const date = new Date(); 21 | console.log('date', holidays2018[0].dateString); // = "2018-01-01" 22 | console.log('name', holidays2018[0].name); // 'NEUJAHRSTAG' (constant) 23 | console.log('translation', holidays2018[0].translate()); // German translation: Neujahrstag 24 | console.log('equals?', holidays2018[0].equals(date)); // Compare days only (ignore time) 25 | -------------------------------------------------------------------------------- /spec/bundesweit.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { getHolidays, isHoliday } from '../src/feiertage'; 3 | 4 | describe('Holidays 2015 in Germany:', () => { 5 | it('should be an array', () => { 6 | expect(getHolidays(2015, 'BUND')).toHaveLength(9); 7 | }); 8 | 9 | it('New Year should be a holiday', () => { 10 | const day = new Date(2015, 0, 1); 11 | expect(isHoliday(day, 'BUND')).toBe(true); 12 | }); 13 | 14 | it('6th of january should not be a holiday', () => { 15 | const day = new Date(2015, 0, 6); 16 | expect(isHoliday(day, 'BUND')).toBe(false); 17 | }); 18 | 19 | it('Simons Birthday is not a holiday', () => { 20 | const feiertag = new Date(2015, 4, 31); 21 | expect(isHoliday(feiertag, 'BUND')).toBe(false); 22 | }); 23 | it('Eastermonday should be a holiday', () => { 24 | const ostermontag = new Date(2015, 3, 6); //6. april 25 | expect(isHoliday(ostermontag, 'BUND')).toBe(true); 26 | }); 27 | 28 | it('First May to be a holiday', () => { 29 | const heiligeDreiKoenige = new Date(2015, 4, 1); 30 | expect(isHoliday(heiligeDreiKoenige, 'BUND')).toBe(true); 31 | }); 32 | 33 | it('Christmas to be a holiday', () => { 34 | const christmas1 = new Date(2015, 11, 25); 35 | expect(isHoliday(christmas1, 'BUND')).toBe(true); 36 | 37 | const christmas2 = new Date(2015, 11, 26); 38 | expect(isHoliday(christmas2, 'BUND')).toBe(true); 39 | }); 40 | 41 | it('Allerheiligen should not to be a holiday', () => { 42 | const day = new Date(2015, 10, 1); 43 | expect(isHoliday(day, 'BUND')).toBe(false); 44 | }); 45 | 46 | it('in 2017 we have REFORMATIONSTAG in whole Germany', () => { 47 | const result = getHolidays(2017, 'BUND'); 48 | expect(result).toHaveLength(10); 49 | 50 | const reftag = result.find((r) => r.name === 'REFORMATIONSTAG'); 51 | expect(reftag).toBeDefined(); 52 | }); 53 | it('in 2016 we do not have REFORMATIONSTAG in whole Germany', () => { 54 | const result = getHolidays(2016, 'BUND'); 55 | expect(result).toHaveLength(9); 56 | const ref = result.find((r) => r.name === 'REFORMATIONSTAG'); 57 | expect(ref).toBeUndefined(); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /spec/errors.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { getHolidays, isHoliday, isSpecificHoliday } from '../src/feiertage'; 3 | 4 | describe('Throw errors:', () => { 5 | it('should throw an invalid region error', () => { 6 | // $FlowFixMe: test wrong region arg 7 | expect(() => isHoliday(new Date(), 'SWISS' as any)).toThrow(); 8 | }); 9 | it('should throw an undefined Region error', () => { 10 | expect(() => isHoliday(new Date(), undefined as any)).toThrow(); 11 | }); 12 | it('should throw an null Region error', () => { 13 | expect(() => isHoliday(new Date(), null as any)).toThrow(); 14 | }); 15 | it('should throw an invalid holiday error', () => { 16 | // $FlowFixMe: test wrong holiday arg 17 | expect(() => isSpecificHoliday(new Date(), 'RANDOM' as any)).toThrow(); 18 | }); 19 | it('should throw an undefined Holiday error', () => { 20 | expect(() => 21 | isSpecificHoliday(new Date(), undefined as any), 22 | ).toThrow(); 23 | }); 24 | it('should throw an null Holiday error', () => { 25 | expect(() => isSpecificHoliday(new Date(), null as any)).toThrow(); 26 | }); 27 | 28 | it('New Year should be a holiday', () => { 29 | const day = new Date(2015, 0, 1); 30 | expect(isHoliday(day, 'BUND')).toEqual(true); 31 | }); 32 | 33 | it('6th of january should not be a holiday', () => { 34 | const day = new Date(2015, 0, 6); 35 | expect(isHoliday(day, 'BUND')).toEqual(false); 36 | }); 37 | 38 | it('Simons Birthday is not a holiday', () => { 39 | const feiertag = new Date(2015, 4, 31); 40 | expect(isHoliday(feiertag, 'BUND')).toEqual(false); 41 | }); 42 | it('Eastermonday should be a holiday', () => { 43 | const ostermontag = new Date(2015, 3, 6); //6. april 44 | expect(isHoliday(ostermontag, 'BUND')).toEqual(true); 45 | }); 46 | 47 | it('First May to be a holiday', () => { 48 | const heiligeDreiKoenige = new Date(2015, 4, 1); 49 | expect(isHoliday(heiligeDreiKoenige, 'BUND')).toEqual(true); 50 | }); 51 | 52 | it('Christmas to be a holiday', () => { 53 | const christmas1 = new Date(2015, 11, 25); 54 | expect(isHoliday(christmas1, 'BUND')).toEqual(true); 55 | 56 | const christmas2 = new Date(2015, 11, 26); 57 | expect(isHoliday(christmas2, 'BUND')).toEqual(true); 58 | }); 59 | 60 | it('Allerheiligen should not to be a holiday', () => { 61 | const day = new Date(2015, 10, 1); 62 | expect(isHoliday(day, 'BUND')).toEqual(false); 63 | }); 64 | 65 | it('in 2017 we have REFORMATIONSTAG in whole Germany', () => { 66 | const result = getHolidays(2017, 'BUND'); 67 | expect(result).toHaveLength(10); 68 | const reftag = result.find((r) => r.name === 'REFORMATIONSTAG'); 69 | expect(reftag).toBeDefined(); 70 | }); 71 | it('in 2016 we do not have REFORMATIONSTAG in whole Germany', () => { 72 | const result = getHolidays(2016, 'BUND'); 73 | expect(result).toHaveLength(9); 74 | const ref = result.find((r) => r.name === 'REFORMATIONSTAG'); 75 | expect(ref).toBeUndefined(); 76 | }); 77 | }); 78 | -------------------------------------------------------------------------------- /spec/feiertage.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { Holiday } from '../src/Holiday'; 3 | import { getHolidays, isHoliday, isSunOrHoliday } from '../src/feiertage'; 4 | 5 | describe('Holidays 2015 in Bavaria:', () => { 6 | it('should be an array', () => { 7 | expect(getHolidays(2015, 'BY')).toHaveLength(13); 8 | }); 9 | 10 | it('Maria Himmelfahrt not be a holiday', () => { 11 | const mariaHimemlfahrt = new Date(2015, 9, 15); 12 | expect(isHoliday(mariaHimemlfahrt, 'BY')).toBe(false); 13 | }); 14 | 15 | it('Simons Birthday is not a holiday', () => { 16 | const feiertag = new Date(2015, 4, 31); 17 | expect(isHoliday(feiertag, 'BY')).toBe(false); 18 | }); 19 | it('Maria HeiligeDreiKönige be a holiday', () => { 20 | const heiligeDreiKoenige = new Date(2015, 0, 6); 21 | expect(isHoliday(heiligeDreiKoenige, 'BY')).toBe(true); 22 | }); 23 | 24 | it('First May to be a holiday', () => { 25 | const heiligeDreiKoenige = new Date(2015, 0, 6); 26 | expect(isHoliday(heiligeDreiKoenige, 'BY')).toBe(true); 27 | }); 28 | 29 | it('check is Sun Or Holiday Method', () => { 30 | const sunday = new Date(2015, 0, 6); 31 | sunday.setDate(sunday.getDate() + ((7 - sunday.getDay()) % 7)); 32 | 33 | expect(isSunOrHoliday(sunday, 'BY')).toBe(true); 34 | 35 | sunday.setDate(sunday.getDate() + ((1 + 7 - sunday.getDay()) % 7)); 36 | expect(isSunOrHoliday(sunday, 'BY')).toBe(false); 37 | }); 38 | 39 | it('Christmas to be a holiday', () => { 40 | const christmas1 = new Date(2015, 11, 25); 41 | expect(isHoliday(christmas1, 'BY')).toEqual(true); 42 | 43 | const christmas2 = new Date(2015, 11, 26); 44 | expect(isHoliday(christmas2, 'BY')).toBe(true); 45 | }); 46 | }); 47 | 48 | describe('Holidays 2016 in BW:', () => { 49 | it('BW should have 12 holidays', () => { 50 | expect(getHolidays(2016, 'BW')).toHaveLength(12); 51 | }); 52 | }); 53 | 54 | describe('Holidays ALL', () => { 55 | it('Maria Himmelfahrt should be a holiday if region type is set to ALL', () => { 56 | const himmelfahrt = new Date(2022, 7, 15); // 15.08.2022 57 | 58 | expect(isHoliday(himmelfahrt, 'ALL')).toBe(true); 59 | }); 60 | }); 61 | 62 | describe('Holidays 2016 in NW:', () => { 63 | it('Heilige Drei Könige should not be available', () => { 64 | const result = getHolidays(2016, 'NW'); 65 | const hkoenige = result.find((f) => f.name === 'HEILIGEDREIKOENIGE'); 66 | expect(hkoenige).toBeUndefined(); 67 | }); 68 | it('Tag der Arbeit should be on first may', () => { 69 | const result = getHolidays(2016, 'NW'); 70 | const firstMay: Holiday | undefined = result.find( 71 | (f) => f.name === 'TAG_DER_ARBEIT', 72 | ); 73 | expect(firstMay).toBeDefined(); 74 | expect(firstMay!.equals(new Date(2016, 4,1))).toBe(true); 75 | }); 76 | }); 77 | -------------------------------------------------------------------------------- /spec/feiertage2017.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | // https://de.wikipedia.org/wiki/Feiertage_in_Deutschland 3 | 4 | import { 5 | getHolidayByDate, 6 | isHoliday, 7 | isSpecificHoliday, 8 | } from '../src/feiertage'; 9 | 10 | describe('get Specific holiday by Date', () => { 11 | it('find BUBE-TAG 2016', () => { 12 | const bubebtag = new Date(2016, 10, 16); 13 | expect(getHolidayByDate(bubebtag, 'SN')).toEqual( 14 | expect.objectContaining({ 15 | name: 'BUBETAG', 16 | }), 17 | ); 18 | }); 19 | 20 | it('find heiligeDreiKoenige 2015', () => { 21 | const heiligeDreiKoenige = new Date(2015, 0, 6); 22 | expect(getHolidayByDate(heiligeDreiKoenige, 'BY')).toEqual( 23 | expect.objectContaining({ 24 | name: 'HEILIGEDREIKOENIGE', 25 | }), 26 | ); 27 | }); 28 | 29 | it('Maria Himmelfahrt not be a holiday', () => { 30 | const mariaHimmelfahrt = new Date(2015, 9, 15); 31 | expect(getHolidayByDate(mariaHimmelfahrt, 'BY')).toBeUndefined(); 32 | }); 33 | }); 34 | 35 | /** 36 | * driven by this issue (https://github.com/sfakir/feiertagejs/issues/6), 37 | * we added a unit test for Buß und Betttag 38 | * 39 | */ 40 | describe('Holidays 2017 in Saxony:', () => { 41 | it('BUBE-TAG 2016', () => { 42 | const bubebtag = new Date(2016, 10, 16); 43 | expect(isHoliday(bubebtag, 'SN')).toEqual(true); 44 | }); 45 | it('BUBE-TAG 2017', () => { 46 | const bubebtag = new Date(2017, 10, 22); 47 | expect(isHoliday(bubebtag, 'SN')).toEqual(true); 48 | }); 49 | it('2017/11/22 is BUBE TAG', () => { 50 | const bubebtag = new Date(2017, 10, 22); 51 | expect(isSpecificHoliday(bubebtag, 'BUBETAG', 'SN')).toEqual(true); 52 | }); 53 | it('BUBE-TAG 2018', () => { 54 | const bubebtag = new Date(2018, 10, 21); 55 | expect(isHoliday(bubebtag, 'SN')).toEqual(true); 56 | }); 57 | it('BUBE-TAG 2018 in BY/BW', () => { 58 | const bubebtag = new Date(2018, 10, 21); 59 | expect(isHoliday(bubebtag, 'BY')).toEqual(false); 60 | expect(isHoliday(bubebtag, 'BW')).toEqual(false); 61 | }); 62 | }); 63 | -------------------------------------------------------------------------------- /spec/feiertage2019.spec.ts: -------------------------------------------------------------------------------- 1 | // https://de.wikipedia.org/wiki/Feiertage_in_Deutschland 2 | 3 | import { describe, it, expect } from 'vitest'; 4 | import { getHolidayByDate } from '../src/feiertage'; 5 | 6 | /** 7 | * Test for this comment https://github.com/sfakir/feiertagejs/commit/fefa9958b7105df9f7f964d27661bc775995871b 8 | */ 9 | describe('get Specific holiday by Date', () => { 10 | it('find WELTKINDERTAG 2019', () => { 11 | const weltkindertag = new Date(2020, 8, 20); 12 | expect(getHolidayByDate(weltkindertag, 'TH')).toEqual( 13 | expect.objectContaining({ 14 | name: 'WELTKINDERTAG', 15 | }), 16 | ); 17 | }); 18 | 19 | it('find Weltfrauentag >2019 8th or March in Berlin', () => { 20 | const WELTFRAUENTAG = new Date(2020, 2, 8); 21 | expect(getHolidayByDate(WELTFRAUENTAG, 'BE')).toEqual( 22 | expect.objectContaining({ 23 | name: 'WELTFRAUENTAG', 24 | }), 25 | ); 26 | }); 27 | it('find Weltfrauentag >2019 8th or March in Mecklenburg-Vorpommenr', () => { 28 | const WELTFRAUENTAG = new Date(2024, 2, 8); 29 | expect(getHolidayByDate(WELTFRAUENTAG, 'MV')).toEqual( 30 | expect.objectContaining({ 31 | name: 'WELTFRAUENTAG', 32 | }), 33 | ); 34 | }); 35 | it('find Weltfrauentag >2019 8th or March should not be a holiday in BY', () => { 36 | const WELTFRAUENTAG = new Date(2020, 2, 8); 37 | expect(getHolidayByDate(WELTFRAUENTAG, 'BY')).toEqual(undefined); 38 | }); 39 | it('find Weltfrauentag <2019 should not be a holiday in Berlin', () => { 40 | const WELTFRAUENTAG = new Date(2016, 2, 8); 41 | expect(getHolidayByDate(WELTFRAUENTAG, 'BE')).toEqual(undefined); 42 | }); 43 | it('find Weltfrauentag <2019 should not be a holiday in BW', () => { 44 | const WELTFRAUENTAG = new Date(2016, 2, 8); 45 | expect(getHolidayByDate(WELTFRAUENTAG, 'BW')).toEqual(undefined); 46 | }); 47 | 48 | // because: https://github.com/sfakir/feiertagejs/issues/33 49 | it('find Fronleichname in 2019 8th or March in Bacvaria', () => { 50 | const FRONLEICHNAM = new Date(2019, 5, 20); // 20.6.2019 51 | 52 | expect(getHolidayByDate(FRONLEICHNAM, 'BY')).toEqual( 53 | expect.objectContaining({ 54 | name: 'FRONLEICHNAM', 55 | }), 56 | ); 57 | }); 58 | 59 | /** 60 | * Neu: 61 | * Reformationstag am 31. Oktober in 62 | * Bremen, Hamburg, Niedersachsen und Schleswig-Holstein. 63 | */ 64 | it('find Reformationstag >2019 31. Oktober in Bremen', () => { 65 | const REFORMANTIONSTAG = new Date(2020, 9, 31); 66 | 67 | expect(getHolidayByDate(REFORMANTIONSTAG, 'NI')).toEqual( 68 | expect.objectContaining({ 69 | name: 'REFORMATIONSTAG', 70 | }), 71 | ); 72 | expect(getHolidayByDate(REFORMANTIONSTAG, 'ST')).toEqual( 73 | expect.objectContaining({ 74 | name: 'REFORMATIONSTAG', 75 | }), 76 | ); 77 | expect(getHolidayByDate(REFORMANTIONSTAG, 'HB')).toEqual( 78 | expect.objectContaining({ 79 | name: 'REFORMATIONSTAG', 80 | }), 81 | ); 82 | expect(getHolidayByDate(REFORMANTIONSTAG, 'TH')).toEqual( 83 | expect.objectContaining({ 84 | name: 'REFORMATIONSTAG', 85 | }), 86 | ); 87 | expect(getHolidayByDate(REFORMANTIONSTAG, 'SN')).toEqual( 88 | expect.objectContaining({ 89 | name: 'REFORMATIONSTAG', 90 | }), 91 | ); 92 | }); 93 | }); 94 | -------------------------------------------------------------------------------- /spec/feiertage2020.spec.ts: -------------------------------------------------------------------------------- 1 | // https://de.wikipedia.org/wiki/Feiertage_in_Deutschland 2 | 3 | import { describe, it, expect } from 'vitest'; 4 | import { isSpecificHoliday } from '../src/feiertage'; 5 | 6 | /** 7 | * Test for this comment https://github.com/sfakir/feiertagejs/commit/fefa9958b7105df9f7f964d27661bc775995871b 8 | */ 9 | describe('get Specific holiday by Date', () => { 10 | it('Christi Himmelfahrt is not the second christmas holiday', () => { 11 | const secondChristmasDay = new Date('2021-12-25T09:30:00.000+01:00'); 12 | 13 | expect( 14 | isSpecificHoliday(secondChristmasDay, 'CHRISTIHIMMELFAHRT', 'ALL'), 15 | ).toBeFalsy(); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /spec/feiertageNames.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { getHolidays, isSpecificHoliday } from '../src/feiertage'; 3 | import { Holiday } from '../src/holiday'; 4 | 5 | describe('Check Feiertage by Name', () => { 6 | it('check ChristiHimmelfahrt 2016: check wrong dates', () => { 7 | // source: http://www.schulferien.org/Feiertage/2016/feiertage_2016.html 8 | expect( 9 | isSpecificHoliday(new Date(2016, 9, 15), 'CHRISTIHIMMELFAHRT'), 10 | ).toEqual(false); 11 | expect( 12 | isSpecificHoliday(new Date(2016, 12, 24), 'CHRISTIHIMMELFAHRT'), 13 | ).toEqual(false); 14 | }); 15 | it('check ChristiHimmelfahrt 2016: check right date', () => { 16 | // 5.5.2016 17 | const somedate = new Date(2016, 4, 5); 18 | expect(isSpecificHoliday(somedate, 'CHRISTIHIMMELFAHRT')).toEqual(true); // und Vatertag 19 | }); 20 | 21 | it('check Erster Weihnachtsfeiertag 2016: check right date', () => { 22 | // 25.12.2016 23 | const somedate = new Date(2016, 11, 25); 24 | expect(isSpecificHoliday(somedate, 'ERSTERWEIHNACHTSFEIERTAG')).toEqual( 25 | true, 26 | ); 27 | }); 28 | 29 | it('check Erster Weihnachtsfeiertag 2016: check wrong date', () => { 30 | // 5.5.2016 31 | const somedate = new Date(2016, 11, 29); 32 | expect(isSpecificHoliday(somedate, 'ERSTERWEIHNACHTSFEIERTAG')).toEqual( 33 | false, 34 | ); 35 | }); 36 | it('every holiday should have a translation', () => { 37 | const somedate = new Date(2016, 5, 5); 38 | const holidays: Holiday[] = getHolidays(somedate.getFullYear(), 'ALL'); 39 | 40 | for (const holiday of holidays) { 41 | const translation = holiday.translate(); 42 | expect(translation).toBeTruthy(); 43 | } 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /spec/feiertageToRegion.spec.ts: -------------------------------------------------------------------------------- 1 | // https://de.wikipedia.org/wiki/Feiertage_in_Deutschland 2 | 3 | import { describe, it, expect } from 'vitest'; 4 | import { getHolidayByDate, getHolidays } from '../src/feiertage'; 5 | 6 | /** 7 | * Test for this comment https://github.com/sfakir/feiertagejs/commit/fefa9958b7105df9f7f964d27661bc775995871b 8 | */ 9 | describe('find the regions of a holiday', () => { 10 | it('find WELTKINDERTAG 2019', () => { 11 | const weltkindertag = new Date(2020, 8, 20); 12 | const holiday = getHolidayByDate(weltkindertag, 'TH'); 13 | if (!holiday) { 14 | throw new Error('Holiday not found'); 15 | } 16 | 17 | expect(holiday.regions).contain('TH'); 18 | }); 19 | it('should find a region on every holiday', () => { 20 | const holidays = getHolidays(2024, 'ALL'); 21 | for (const holiday of holidays) { 22 | expect(holiday.regions.length).to.be.greaterThan(0); 23 | } 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /spec/inputCheck.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { 3 | getHolidayByDate, 4 | getHolidays 5 | } from '../src/feiertage'; 6 | 7 | describe('Wrong Inputs', () => { 8 | it.each([[2017], [2018]])( 9 | 'Year %i should be the same as integer and string', 10 | (year) => { 11 | const result = getHolidays(year, 'BUND'); 12 | const result2 = getHolidays(String(year), 'BUND'); 13 | expect(result.length).toEqual(result2.length); 14 | }, 15 | ); 16 | }); 17 | describe.only('Check if holiday properties are set', () => { 18 | const holiday = getHolidayByDate(new Date(2024, (12 - 1), 25), 'BUND'); // Christmas 19 | 20 | it('should have a name', () => { 21 | expect(holiday?.name).toBeDefined(); 22 | }); 23 | it('should have a dateString', () => { 24 | expect(holiday?.dateString).toBeDefined(); 25 | }); 26 | it('should have a date', () => { 27 | expect(holiday?.date).toBeDefined(); 28 | }); 29 | it('should have regions', () => { 30 | expect(holiday?.regions).toBeDefined(); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /spec/localholidays.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { getHolidays, isHoliday } from '../src/feiertage'; 3 | 4 | describe('localholiday', () => { 5 | it('find some days from AUGSBURG', () => { 6 | const augsburgsHolidays = getHolidays(2020, 'AUGSBURG'); 7 | const friedensfest = augsburgsHolidays.find( 8 | (holiday) => holiday.name === 'AUGSBURGER_FRIEDENSFEST', 9 | ); 10 | expect(friedensfest).not.toBeNull(); 11 | }); 12 | it('find Friedensfest by Date', () => { 13 | const date = new Date('2020-08-08'); 14 | const friedensfest = isHoliday(date, 'AUGSBURG'); 15 | expect(friedensfest).toEqual(true); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /spec/translation.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect } from 'vitest'; 2 | import { 3 | addTranslation, 4 | getHolidays, 5 | getLanguage, 6 | setLanguage, 7 | } from '../src/feiertage'; 8 | 9 | describe('set Custom Translations', () => { 10 | it('dont allow missing language', () => { 11 | setLanguage('de'); 12 | expect(getLanguage()).toEqual('de'); 13 | expect(() => setLanguage('it')).toThrow(TypeError); 14 | expect(getLanguage()).toEqual('de'); 15 | }); 16 | 17 | it('setAndGetLanguage', () => { 18 | expect(getLanguage()).toEqual('de'); 19 | 20 | addTranslation('en', {}); 21 | expect(getLanguage()).toEqual('de'); 22 | 23 | setLanguage('en'); 24 | expect(getLanguage()).toEqual('en'); 25 | }); 26 | 27 | it('setEnglish', () => { 28 | addTranslation('en', { 29 | NEUJAHRSTAG: 'New Years Eve', 30 | HEILIGEDREIKOENIGE: 'Holy Three Kings', 31 | }); 32 | setLanguage('en'); 33 | const holidays = getHolidays(2016, 'BUND'); 34 | const newYearsEve = holidays[0]; 35 | 36 | expect(newYearsEve.translate()).toEqual('New Years Eve'); 37 | expect(newYearsEve.translate('en')).toEqual('New Years Eve'); 38 | expect(newYearsEve.translate('de')).toEqual('Neujahrstag'); 39 | }); 40 | 41 | it('German Fallback for missing translations', () => { 42 | addTranslation('en', { 43 | NEUJAHRSTAG: 'New Years Eve', 44 | }); 45 | setLanguage('en'); 46 | const holidays = getHolidays(2016, 'BUND'); 47 | 48 | const threeKings = holidays[3]; 49 | 50 | // fallback 51 | expect(threeKings.translate()).toEqual('Tag der Arbeit'); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /src/feiertage.ts: -------------------------------------------------------------------------------- 1 | /*! 2 | * feiertage.js 3 | * @repository https://github.com/sfakir/feiertagejs 4 | * @docs https://github.com/sfakir/feiertagejs/blob/master/docs.md 5 | * 6 | * Copyright 2015-2021 Simon Fakir 7 | * Released under the MIT license 8 | */ 9 | 10 | // 11 | // Additional readings 12 | // - how to format a javascript date: http://blog.stevenlevithan.com/archives/date-time-format 13 | // - the right javascript date: http://stackoverflow.com/questions/10286204/the-right-json-date-format 14 | // 15 | 16 | import { germanTranslations } from './german-translations'; 17 | import { Holiday } from './holiday'; 18 | import { allHolidays, HolidayType } from './holiday-type'; 19 | import { allRegions, Region } from './regions'; 20 | 21 | // translations 22 | 23 | const defaultLanguage = 'de'; 24 | let currentLanguage: string = defaultLanguage; 25 | 26 | /** 27 | * Map of {@link HolidayType} to translation string. 28 | */ 29 | export type TranslationTable = { [key in HolidayType]?: string }; 30 | 31 | const translations: { [key: string]: TranslationTable } = { 32 | de: germanTranslations, 33 | }; 34 | 35 | /** 36 | * adds a translation for the holidays (e.g. english). 37 | * This also allows to override the German names. 38 | * Hint: Interpolates German for missing translations 39 | * @param {string} isoCode of the new language 40 | * @param {TranslationTable} newTranslation map of {HolidayType} to translation stringg 41 | */ 42 | export function addTranslation( 43 | isoCode: string, 44 | newTranslation: TranslationTable, 45 | ): void { 46 | const code = isoCode.toLowerCase(); 47 | const defaultTranslation = translations[defaultLanguage]; 48 | let missingFields = false; 49 | 50 | // fill new Translation with default Language 51 | for (const holiday of allHolidays) { 52 | if (!newTranslation[holiday]) { 53 | missingFields = true; 54 | newTranslation[holiday] = defaultTranslation[holiday]; 55 | } 56 | } 57 | if (missingFields) { 58 | console.warn( 59 | '[feiertagejs] addTranslation: you did not add all holidays in your translation! Took German as fallback', 60 | ); 61 | } 62 | 63 | translations[code] = newTranslation; 64 | } 65 | 66 | /** 67 | * Set a language to default language 68 | * @param {string} isoCode 69 | */ 70 | export function setLanguage(isoCode: string): void { 71 | const code = isoCode.toLowerCase(); 72 | if (!translations[code]) { 73 | throw new TypeError( 74 | `[feiertagejs] tried to set language to ${code} but the translation is missing. Please use addTranslation(isoCode,object) first`, 75 | ); 76 | } 77 | currentLanguage = isoCode; 78 | } 79 | 80 | /** 81 | * Get currently set language 82 | * @returns {string} 83 | */ 84 | export function getLanguage(): string { 85 | return currentLanguage; 86 | } 87 | 88 | // holidays api 89 | 90 | /** 91 | * Checks if a specific date is sunday or holiday. 92 | * @param date 93 | * @param region 94 | * @returns {boolean} 95 | */ 96 | export function isSunOrHoliday(date: Date, region: Region): boolean { 97 | checkRegion(region); 98 | return date.getDay() === 0 || isHoliday(date, region); 99 | } 100 | 101 | /** 102 | * Check is specific date is holiday. 103 | * @param date 104 | * @param {Region} region two character {@link Region} code 105 | * @returns {boolean} 106 | */ 107 | export function isHoliday(date: Date, region: Region): boolean { 108 | checkRegion(region); 109 | 110 | const year = date.getFullYear(); 111 | const internalDate = toUtcTimestamp(date); 112 | const holidays = getHolidaysAsUtcTimestamps(year, region); 113 | 114 | return holidays.indexOf(internalDate) !== -1; 115 | } 116 | 117 | export function getHolidayByDate( 118 | date: Date, 119 | region: Region = 'ALL', 120 | ): Holiday | void { 121 | checkRegion(region); 122 | const holidays = getHolidaysOfYear(date.getFullYear(), region); 123 | return holidays.find((holiday) => holiday.equals(date)); 124 | } 125 | 126 | // additional runtime checks 127 | 128 | /** 129 | * Checks if the given region is a valid {@link Region}. 130 | * 131 | * @param region {@link Region} to check 132 | * @throws {Error} 133 | * @private 134 | */ 135 | function checkRegion(region?: Region): void { 136 | if (region === null || region === undefined) { 137 | throw new Error(`Region must not be undefined or null`); 138 | } 139 | if (allRegions.indexOf(region) === -1) { 140 | throw new Error( 141 | `Invalid region: ${region}! Must be one of ${allRegions.toString()}`, 142 | ); 143 | } 144 | } 145 | 146 | /** 147 | * Checks if the given holidayName is a valid {@link HolidayType}. 148 | * @param holidayName {@link HolidayType} to check 149 | * @throws {Error} 150 | * @private 151 | */ 152 | function checkHolidayType(holidayName?: HolidayType): void { 153 | if (holidayName === null || holidayName === undefined) { 154 | throw new TypeError('holidayName must not be null or undefined'); 155 | } 156 | if (allHolidays.indexOf(holidayName) === -1) { 157 | throw new Error( 158 | `feiertage.js: invalid holiday type "${holidayName}"! Must be one of ${allHolidays.toString()}`, 159 | ); 160 | } 161 | } 162 | 163 | export function isSpecificHoliday( 164 | date: Date, 165 | holidayName: HolidayType, 166 | region: Region = 'ALL', 167 | ): boolean { 168 | checkRegion(region); 169 | checkHolidayType(holidayName); 170 | const holidays = getHolidaysOfYear(date.getFullYear(), region); 171 | const foundHoliday = holidays.find((holiday) => holiday.equals(date)); 172 | if (!foundHoliday) { 173 | return false; 174 | } 175 | return foundHoliday.name === holidayName; 176 | } 177 | 178 | /** 179 | * Returns all holidays of a year in a {@link Region}. 180 | * @param year 181 | * @param region 182 | * @returns {Array.} 183 | */ 184 | export function getHolidays(year: number | string, region: Region): Holiday[] { 185 | let y: number; 186 | if (typeof year === 'string') { 187 | y = parseInt(year, 10); 188 | } else { 189 | y = year; 190 | } 191 | 192 | checkRegion(region); 193 | return getHolidaysOfYear(y, region); 194 | } 195 | 196 | /** 197 | * 198 | * @param {number} year 199 | * @param region 200 | * @returns {number[]} 201 | * @private 202 | */ 203 | function getHolidaysAsUtcTimestamps(year: number, region: Region): number[] { 204 | const holidays = getHolidaysOfYear(year, region); 205 | return holidays.map((holiday) => toUtcTimestamp(holiday.date)); 206 | } 207 | 208 | /** 209 | * 210 | * @param {number} year 211 | * @param region 212 | * @returns {{objects: Array., integers}} 213 | * @private 214 | */ 215 | function getHolidaysOfYear(year: number, region: Region): Holiday[] { 216 | const easterDate = getEasterDate(year); 217 | const karfreitag = addDays(new Date(easterDate.getTime()), -2); 218 | const ostermontag = addDays(new Date(easterDate.getTime()), 1); 219 | const christiHimmelfahrt = addDays(new Date(easterDate.getTime()), 39); 220 | const pfingstsonntag = addDays(new Date(easterDate.getTime()), 49); 221 | const pfingstmontag = addDays(new Date(easterDate.getTime()), 50); 222 | 223 | const holidays: Holiday[] = [ 224 | ...getCommonHolidays(year), 225 | newHoliday('KARFREITAG', karfreitag, ['ALL']), 226 | newHoliday('OSTERMONTAG', ostermontag, ['ALL']), 227 | newHoliday('CHRISTIHIMMELFAHRT', christiHimmelfahrt, ['ALL']), 228 | newHoliday('PFINGSTMONTAG', pfingstmontag, ['ALL']), 229 | ]; 230 | 231 | addHeiligeDreiKoenige(year, region, holidays); 232 | addEasterAndPfingsten(year, region, easterDate, pfingstsonntag, holidays); 233 | addFronleichnam(region, easterDate, holidays); 234 | addMariaeHimmelfahrt(year, region, holidays); 235 | addReformationstag(year, region, holidays); 236 | addAllerheiligen(year, region, holidays); 237 | addBussUndBetttag(year, region, holidays); 238 | addWeltkindertag(year, region, holidays); 239 | addWeltfrauenTag(year, region, holidays); 240 | 241 | addRegionalHolidays(year, region, holidays); 242 | 243 | return holidays.sort( 244 | (a: Holiday, b: Holiday) => a.date.getTime() - b.date.getTime(), 245 | ); 246 | } 247 | 248 | function getCommonHolidays(year: number): Holiday[] { 249 | return [ 250 | newHoliday('NEUJAHRSTAG', makeDate(year, 1, 1), ['ALL']), 251 | newHoliday('TAG_DER_ARBEIT', makeDate(year, 5, 1), ['ALL']), 252 | newHoliday('DEUTSCHEEINHEIT', makeDate(year, 10, 3), ['ALL']), 253 | newHoliday('ERSTERWEIHNACHTSFEIERTAG', makeDate(year, 12, 25), ['ALL']), 254 | newHoliday('ZWEITERWEIHNACHTSFEIERTAG', makeDate(year, 12, 26), ['ALL']), 255 | ]; 256 | } 257 | function addRegionalHolidays( 258 | year: number, 259 | region: Region, 260 | feiertageObjects: Holiday[], 261 | ) { 262 | if (region === 'AUGSBURG') { 263 | feiertageObjects.push( 264 | newHoliday('AUGSBURGER_FRIEDENSFEST', makeDate(year, 8, 8), ['AUGSBURG']), 265 | ); 266 | } 267 | } 268 | function addHeiligeDreiKoenige( 269 | year: number, 270 | region: Region, 271 | feiertageObjects: Holiday[], 272 | ): void { 273 | const validRegions: Region[] = ['BW', 'BY', 'AUGSBURG', 'ST']; 274 | if (validRegions.includes(region) || region === 'ALL') { 275 | feiertageObjects.push( 276 | newHoliday('HEILIGEDREIKOENIGE', makeDate(year, 1, 6), validRegions), 277 | ); 278 | } 279 | } 280 | 281 | function addEasterAndPfingsten( 282 | year: number, 283 | region: Region, 284 | easterDate: Date, 285 | pfingstsonntag: Date, 286 | feiertageObjects: Holiday[], 287 | ): void { 288 | const validRegions: Region[] = ['BB']; 289 | if (validRegions.includes(region) || region === 'ALL') { 290 | feiertageObjects.push( 291 | newHoliday('OSTERSONNTAG', easterDate, validRegions), 292 | newHoliday('PFINGSTSONNTAG', pfingstsonntag, validRegions), 293 | ); 294 | } 295 | } 296 | 297 | function addFronleichnam( 298 | region: Region, 299 | easterDate: Date, 300 | holidays: Holiday[], 301 | ): void { 302 | const validRegions: Region[] = ['BW', 'BY', 'AUGSBURG', 'HE', 'NW', 'RP', 'SL']; 303 | if (validRegions.includes(region) || region === 'ALL') { 304 | const fronleichnam = addDays(new Date(easterDate.getTime()), 60); 305 | holidays.push(newHoliday('FRONLEICHNAM', fronleichnam, validRegions)); 306 | } 307 | } 308 | 309 | function addMariaeHimmelfahrt( 310 | year: number, 311 | region: Region, 312 | holidays: Holiday[], 313 | ): void { 314 | const validRegions: Region[] = ['SL', 'BY', 'AUGSBURG']; 315 | 316 | if (validRegions.includes(region) || region === 'ALL') { 317 | holidays.push( 318 | newHoliday('MARIAHIMMELFAHRT', makeDate(year, 8, 15), validRegions), 319 | ); 320 | } 321 | } 322 | 323 | function addReformationstag( 324 | year: number, 325 | region: Region, 326 | holidays: Holiday[], 327 | ): void { 328 | const validRegions: Region[] = [ 329 | 'NI', 330 | 'BB', 331 | 'MV', 332 | 'SN', 333 | 'ST', 334 | 'TH', 335 | 'HB', 336 | 'HH', 337 | 'SH', 338 | ]; 339 | if (year === 2017 || validRegions.includes(region) || region === 'ALL') { 340 | holidays.push( 341 | newHoliday('REFORMATIONSTAG', makeDate(year, 10, 31), validRegions), 342 | ); 343 | } 344 | } 345 | 346 | function addAllerheiligen( 347 | year: number, 348 | region: Region, 349 | holidays: Holiday[], 350 | ): void { 351 | const validRegions: Region[] = ['BW', 'BY', 'NW', 'RP', 'SL', 'AUGSBURG']; 352 | if (validRegions.includes(region) || region === 'ALL') { 353 | holidays.push( 354 | newHoliday('ALLERHEILIGEN', makeDate(year, 11, 1), validRegions), 355 | ); 356 | } 357 | } 358 | 359 | function addBussUndBetttag( 360 | year: number, 361 | region: Region, 362 | holidays: Holiday[], 363 | ): void { 364 | const validRegions: Region[] = ['SN']; 365 | if (region === 'SN' || region === 'ALL') { 366 | // @todo write test 367 | const bussbettag = getBussBettag(year); 368 | holidays.push( 369 | newHoliday( 370 | 'BUBETAG', 371 | makeDate( 372 | bussbettag.getUTCFullYear(), 373 | bussbettag.getUTCMonth() + 1, 374 | bussbettag.getUTCDate(), 375 | ), 376 | validRegions, 377 | ), 378 | ); 379 | } 380 | } 381 | 382 | function addWeltkindertag( 383 | year: number, 384 | region: Region, 385 | holidays: Holiday[], 386 | ): void { 387 | if (year >= 2019 && (region === 'TH' || region === 'ALL')) { 388 | holidays.push(newHoliday('WELTKINDERTAG', makeDate(year, 9, 20), ['TH'])); 389 | } 390 | } 391 | 392 | function addWeltfrauenTag( 393 | year: number, 394 | region: Region, 395 | feiertageObjects: Holiday[], 396 | ): void { 397 | if (year <= 2018) { 398 | return; 399 | } 400 | if (region === 'BE' || region === 'ALL') { 401 | // in Berlin ist der Weltfrauentag ein Feiertag seit 2018 402 | feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8), ['MV', 'BE'])); 403 | } 404 | if (region === 'MV' && year >= 2023) { 405 | // in MV wird der Weltfrauentag erst ab 2023 eingeführt 406 | feiertageObjects.push(newHoliday('WELTFRAUENTAG', makeDate(year, 3, 8), ['MV', 'BE'])); 407 | } 408 | } 409 | 410 | /** 411 | * Calculates the Easter date of a given year. 412 | * @param year {number} 413 | * @returns {Date} Easter date 414 | * @private 415 | */ 416 | function getEasterDate(year: number): Date { 417 | const C = Math.floor(year / 100); 418 | // tslint:disable:binary-expression-operand-order 419 | // tslint generates false positives in the following blocks 420 | const N = year - 19 * Math.floor(year / 19); 421 | const K = Math.floor((C - 17) / 25); 422 | let I = C - Math.floor(C / 4) - Math.floor((C - K) / 3) + 19 * N + 15; 423 | I -= 30 * Math.floor(I / 30); 424 | I -= 425 | Math.floor(I / 28) * 426 | (1 - 427 | Math.floor(I / 28) * 428 | Math.floor(29 / (I + 1)) * 429 | Math.floor((21 - N) / 11)); 430 | let J = year + Math.floor(year / 4) + I + 2 - C + Math.floor(C / 4); 431 | J -= 7 * Math.floor(J / 7); 432 | const L = I - J; 433 | const M = 3 + Math.floor((L + 40) / 44); 434 | const D = L + 28 - 31 * Math.floor(M / 4); 435 | // tslint:enable:binary-expression-operand-order 436 | return new Date(year, M - 1, D); 437 | } 438 | 439 | /** 440 | * Computes the "Buss- und Bettag"'s date. 441 | * @param jahr {number} 442 | * @returns {Date} the year's "Buss- und Bettag" date 443 | * @private 444 | */ 445 | function getBussBettag(jahr: number): Date { 446 | const weihnachten = new Date(jahr, 11, 25, 12, 0, 0); 447 | const ersterAdventOffset = 32; 448 | let wochenTagOffset = weihnachten.getDay() % 7; 449 | 450 | if (wochenTagOffset === 0) { 451 | wochenTagOffset = 7; 452 | } 453 | 454 | const tageVorWeihnachten = wochenTagOffset + ersterAdventOffset; 455 | 456 | let bbtag = new Date(weihnachten.getTime()); 457 | bbtag = addDays(bbtag, -tageVorWeihnachten); 458 | 459 | return bbtag; 460 | } 461 | 462 | /** 463 | * Adds {@code days} days to the given {@link Date}. 464 | * @param date 465 | * @param days 466 | * @returns {Date} 467 | * @private 468 | */ 469 | function addDays(date: Date, days: number): Date { 470 | const changedDate = new Date(date); 471 | changedDate.setDate(date.getDate() + days); 472 | return changedDate; 473 | } 474 | 475 | /** 476 | * Creates a new {@link Date}. 477 | * @param year 478 | * @param naturalMonth month (1-12) 479 | * @param day 480 | * @returns {Date} 481 | * @private 482 | */ 483 | function makeDate(year: number, naturalMonth: number, day: number): Date { 484 | return new Date(year, naturalMonth - 1, day); 485 | } 486 | 487 | /** 488 | * 489 | * @param name 490 | * @param date 491 | * @returns {Holiday} 492 | * @private 493 | */ 494 | function newHoliday(name: HolidayType, date: Date, regions: Region[]): Holiday { 495 | if (regions.length === 1 && regions[0] === 'ALL') { 496 | regions = allRegions; 497 | } 498 | 499 | return { 500 | name, 501 | date, 502 | dateString: localeDateObjectToDateString(date), 503 | regions, 504 | trans(lang: string = currentLanguage): string | undefined { 505 | throw new Error('Method deprecated. Please replace trans() with translate(). This method will be removed in the next major release.'); 506 | }, 507 | translate(lang: string = currentLanguage): string | undefined { 508 | return lang === undefined || lang === null 509 | ? undefined 510 | : translations[lang][this.name]; 511 | }, 512 | getNormalizedDate(): number { 513 | return toUtcTimestamp(this.date); 514 | }, 515 | equals(otherDate: Date): boolean { 516 | const dateString = localeDateObjectToDateString(otherDate); 517 | return this.dateString === dateString; 518 | }, 519 | }; 520 | } 521 | 522 | /** 523 | * 524 | * @param date 525 | * @returns {string} 526 | * @private 527 | */ 528 | function localeDateObjectToDateString(date: Date): string { 529 | const normalizedDate = new Date( 530 | date.getTime() - date.getTimezoneOffset() * 60 * 1000, 531 | ); 532 | normalizedDate.setUTCHours(0, 0, 0, 0); 533 | return normalizedDate.toISOString().slice(0, 10); 534 | } 535 | 536 | /** 537 | * Returns the UTC timestamp of the given date with hours, minutes, seconds, and milliseconds set to zero. 538 | * @param date 539 | * @returns {number} UTC timestamp 540 | */ 541 | function toUtcTimestamp(date: Date): number { 542 | const internalDate = new Date(date); 543 | internalDate.setHours(0, 0, 0, 0); 544 | return internalDate.getTime(); 545 | } 546 | -------------------------------------------------------------------------------- /src/german-translations.ts: -------------------------------------------------------------------------------- 1 | import { TranslationTable } from './feiertage'; 2 | 3 | export const germanTranslations: TranslationTable = { 4 | NEUJAHRSTAG: 'Neujahrstag', 5 | HEILIGEDREIKOENIGE: 'Heilige Drei Könige', 6 | KARFREITAG: 'Karfreitag', 7 | OSTERSONNTAG: 'Ostersonntag', 8 | OSTERMONTAG: 'Ostermontag', 9 | TAG_DER_ARBEIT: 'Tag der Arbeit', 10 | CHRISTIHIMMELFAHRT: 'Christi Himmelfahrt', 11 | PFINGSTSONNTAG: 'Pfingstsonntag', 12 | PFINGSTMONTAG: 'Pfingstmontag', 13 | FRONLEICHNAM: 'Fronleichnam', 14 | MARIAHIMMELFAHRT: 'Mariä Himmelfahrt', 15 | DEUTSCHEEINHEIT: 'Tag der Deutschen Einheit', 16 | REFORMATIONSTAG: 'Reformationstag', 17 | ALLERHEILIGEN: 'Allerheiligen', 18 | BUBETAG: 'Buß- und Bettag', 19 | ERSTERWEIHNACHTSFEIERTAG: '1. Weihnachtstag', 20 | ZWEITERWEIHNACHTSFEIERTAG: '2. Weihnachtstag', 21 | WELTKINDERTAG: 'Weltkindertag', 22 | WELTFRAUENTAG: 'Weltfrauentag', 23 | AUGSBURGER_FRIEDENSFEST: 'Augsburger Friedensfest', 24 | }; 25 | -------------------------------------------------------------------------------- /src/holiday-type.ts: -------------------------------------------------------------------------------- 1 | export type HolidayType = 2 | | 'NEUJAHRSTAG' 3 | | 'HEILIGEDREIKOENIGE' 4 | | 'KARFREITAG' 5 | | 'OSTERSONNTAG' 6 | | 'OSTERMONTAG' 7 | | 'TAG_DER_ARBEIT' 8 | | 'CHRISTIHIMMELFAHRT' 9 | | 'MARIAHIMMELFAHRT' 10 | | 'PFINGSTSONNTAG' 11 | | 'PFINGSTMONTAG' 12 | | 'FRONLEICHNAM' 13 | | 'DEUTSCHEEINHEIT' 14 | | 'REFORMATIONSTAG' 15 | | 'ALLERHEILIGEN' 16 | | 'BUBETAG' 17 | | 'ERSTERWEIHNACHTSFEIERTAG' 18 | | 'ZWEITERWEIHNACHTSFEIERTAG' 19 | | 'WELTKINDERTAG' 20 | | 'WELTFRAUENTAG' 21 | | 'AUGSBURGER_FRIEDENSFEST'; 22 | 23 | export const allHolidays: HolidayType[] = [ 24 | 'NEUJAHRSTAG', 25 | 'HEILIGEDREIKOENIGE', 26 | 'KARFREITAG', 27 | 'OSTERSONNTAG', 28 | 'OSTERMONTAG', 29 | 'TAG_DER_ARBEIT', 30 | 'CHRISTIHIMMELFAHRT', 31 | 'MARIAHIMMELFAHRT', 32 | 'PFINGSTSONNTAG', 33 | 'PFINGSTMONTAG', 34 | 'FRONLEICHNAM', 35 | 'DEUTSCHEEINHEIT', 36 | 'REFORMATIONSTAG', 37 | 'ALLERHEILIGEN', 38 | 'BUBETAG', 39 | 'ERSTERWEIHNACHTSFEIERTAG', 40 | 'ZWEITERWEIHNACHTSFEIERTAG', 41 | 'WELTKINDERTAG', 42 | 'WELTFRAUENTAG', 43 | 'AUGSBURGER_FRIEDENSFEST', 44 | ]; 45 | -------------------------------------------------------------------------------- /src/holiday.ts: -------------------------------------------------------------------------------- 1 | import { Region } from '..'; 2 | import { HolidayType } from './holiday-type'; 3 | 4 | export type Holiday = { 5 | name: HolidayType; 6 | date: Date; 7 | dateString: string; 8 | regions: Region[]; 9 | 10 | // @deprecated 11 | trans(lang?: string): string | undefined; 12 | 13 | translate(lang?: string): string | undefined; 14 | equals(date: Date): boolean; 15 | getNormalizedDate(): number; 16 | 17 | }; 18 | -------------------------------------------------------------------------------- /src/regions.ts: -------------------------------------------------------------------------------- 1 | export type Region = 2 | | 'BW' // Baden-Württemberg 3 | | 'BY' // Bayern 4 | | 'BE' // Berlin 5 | | 'BB' // Brandenburg 6 | | 'HB' // Bremen 7 | | 'HE' // Hessen 8 | | 'HH' // Hamburg 9 | | 'MV' // Mecklenburg-Vorpommern 10 | | 'NI' // Niedersachsen 11 | | 'NW' // Nordrhein-Westfalen 12 | | 'RP' // Rheinland-Pfalz 13 | | 'SL' // Saarland 14 | | 'SN' // Sachsen 15 | | 'ST' // Sachsen-Anhalt 16 | | 'SH' // Schleswig-Holstein 17 | | 'TH' // Thüringen 18 | | 'BUND' // Gesamt-Deutschland 19 | // Custom regions with local holidays (incomplete) ! 20 | | 'AUGSBURG' 21 | | 'ALL'; 22 | 23 | export const allRegions: Region[] = [ 24 | 'BW', 25 | 'BY', 26 | 'BE', 27 | 'BB', 28 | 'HB', 29 | 'HE', 30 | 'HH', 31 | 'MV', 32 | 'NI', 33 | 'NW', 34 | 'RP', 35 | 'SL', 36 | 'SN', 37 | 'ST', 38 | 'SH', 39 | 'TH', 40 | 'BUND', 41 | 'AUGSBURG', 42 | 'ALL', 43 | ]; 44 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "noEmit": true, 5 | "target": "es2016", 6 | "strict": true, 7 | "noUnusedLocals": true, 8 | "moduleResolution": "Node" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | // vite.config.ts 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | test: { 6 | coverage: { 7 | reporter: ['text', 'lcov', 'html'], 8 | }, 9 | }, 10 | }); 11 | --------------------------------------------------------------------------------