diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..651c54d0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# .editorconfig +root = true + +[*] +indent_style = space +indent_size = 2 +max_line_length = 160 + +[*.{js,ts}] +ij_typescript_spaces_within_imports = true diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..27f11151 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,49 @@ +module.exports = { + root: true, + env: { + browser: false, + es6: true, + node: true, + jest: true, + }, + extends: [ + 'eslint:recommended' + ], + ignorePatterns: [ + 'dist/**', + '**/*.json', + 'coverage/**', + 'docs/**', + 'src/index.cjs.js', + ], + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + overrides: [ + { + files: ['**/*.ts'], + env: { 'browser': false, 'es6': true, 'node': true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended' + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2022, + sourceType: 'module', + }, + plugins: ['@typescript-eslint'], + rules: { + indent: ['error', 2, { SwitchCase: 1 }], + quotes: ['error', 'single'], + semi: ['error', 'always'], + 'comma-dangle': ['error', 'always-multiline'], + '@typescript-eslint/no-explicit-any': 0, + 'object-curly-spacing': ['warn', 'always'], + 'max-len': ['error', { code: 160 }], + } + } + ] +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 305aa896..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "rules": { - "eol-last": ["error", "always"], - "quotes": ["error", "single"], - "semi": ["error", "always"] - }, - "overrides": [ - { - "files": ["test/**.js"], - "parserOptions": { - "ecmaVersion": 6 - } - } - ] -} diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 98b5b371..6ddb0394 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 15.x, 16.x, 17.x, 18.x, 19.x] + node-version: [15.14.x, 16.x, 17.x, 18.x, 19.x] steps: - uses: actions/checkout@v3 @@ -22,4 +22,5 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm ci + - run: npm run build - run: npm test diff --git a/.gitignore b/.gitignore index c4c43b37..e2efcaad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -node_modules/ +node_modules lib-cov coverage *.seed @@ -12,10 +12,14 @@ coverage pids logs results +dist +testing -npm-debug.log - +.run .idea .history .vscode .nyc_output +yarn.lock + +!coverage/*.svg diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..3e1cef88 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npm run precommit diff --git a/.npmignore b/.npmignore index cdabd3fe..17f9dff2 100644 --- a/.npmignore +++ b/.npmignore @@ -3,3 +3,17 @@ .history .nyc_output node_modules +src +tsconfig.json +package-lock.json +yarn.lock +.github +docs +.run +.husky +tests +.editorconfig +.eslintrc.cjs +.gitignore +component.json +jest.config.js diff --git a/README.md b/README.md index 6c2aadad..18b84dcd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,15 @@ cron-parser ================ [![Build Status](https://github.com/harrisiirak/cron-parser/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/harrisiirak/cron-parser/actions/workflows/push.yml) -[![NPM version](https://badge.fury.io/js/cron-parser.png)](http://badge.fury.io/js/cron-parser) +[![NPM version](https://badge.fury.io/js/cron-parser.png)](http://badge.fury.io/js/cron-parser)![Statements](./coverage/badge-statements.svg) + +[//]: # (![Branches](./coverage/badge-branches.svg)) + +[//]: # (![Functions](./coverage/badge-functions.svg)) + +[//]: # (![Lines](./coverage/badge-lines.svg)) + + Node.js library for parsing and manipulating crontab instructions. It includes support for timezones and DST transitions. @@ -111,21 +119,42 @@ try { } ``` -Manipulation +Manipulation ```javascript var parser = require('cron-parser'); var interval = parser.parseExpression('0 7 * * 0-4'); -var fields = JSON.parse(JSON.stringify(interval.fields)); // Fields is immutable +var fields = JSON.parse(JSON.stringify(interval.#fields)); // Fields is immutable fields.hour = [8]; fields.minute = [29]; -fields.dayOfWeek = [1,3,4,5,6,7]; +fields.dayOfWeek = [1, 3, 4, 5, 6, 7]; var modifiedInterval = parser.fieldsToExpression(fields); var cronString = modifiedInterval.stringify(); console.log(cronString); // "29 8 * * 1,3-7" ``` +Strict Mode + +In several implementations of CRON, it's ambiguous to specify both the Day Of Month and Day Of Week parameters simultaneously, as it's unclear which one should take precedence. Despite this ambiguity, this library allows both parameters to be set by default, although the resultant behavior might not align with your expectations. + +To resolve this ambiguity, you can activate the strict mode of the library. In strict mode, the library prevents the simultaneous setting of both Day Of Month and Day Of Week, effectively serving as a validation method for user inputs. To enable strict mode, set the `options.strict` flag to true. + +Consider the example below: + +```javascript +// Specifies a schedule that occurs at 12:00 on every day-of-month from 1 through 31 and on Monday. +const options = { + currentDate: new CronDate('Mon, 12 Sep 2022 14:00:00', 'UTC'), + strict: true, +}; +const expression = '0 0 12 1-31 * 1'; +// With strict mode enabled, the parser throws an error as both dayOfMonth and dayOfWeek are used together. +CronExpression.parse(expression, options); // throws: Cannot use both dayOfMonth and dayOfWeek together in strict mode! +``` + +In this example, the CRON expression is meant to trigger an event at 12:00 on every day from the 1st through the 31st and on every Monday. However, since strict mode is enabled in the options, an error is thrown, indicating that both the dayOfMonth and dayOfWeek parameters cannot be used together. + Options ======== @@ -145,7 +174,7 @@ The reason being that those are the formats accepted by the [`luxon`](https://moment.github.io/luxon/) library which is being used to handle dates. Using `Date` as an input can be problematic specially when using the `tz` option. The issue being that, when creating a new `Date` object without -any timezone information, it will be created in the timezone of the system that is running the code. This (most of times) won't be what the user +any timezone information, it will be created in the timezone of the system that is running the code. This (most of the times) won't be what the user will be expecting. Using one of the supported `string` formats will solve the issue(see timezone example). * *iterator* - Return ES6 compatible iterator object diff --git a/coverage/badge-branches.svg b/coverage/badge-branches.svg new file mode 100644 index 00000000..5290514e --- /dev/null +++ b/coverage/badge-branches.svg @@ -0,0 +1 @@ +Coverage: 99.65%Coverage99.65% \ No newline at end of file diff --git a/coverage/badge-functions.svg b/coverage/badge-functions.svg new file mode 100644 index 00000000..5bb55be2 --- /dev/null +++ b/coverage/badge-functions.svg @@ -0,0 +1 @@ +Coverage: 100%Coverage100% \ No newline at end of file diff --git a/coverage/badge-lines.svg b/coverage/badge-lines.svg new file mode 100644 index 00000000..5bb55be2 --- /dev/null +++ b/coverage/badge-lines.svg @@ -0,0 +1 @@ +Coverage: 100%Coverage100% \ No newline at end of file diff --git a/coverage/badge-statements.svg b/coverage/badge-statements.svg new file mode 100644 index 00000000..5bb55be2 --- /dev/null +++ b/coverage/badge-statements.svg @@ -0,0 +1 @@ +Coverage: 100%Coverage100% \ No newline at end of file diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 00000000..e2ac6616 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 00000000..428e6113 --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,71 @@ +:root { + --light-hl-0: #0000FF; + --dark-hl-0: #569CD6; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #0070C1; + --dark-hl-2: #4FC1FF; + --light-hl-3: #795E26; + --dark-hl-3: #DCDCAA; + --light-hl-4: #001080; + --dark-hl-4: #9CDCFE; + --light-hl-5: #098658; + --dark-hl-5: #B5CEA8; + --light-hl-6: #008000; + --dark-hl-6: #6A9955; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 00000000..4bd47a25 --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,58 @@ +"use strict"; +"use strict";(()=>{var Se=Object.create;var re=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var ke=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var Pe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Ie=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Te(e))!Qe.call(t,i)&&i!==r&&re(t,i,{get:()=>e[i],enumerable:!(n=we(e,i))||n.enumerable});return t};var Ce=(t,e,r)=>(r=t!=null?Se(ke(t)):{},Ie(e||!t||!t.__esModule?re(r,"default",{value:t,enumerable:!0}):r,t));var ae=Pe((se,oe)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var d=t.utils.clone(r)||{};d.position=[a,u],d.index=s.length,s.push(new t.Token(n.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(r+=n[u+1]*i[d+1],u+=2,d+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),y;m in s.node.edges?y=s.node.edges[m]:(y=new t.TokenSet,s.node.edges[m]=y),s.str.length==1&&(y.final=!0),i.push({node:y,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof se=="object"?oe.exports=r():e.lunr=r()}(this,function(){return t})})()});var ne=[];function G(t,e){ne.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;this.createComponents(document.body),this.ensureActivePageVisible(),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible())}createComponents(e){ne.forEach(r=>{e.querySelectorAll(r.selector).forEach(n=>{n.dataset.hasInstance||(new r.constructor({el:n,app:this}),n.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),r=e?.parentElement;for(;r&&!r.classList.contains(".tsd-navigation");)r instanceof HTMLDetailsElement&&(r.open=!0),r=r.parentElement;if(e){let n=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=n}}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let r=e.parentElement;for(;r&&r.tagName!=="SECTION";)r=r.parentElement;if(r&&r.offsetParent==null){this.alwaysVisibleMember=r,r.classList.add("always-visible");let n=document.createElement("p");n.classList.add("warning"),n.textContent="This member is normally hidden due to your filter settings.",r.prepend(n)}}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let r;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent="Copied!",e.classList.add("visible"),clearTimeout(r),r=setTimeout(()=>{e.classList.remove("visible"),r=setTimeout(()=>{e.textContent="Copy"},100)},1e3)})})}};var ie=(t,e=100)=>{let r;return()=>{clearTimeout(r),r=setTimeout(()=>t(),e)}};var ce=Ce(ae());function de(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("tsd-search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let r=document.querySelector("#tsd-search input"),n=document.querySelector("#tsd-search .results");if(!r||!n)throw new Error("The input field or the result list wrapper was not found");let i=!1;n.addEventListener("mousedown",()=>i=!0),n.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Oe(t,n,r,s)}function Oe(t,e,r,n){r.addEventListener("input",ie(()=>{Re(t,e,r,n)},200));let i=!1;r.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Fe(e,r):s.key=="Escape"?r.blur():s.key=="ArrowUp"?ue(e,-1):s.key==="ArrowDown"?ue(e,1):i=!1}),r.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!r.matches(":focus")&&s.key==="/"&&(r.focus(),s.preventDefault())})}function _e(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=ce.Index.load(window.searchData.index))}function Re(t,e,r,n){if(_e(n,t),!n.index||!n.data)return;e.textContent="";let i=r.value.trim(),s=i?n.index.search(`*${i}*`):[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o${le(l.parent,i)}.${u}`);let d=document.createElement("li");d.classList.value=l.classes??"";let m=document.createElement("a");m.href=n.base+l.url,m.innerHTML=u,d.append(m),e.appendChild(d)}}function ue(t,e){let r=t.querySelector(".current");if(!r)r=t.querySelector(e==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let n=r;if(e===1)do n=n.nextElementSibling??void 0;while(n instanceof HTMLElement&&n.offsetParent==null);else do n=n.previousElementSibling??void 0;while(n instanceof HTMLElement&&n.offsetParent==null);n&&(r.classList.remove("current"),n.classList.add("current"))}}function Fe(t,e){let r=t.querySelector(".current");if(r||(r=t.querySelector("li:first-child")),r){let n=r.querySelector("a");n&&(window.location.href=n.href),e.blur()}}function le(t,e){if(e==="")return t;let r=t.toLocaleLowerCase(),n=e.toLocaleLowerCase(),i=[],s=0,o=r.indexOf(n);for(;o!=-1;)i.push(K(t.substring(s,o)),`${K(t.substring(o,o+n.length))}`),s=o+n.length,o=r.indexOf(n,s);return i.push(K(t.substring(s))),i.join("")}var Me={"&":"&","<":"<",">":">","'":"'",'"':"""};function K(t){return t.replace(/[&<>"'"]/g,e=>Me[e])}var P=class{constructor(e){this.el=e.el,this.app=e.app}};var M="mousedown",fe="mousemove",N="mouseup",J={x:0,y:0},he=!1,ee=!1,De=!1,D=!1,pe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(pe?"is-mobile":"not-mobile");pe&&"ontouchstart"in document.documentElement&&(De=!0,M="touchstart",fe="touchmove",N="touchend");document.addEventListener(M,t=>{ee=!0,D=!1;let e=M=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(fe,t=>{if(ee&&!D){let e=M=="touchstart"?t.targetTouches[0]:t,r=J.x-(e.pageX||0),n=J.y-(e.pageY||0);D=Math.sqrt(r*r+n*n)>10}});document.addEventListener(N,()=>{ee=!1});document.addEventListener("click",t=>{he&&(t.preventDefault(),t.stopImmediatePropagation(),he=!1)});var X=class extends P{constructor(r){super(r);this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(M,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,n=>this.onDocumentPointerUp(n))}setActive(r){if(this.active==r)return;this.active=r,document.documentElement.classList.toggle("has-"+this.className,r),this.el.classList.toggle("active",r);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(r){D||(this.setActive(!0),r.preventDefault())}onDocumentPointerDown(r){if(this.active){if(r.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(r){if(!D&&this.active&&r.target.closest(".col-sidebar")){let n=r.target.closest("a");if(n){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substring(0,i.indexOf("#"))),n.href.substring(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var te;try{te=localStorage}catch{te={getItem(){return null},setItem(){}}}var Q=te;var me=document.head.appendChild(document.createElement("style"));me.dataset.for="filters";var Y=class extends P{constructor(r){super(r);this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),me.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`}fromLocalStorage(){let r=Q.getItem(this.key);return r?r==="true":this.el.checked}setLocalStorage(r){Q.setItem(this.key,r.toString()),this.value=r,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let n=Array.from(r.querySelectorAll(".tsd-index-link")).every(i=>i.offsetParent==null);r.style.display=n?"none":"block"})}};var Z=class extends P{constructor(r){super(r);this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update()),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function ve(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,ye(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),ye(t.value)})}function ye(t){document.documentElement.dataset.theme=t}de();G(X,"a[data-toggle]");G(Z,".tsd-index-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var ge=document.getElementById("tsd-theme");ge&&ve(ge);var Ae=new U;Object.defineProperty(window,"app",{value:Ae});})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/assets/search.js b/docs/assets/search.js new file mode 100644 index 00000000..f6433e4c --- /dev/null +++ b/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = JSON.parse("{\"rows\":[{\"kind\":128,\"name\":\"CronFieldCollection\",\"url\":\"classes/CronFieldCollection.html\",\"classes\":\"\"},{\"kind\":2048,\"name\":\"compactField\",\"url\":\"classes/CronFieldCollection.html#compactField\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":2048,\"name\":\"#handleMaxDaysInMonth\",\"url\":\"classes/CronFieldCollection.html#_handleMaxDaysInMonth\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":2048,\"name\":\"#handleSingleRange\",\"url\":\"classes/CronFieldCollection.html#_handleSingleRange\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":2048,\"name\":\"#handleMultipleRanges\",\"url\":\"classes/CronFieldCollection.html#_handleMultipleRanges\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronFieldCollection.html#constructor\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":1024,\"name\":\"#second\",\"url\":\"classes/CronFieldCollection.html#_second\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":1024,\"name\":\"#minute\",\"url\":\"classes/CronFieldCollection.html#_minute\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":1024,\"name\":\"#hour\",\"url\":\"classes/CronFieldCollection.html#_hour\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":1024,\"name\":\"#dayOfMonth\",\"url\":\"classes/CronFieldCollection.html#_dayOfMonth\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":1024,\"name\":\"#month\",\"url\":\"classes/CronFieldCollection.html#_month\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":1024,\"name\":\"#dayOfWeek\",\"url\":\"classes/CronFieldCollection.html#_dayOfWeek\",\"classes\":\"tsd-is-private\",\"parent\":\"CronFieldCollection\"},{\"kind\":262144,\"name\":\"second\",\"url\":\"classes/CronFieldCollection.html#second\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":262144,\"name\":\"minute\",\"url\":\"classes/CronFieldCollection.html#minute\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":262144,\"name\":\"hour\",\"url\":\"classes/CronFieldCollection.html#hour\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":262144,\"name\":\"dayOfMonth\",\"url\":\"classes/CronFieldCollection.html#dayOfMonth\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":262144,\"name\":\"month\",\"url\":\"classes/CronFieldCollection.html#month\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":262144,\"name\":\"dayOfWeek\",\"url\":\"classes/CronFieldCollection.html#dayOfWeek\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":2048,\"name\":\"stringifyField\",\"url\":\"classes/CronFieldCollection.html#stringifyField\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":2048,\"name\":\"stringify\",\"url\":\"classes/CronFieldCollection.html#stringify\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronFieldCollection.html#serialize\",\"classes\":\"\",\"parent\":\"CronFieldCollection\"},{\"kind\":128,\"name\":\"CronParser\",\"url\":\"classes/CronParser.html\",\"classes\":\"\"},{\"kind\":2048,\"name\":\"parseExpression\",\"url\":\"classes/CronParser.html#parseExpression\",\"classes\":\"\",\"parent\":\"CronParser\"},{\"kind\":2048,\"name\":\"fieldsToExpression\",\"url\":\"classes/CronParser.html#fieldsToExpression\",\"classes\":\"\",\"parent\":\"CronParser\"},{\"kind\":2048,\"name\":\"parseString\",\"url\":\"classes/CronParser.html#parseString\",\"classes\":\"\",\"parent\":\"CronParser\"},{\"kind\":2048,\"name\":\"parseFile\",\"url\":\"classes/CronParser.html#parseFile\",\"classes\":\"\",\"parent\":\"CronParser\"},{\"kind\":2048,\"name\":\"#parseEntry\",\"url\":\"classes/CronParser.html#_parseEntry\",\"classes\":\"tsd-is-private\",\"parent\":\"CronParser\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronParser.html#constructor\",\"classes\":\"\",\"parent\":\"CronParser\"},{\"kind\":128,\"name\":\"CronDate\",\"url\":\"classes/CronDate.html\",\"classes\":\"\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronDate.html#constructor\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":1024,\"name\":\"#date\",\"url\":\"classes/CronDate.html#_date\",\"classes\":\"tsd-is-private\",\"parent\":\"CronDate\"},{\"kind\":1024,\"name\":\"#dstStart\",\"url\":\"classes/CronDate.html#_dstStart\",\"classes\":\"tsd-is-private\",\"parent\":\"CronDate\"},{\"kind\":1024,\"name\":\"#dstEnd\",\"url\":\"classes/CronDate.html#_dstEnd\",\"classes\":\"tsd-is-private\",\"parent\":\"CronDate\"},{\"kind\":262144,\"name\":\"dstStart\",\"url\":\"classes/CronDate.html#dstStart\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":262144,\"name\":\"dstEnd\",\"url\":\"classes/CronDate.html#dstEnd\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addYear\",\"url\":\"classes/CronDate.html#addYear\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addMonth\",\"url\":\"classes/CronDate.html#addMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addDay\",\"url\":\"classes/CronDate.html#addDay\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addHour\",\"url\":\"classes/CronDate.html#addHour\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addMinute\",\"url\":\"classes/CronDate.html#addMinute\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addSecond\",\"url\":\"classes/CronDate.html#addSecond\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractYear\",\"url\":\"classes/CronDate.html#subtractYear\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractMonth\",\"url\":\"classes/CronDate.html#subtractMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractDay\",\"url\":\"classes/CronDate.html#subtractDay\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractHour\",\"url\":\"classes/CronDate.html#subtractHour\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractMinute\",\"url\":\"classes/CronDate.html#subtractMinute\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractSecond\",\"url\":\"classes/CronDate.html#subtractSecond\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"addUnit\",\"url\":\"classes/CronDate.html#addUnit\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"subtractUnit\",\"url\":\"classes/CronDate.html#subtractUnit\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"invokeDateOperation\",\"url\":\"classes/CronDate.html#invokeDateOperation\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getDate\",\"url\":\"classes/CronDate.html#getDate\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getFullYear\",\"url\":\"classes/CronDate.html#getFullYear\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getDay\",\"url\":\"classes/CronDate.html#getDay\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getMonth\",\"url\":\"classes/CronDate.html#getMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getHours\",\"url\":\"classes/CronDate.html#getHours\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getMinutes\",\"url\":\"classes/CronDate.html#getMinutes\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getSeconds\",\"url\":\"classes/CronDate.html#getSeconds\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getMilliseconds\",\"url\":\"classes/CronDate.html#getMilliseconds\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getTime\",\"url\":\"classes/CronDate.html#getTime\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCDate\",\"url\":\"classes/CronDate.html#getUTCDate\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCFullYear\",\"url\":\"classes/CronDate.html#getUTCFullYear\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCDay\",\"url\":\"classes/CronDate.html#getUTCDay\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCMonth\",\"url\":\"classes/CronDate.html#getUTCMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCHours\",\"url\":\"classes/CronDate.html#getUTCHours\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCMinutes\",\"url\":\"classes/CronDate.html#getUTCMinutes\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"getUTCSeconds\",\"url\":\"classes/CronDate.html#getUTCSeconds\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"toISOString\",\"url\":\"classes/CronDate.html#toISOString\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"toJSON\",\"url\":\"classes/CronDate.html#toJSON\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setDate\",\"url\":\"classes/CronDate.html#setDate\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setFullYear\",\"url\":\"classes/CronDate.html#setFullYear\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setDay\",\"url\":\"classes/CronDate.html#setDay\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setMonth\",\"url\":\"classes/CronDate.html#setMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setHours\",\"url\":\"classes/CronDate.html#setHours\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setMinutes\",\"url\":\"classes/CronDate.html#setMinutes\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setSeconds\",\"url\":\"classes/CronDate.html#setSeconds\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"setMilliseconds\",\"url\":\"classes/CronDate.html#setMilliseconds\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"toString\",\"url\":\"classes/CronDate.html#toString\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"toDate\",\"url\":\"classes/CronDate.html#toDate\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"isLastDayOfMonth\",\"url\":\"classes/CronDate.html#isLastDayOfMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"isLastWeekdayOfMonth\",\"url\":\"classes/CronDate.html#isLastWeekdayOfMonth\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"applyDateOperation\",\"url\":\"classes/CronDate.html#applyDateOperation\",\"classes\":\"\",\"parent\":\"CronDate\"},{\"kind\":2048,\"name\":\"#getUTC\",\"url\":\"classes/CronDate.html#_getUTC\",\"classes\":\"tsd-is-private\",\"parent\":\"CronDate\"},{\"kind\":128,\"name\":\"CronDayOfMonth\",\"url\":\"classes/CronDayOfMonth.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronDayOfMonth.html#min-2\",\"classes\":\"\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronDayOfMonth.html#max-2\",\"classes\":\"\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronDayOfMonth.html#chars-2\",\"classes\":\"\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronDayOfMonth.html#validChars\",\"classes\":\"\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronDayOfMonth.html#constraints\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronDayOfMonth.html#sorter\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronDayOfMonth.html#constructor\",\"classes\":\"\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronDayOfMonth.html#values\",\"classes\":\"\",\"parent\":\"CronDayOfMonth\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronDayOfMonth.html#_wildcard\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronDayOfMonth.html#_values\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronDayOfMonth.html#min\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronDayOfMonth.html#max\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronDayOfMonth.html#chars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronDayOfMonth.html#isWildcard\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronDayOfMonth.html#serialize\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronDayOfMonth.html#validate\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfMonth\"},{\"kind\":128,\"name\":\"CronDayOfTheWeek\",\"url\":\"classes/CronDayOfTheWeek.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronDayOfTheWeek.html#min-2\",\"classes\":\"\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronDayOfTheWeek.html#max-2\",\"classes\":\"\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronDayOfTheWeek.html#chars-2\",\"classes\":\"\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronDayOfTheWeek.html#validChars\",\"classes\":\"\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronDayOfTheWeek.html#constraints\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronDayOfTheWeek.html#sorter\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronDayOfTheWeek.html#constructor\",\"classes\":\"\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronDayOfTheWeek.html#values\",\"classes\":\"\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronDayOfTheWeek.html#_wildcard\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronDayOfTheWeek.html#_values\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronDayOfTheWeek.html#min\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronDayOfTheWeek.html#max\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronDayOfTheWeek.html#chars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronDayOfTheWeek.html#isWildcard\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronDayOfTheWeek.html#serialize\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronDayOfTheWeek.html#validate\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronDayOfTheWeek\"},{\"kind\":128,\"name\":\"CronField\",\"url\":\"classes/CronField.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronField.html#min-2\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronField.html#max-2\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronField.html#chars-2\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronField.html#validChars\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronField.html#constraints\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronField.html#sorter\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronField.html#constructor\",\"classes\":\"tsd-is-protected\",\"parent\":\"CronField\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronField.html#_wildcard\",\"classes\":\"tsd-is-private\",\"parent\":\"CronField\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronField.html#_values\",\"classes\":\"tsd-is-private\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronField.html#min\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronField.html#max\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronField.html#chars\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronField.html#isWildcard\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronField.html#values\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronField.html#serialize\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronField.html#validate\",\"classes\":\"\",\"parent\":\"CronField\"},{\"kind\":128,\"name\":\"CronHour\",\"url\":\"classes/CronHour.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronHour.html#min-2\",\"classes\":\"\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronHour.html#max-2\",\"classes\":\"\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronHour.html#chars-2\",\"classes\":\"\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronHour.html#validChars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronHour.html#constraints\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronHour.html#sorter\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronHour.html#constructor\",\"classes\":\"\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronHour.html#values\",\"classes\":\"\",\"parent\":\"CronHour\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronHour.html#_wildcard\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronHour.html#_values\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronHour.html#min\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronHour.html#max\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronHour.html#chars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronHour.html#isWildcard\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronHour.html#serialize\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronHour.html#validate\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronHour\"},{\"kind\":128,\"name\":\"CronMinute\",\"url\":\"classes/CronMinute.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronMinute.html#min-2\",\"classes\":\"\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronMinute.html#max-2\",\"classes\":\"\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronMinute.html#chars-2\",\"classes\":\"\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronMinute.html#validChars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronMinute.html#constraints\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronMinute.html#sorter\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronMinute.html#constructor\",\"classes\":\"\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronMinute.html#values\",\"classes\":\"\",\"parent\":\"CronMinute\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronMinute.html#_wildcard\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronMinute.html#_values\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronMinute.html#min\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronMinute.html#max\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronMinute.html#chars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronMinute.html#isWildcard\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronMinute.html#serialize\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronMinute.html#validate\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMinute\"},{\"kind\":128,\"name\":\"CronMonth\",\"url\":\"classes/CronMonth.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronMonth.html#min-2\",\"classes\":\"\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronMonth.html#max-2\",\"classes\":\"\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronMonth.html#chars-2\",\"classes\":\"\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"daysInMonth\",\"url\":\"classes/CronMonth.html#daysInMonth\",\"classes\":\"\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronMonth.html#validChars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronMonth.html#constraints\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronMonth.html#sorter\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronMonth.html#constructor\",\"classes\":\"\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronMonth.html#values\",\"classes\":\"\",\"parent\":\"CronMonth\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronMonth.html#_wildcard\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronMonth.html#_values\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronMonth.html#min\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronMonth.html#max\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronMonth.html#chars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronMonth.html#isWildcard\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronMonth.html#serialize\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronMonth.html#validate\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronMonth\"},{\"kind\":128,\"name\":\"CronSecond\",\"url\":\"classes/CronSecond.html\",\"classes\":\"\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronSecond.html#min-2\",\"classes\":\"\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronSecond.html#max-2\",\"classes\":\"\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronSecond.html#chars-2\",\"classes\":\"\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"validChars\",\"url\":\"classes/CronSecond.html#validChars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"constraints\",\"url\":\"classes/CronSecond.html#constraints\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":2048,\"name\":\"sorter\",\"url\":\"classes/CronSecond.html#sorter\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronSecond.html#constructor\",\"classes\":\"\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"values\",\"url\":\"classes/CronSecond.html#values\",\"classes\":\"\",\"parent\":\"CronSecond\"},{\"kind\":1024,\"name\":\"#wildcard\",\"url\":\"classes/CronSecond.html#_wildcard\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":1024,\"name\":\"#values\",\"url\":\"classes/CronSecond.html#_values\",\"classes\":\"tsd-is-private tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"min\",\"url\":\"classes/CronSecond.html#min\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"max\",\"url\":\"classes/CronSecond.html#max\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"chars\",\"url\":\"classes/CronSecond.html#chars\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":262144,\"name\":\"isWildcard\",\"url\":\"classes/CronSecond.html#isWildcard\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":2048,\"name\":\"serialize\",\"url\":\"classes/CronSecond.html#serialize\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":2048,\"name\":\"validate\",\"url\":\"classes/CronSecond.html#validate\",\"classes\":\"tsd-is-inherited\",\"parent\":\"CronSecond\"},{\"kind\":128,\"name\":\"CronExpression\",\"url\":\"classes/CronExpression.html\",\"classes\":\"\"},{\"kind\":2048,\"name\":\"parse\",\"url\":\"classes/CronExpression.html#parse\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"fieldsToExpression\",\"url\":\"classes/CronExpression.html#fieldsToExpression\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"#matchSchedule\",\"url\":\"classes/CronExpression.html#_matchSchedule\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"#isLInExpressions\",\"url\":\"classes/CronExpression.html#_isLInExpressions\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"#isLastWeekdayOfMonthMatch\",\"url\":\"classes/CronExpression.html#_isLastWeekdayOfMonthMatch\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/CronExpression.html#constructor\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#options\",\"url\":\"classes/CronExpression.html#_options\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#tz\",\"url\":\"classes/CronExpression.html#_tz\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#currentDate\",\"url\":\"classes/CronExpression.html#_currentDate\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#startDate\",\"url\":\"classes/CronExpression.html#_startDate\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#endDate\",\"url\":\"classes/CronExpression.html#_endDate\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#isIterator\",\"url\":\"classes/CronExpression.html#_isIterator\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#hasIterated\",\"url\":\"classes/CronExpression.html#_hasIterated\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#nthDayOfWeek\",\"url\":\"classes/CronExpression.html#_nthDayOfWeek\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":1024,\"name\":\"#fields\",\"url\":\"classes/CronExpression.html#_fields\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":262144,\"name\":\"fields\",\"url\":\"classes/CronExpression.html#fields\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"next\",\"url\":\"classes/CronExpression.html#next\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"prev\",\"url\":\"classes/CronExpression.html#prev\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"hasNext\",\"url\":\"classes/CronExpression.html#hasNext\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"hasPrev\",\"url\":\"classes/CronExpression.html#hasPrev\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"iterate\",\"url\":\"classes/CronExpression.html#iterate\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"reset\",\"url\":\"classes/CronExpression.html#reset\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"stringify\",\"url\":\"classes/CronExpression.html#stringify\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"includesDate\",\"url\":\"classes/CronExpression.html#includesDate\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"toString\",\"url\":\"classes/CronExpression.html#toString\",\"classes\":\"\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"#matchDayOfMonth\",\"url\":\"classes/CronExpression.html#_matchDayOfMonth\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"#matchHour\",\"url\":\"classes/CronExpression.html#_matchHour\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":2048,\"name\":\"#findSchedule\",\"url\":\"classes/CronExpression.html#_findSchedule\",\"classes\":\"tsd-is-private\",\"parent\":\"CronExpression\"},{\"kind\":8,\"name\":\"DateMathOp\",\"url\":\"enums/DateMathOp.html\",\"classes\":\"\"},{\"kind\":16,\"name\":\"Add\",\"url\":\"enums/DateMathOp.html#Add\",\"classes\":\"\",\"parent\":\"DateMathOp\"},{\"kind\":16,\"name\":\"Subtract\",\"url\":\"enums/DateMathOp.html#Subtract\",\"classes\":\"\",\"parent\":\"DateMathOp\"},{\"kind\":8,\"name\":\"TimeUnit\",\"url\":\"enums/TimeUnit.html\",\"classes\":\"\"},{\"kind\":16,\"name\":\"Second\",\"url\":\"enums/TimeUnit.html#Second\",\"classes\":\"\",\"parent\":\"TimeUnit\"},{\"kind\":16,\"name\":\"Minute\",\"url\":\"enums/TimeUnit.html#Minute\",\"classes\":\"\",\"parent\":\"TimeUnit\"},{\"kind\":16,\"name\":\"Hour\",\"url\":\"enums/TimeUnit.html#Hour\",\"classes\":\"\",\"parent\":\"TimeUnit\"},{\"kind\":16,\"name\":\"Day\",\"url\":\"enums/TimeUnit.html#Day\",\"classes\":\"\",\"parent\":\"TimeUnit\"},{\"kind\":16,\"name\":\"Month\",\"url\":\"enums/TimeUnit.html#Month\",\"classes\":\"\",\"parent\":\"TimeUnit\"},{\"kind\":16,\"name\":\"Year\",\"url\":\"enums/TimeUnit.html#Year\",\"classes\":\"\",\"parent\":\"TimeUnit\"},{\"kind\":8,\"name\":\"DayOfWeek\",\"url\":\"enums/DayOfWeek.html\",\"classes\":\"\"},{\"kind\":16,\"name\":\"sun\",\"url\":\"enums/DayOfWeek.html#sun\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":16,\"name\":\"mon\",\"url\":\"enums/DayOfWeek.html#mon\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":16,\"name\":\"tue\",\"url\":\"enums/DayOfWeek.html#tue\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":16,\"name\":\"wed\",\"url\":\"enums/DayOfWeek.html#wed\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":16,\"name\":\"thu\",\"url\":\"enums/DayOfWeek.html#thu\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":16,\"name\":\"fri\",\"url\":\"enums/DayOfWeek.html#fri\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":16,\"name\":\"sat\",\"url\":\"enums/DayOfWeek.html#sat\",\"classes\":\"\",\"parent\":\"DayOfWeek\"},{\"kind\":8,\"name\":\"PredefinedExpressions\",\"url\":\"enums/PredefinedExpressions.html\",\"classes\":\"\"},{\"kind\":16,\"name\":\"@yearly\",\"url\":\"enums/PredefinedExpressions.html#_yearly\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@annually\",\"url\":\"enums/PredefinedExpressions.html#_annually\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@monthly\",\"url\":\"enums/PredefinedExpressions.html#_monthly\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@weekly\",\"url\":\"enums/PredefinedExpressions.html#_weekly\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@daily\",\"url\":\"enums/PredefinedExpressions.html#_daily\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@hourly\",\"url\":\"enums/PredefinedExpressions.html#_hourly\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@minutely\",\"url\":\"enums/PredefinedExpressions.html#_minutely\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@secondly\",\"url\":\"enums/PredefinedExpressions.html#_secondly\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@weekdays\",\"url\":\"enums/PredefinedExpressions.html#_weekdays\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":16,\"name\":\"@weekends\",\"url\":\"enums/PredefinedExpressions.html#_weekends\",\"classes\":\"\",\"parent\":\"PredefinedExpressions\"},{\"kind\":256,\"name\":\"CronFieldCollectionOptions\",\"url\":\"interfaces/CronFieldCollectionOptions.html\",\"classes\":\"\"},{\"kind\":1024,\"name\":\"second\",\"url\":\"interfaces/CronFieldCollectionOptions.html#second\",\"classes\":\"\",\"parent\":\"CronFieldCollectionOptions\"},{\"kind\":1024,\"name\":\"minute\",\"url\":\"interfaces/CronFieldCollectionOptions.html#minute\",\"classes\":\"\",\"parent\":\"CronFieldCollectionOptions\"},{\"kind\":1024,\"name\":\"hour\",\"url\":\"interfaces/CronFieldCollectionOptions.html#hour\",\"classes\":\"\",\"parent\":\"CronFieldCollectionOptions\"},{\"kind\":1024,\"name\":\"dayOfMonth\",\"url\":\"interfaces/CronFieldCollectionOptions.html#dayOfMonth\",\"classes\":\"\",\"parent\":\"CronFieldCollectionOptions\"},{\"kind\":1024,\"name\":\"month\",\"url\":\"interfaces/CronFieldCollectionOptions.html#month\",\"classes\":\"\",\"parent\":\"CronFieldCollectionOptions\"},{\"kind\":1024,\"name\":\"dayOfWeek\",\"url\":\"interfaces/CronFieldCollectionOptions.html#dayOfWeek\",\"classes\":\"\",\"parent\":\"CronFieldCollectionOptions\"},{\"kind\":256,\"name\":\"CronExpressionOptions\",\"url\":\"interfaces/CronExpressionOptions.html\",\"classes\":\"\"},{\"kind\":1024,\"name\":\"expression\",\"url\":\"interfaces/CronExpressionOptions.html#expression\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"currentDate\",\"url\":\"interfaces/CronExpressionOptions.html#currentDate\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"endDate\",\"url\":\"interfaces/CronExpressionOptions.html#endDate\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"startDate\",\"url\":\"interfaces/CronExpressionOptions.html#startDate\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"iterator\",\"url\":\"interfaces/CronExpressionOptions.html#iterator\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"utc\",\"url\":\"interfaces/CronExpressionOptions.html#utc\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"tz\",\"url\":\"interfaces/CronExpressionOptions.html#tz\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":1024,\"name\":\"nthDayOfWeek\",\"url\":\"interfaces/CronExpressionOptions.html#nthDayOfWeek\",\"classes\":\"\",\"parent\":\"CronExpressionOptions\"},{\"kind\":256,\"name\":\"CronParseOptions\",\"url\":\"interfaces/CronParseOptions.html\",\"classes\":\"\"},{\"kind\":1024,\"name\":\"currentDate\",\"url\":\"interfaces/CronParseOptions.html#currentDate\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"endDate\",\"url\":\"interfaces/CronParseOptions.html#endDate\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"startDate\",\"url\":\"interfaces/CronParseOptions.html#startDate\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"iterator\",\"url\":\"interfaces/CronParseOptions.html#iterator\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"tz\",\"url\":\"interfaces/CronParseOptions.html#tz\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"nthDayOfWeek\",\"url\":\"interfaces/CronParseOptions.html#nthDayOfWeek\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"expression\",\"url\":\"interfaces/CronParseOptions.html#expression\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":1024,\"name\":\"strict\",\"url\":\"interfaces/CronParseOptions.html#strict\",\"classes\":\"\",\"parent\":\"CronParseOptions\"},{\"kind\":256,\"name\":\"FieldRange\",\"url\":\"interfaces/FieldRange.html\",\"classes\":\"\"},{\"kind\":1024,\"name\":\"start\",\"url\":\"interfaces/FieldRange.html#start\",\"classes\":\"\",\"parent\":\"FieldRange\"},{\"kind\":1024,\"name\":\"count\",\"url\":\"interfaces/FieldRange.html#count\",\"classes\":\"\",\"parent\":\"FieldRange\"},{\"kind\":1024,\"name\":\"end\",\"url\":\"interfaces/FieldRange.html#end\",\"classes\":\"\",\"parent\":\"FieldRange\"},{\"kind\":1024,\"name\":\"step\",\"url\":\"interfaces/FieldRange.html#step\",\"classes\":\"\",\"parent\":\"FieldRange\"},{\"kind\":4194304,\"name\":\"CronExpressionIteratorCallback\",\"url\":\"types/CronExpressionIteratorCallback.html\",\"classes\":\"\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/CronExpressionIteratorCallback.html#__type\",\"classes\":\"\",\"parent\":\"CronExpressionIteratorCallback\"},{\"kind\":256,\"name\":\"CronExpressionIterator\",\"url\":\"interfaces/CronExpressionIterator.html\",\"classes\":\"\"},{\"kind\":1024,\"name\":\"value\",\"url\":\"interfaces/CronExpressionIterator.html#value\",\"classes\":\"\",\"parent\":\"CronExpressionIterator\"},{\"kind\":1024,\"name\":\"done\",\"url\":\"interfaces/CronExpressionIterator.html#done\",\"classes\":\"\",\"parent\":\"CronExpressionIterator\"},{\"kind\":4194304,\"name\":\"CronChars\",\"url\":\"types/CronChars.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"CronConstraints\",\"url\":\"types/CronConstraints.html\",\"classes\":\"\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/CronConstraints.html#__type\",\"classes\":\"\",\"parent\":\"CronConstraints\"},{\"kind\":1024,\"name\":\"min\",\"url\":\"types/CronConstraints.html#__type.min\",\"classes\":\"\",\"parent\":\"CronConstraints.__type\"},{\"kind\":1024,\"name\":\"max\",\"url\":\"types/CronConstraints.html#__type.max\",\"classes\":\"\",\"parent\":\"CronConstraints.__type\"},{\"kind\":1024,\"name\":\"chars\",\"url\":\"types/CronConstraints.html#__type.chars\",\"classes\":\"\",\"parent\":\"CronConstraints.__type\"},{\"kind\":1024,\"name\":\"validChars\",\"url\":\"types/CronConstraints.html#__type.validChars\",\"classes\":\"\",\"parent\":\"CronConstraints.__type\"},{\"kind\":4194304,\"name\":\"CronFieldType\",\"url\":\"types/CronFieldType.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"CronMax\",\"url\":\"types/CronMax.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"CronMin\",\"url\":\"types/CronMin.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"DayOfMonthRange\",\"url\":\"types/DayOfMonthRange.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"DayOfWeekRange\",\"url\":\"types/DayOfWeekRange.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"HourRange\",\"url\":\"types/HourRange.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"IntRange\",\"url\":\"types/IntRange.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"MonthRange\",\"url\":\"types/MonthRange.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"ParseStringResponse\",\"url\":\"types/ParseStringResponse.html\",\"classes\":\"\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/ParseStringResponse.html#__type\",\"classes\":\"\",\"parent\":\"ParseStringResponse\"},{\"kind\":1024,\"name\":\"variables\",\"url\":\"types/ParseStringResponse.html#__type.variables\",\"classes\":\"\",\"parent\":\"ParseStringResponse.__type\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/ParseStringResponse.html#__type.variables.__type-2\",\"classes\":\"\",\"parent\":\"ParseStringResponse.__type.variables\"},{\"kind\":1024,\"name\":\"expressions\",\"url\":\"types/ParseStringResponse.html#__type.expressions\",\"classes\":\"\",\"parent\":\"ParseStringResponse.__type\"},{\"kind\":1024,\"name\":\"errors\",\"url\":\"types/ParseStringResponse.html#__type.errors\",\"classes\":\"\",\"parent\":\"ParseStringResponse.__type\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/ParseStringResponse.html#__type.errors.__type-1\",\"classes\":\"\",\"parent\":\"ParseStringResponse.__type.errors\"},{\"kind\":4194304,\"name\":\"RangeFrom\",\"url\":\"types/RangeFrom.html\",\"classes\":\"\"},{\"kind\":4194304,\"name\":\"SerializedCronField\",\"url\":\"types/SerializedCronField.html\",\"classes\":\"\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/SerializedCronField.html#__type\",\"classes\":\"\",\"parent\":\"SerializedCronField\"},{\"kind\":1024,\"name\":\"wildcard\",\"url\":\"types/SerializedCronField.html#__type.wildcard\",\"classes\":\"\",\"parent\":\"SerializedCronField.__type\"},{\"kind\":1024,\"name\":\"values\",\"url\":\"types/SerializedCronField.html#__type.values\",\"classes\":\"\",\"parent\":\"SerializedCronField.__type\"},{\"kind\":4194304,\"name\":\"SerializedCronFields\",\"url\":\"types/SerializedCronFields.html\",\"classes\":\"\"},{\"kind\":65536,\"name\":\"__type\",\"url\":\"types/SerializedCronFields.html#__type\",\"classes\":\"\",\"parent\":\"SerializedCronFields\"},{\"kind\":1024,\"name\":\"second\",\"url\":\"types/SerializedCronFields.html#__type.second\",\"classes\":\"\",\"parent\":\"SerializedCronFields.__type\"},{\"kind\":1024,\"name\":\"minute\",\"url\":\"types/SerializedCronFields.html#__type.minute\",\"classes\":\"\",\"parent\":\"SerializedCronFields.__type\"},{\"kind\":1024,\"name\":\"hour\",\"url\":\"types/SerializedCronFields.html#__type.hour\",\"classes\":\"\",\"parent\":\"SerializedCronFields.__type\"},{\"kind\":1024,\"name\":\"dayOfMonth\",\"url\":\"types/SerializedCronFields.html#__type.dayOfMonth\",\"classes\":\"\",\"parent\":\"SerializedCronFields.__type\"},{\"kind\":1024,\"name\":\"month\",\"url\":\"types/SerializedCronFields.html#__type.month\",\"classes\":\"\",\"parent\":\"SerializedCronFields.__type\"},{\"kind\":1024,\"name\":\"dayOfWeek\",\"url\":\"types/SerializedCronFields.html#__type.dayOfWeek\",\"classes\":\"\",\"parent\":\"SerializedCronFields.__type\"},{\"kind\":4194304,\"name\":\"SixtyRange\",\"url\":\"types/SixtyRange.html\",\"classes\":\"\"},{\"kind\":8388608,\"name\":\"default\",\"url\":\"index.html#default\",\"classes\":\"\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"comment\"],\"fieldVectors\":[[\"name/0\",[0,54.027]],[\"comment/0\",[]],[\"name/1\",[1,54.027]],[\"comment/1\",[]],[\"name/2\",[2,54.027]],[\"comment/2\",[]],[\"name/3\",[3,54.027]],[\"comment/3\",[]],[\"name/4\",[4,54.027]],[\"comment/4\",[]],[\"name/5\",[5,33.658]],[\"comment/5\",[]],[\"name/6\",[6,41.034]],[\"comment/6\",[]],[\"name/7\",[7,41.034]],[\"comment/7\",[]],[\"name/8\",[8,41.034]],[\"comment/8\",[]],[\"name/9\",[9,43.041]],[\"comment/9\",[]],[\"name/10\",[10,41.034]],[\"comment/10\",[]],[\"name/11\",[11,41.034]],[\"comment/11\",[]],[\"name/12\",[6,41.034]],[\"comment/12\",[]],[\"name/13\",[7,41.034]],[\"comment/13\",[]],[\"name/14\",[8,41.034]],[\"comment/14\",[]],[\"name/15\",[9,43.041]],[\"comment/15\",[]],[\"name/16\",[10,41.034]],[\"comment/16\",[]],[\"name/17\",[11,41.034]],[\"comment/17\",[]],[\"name/18\",[12,54.027]],[\"comment/18\",[]],[\"name/19\",[13,48.919]],[\"comment/19\",[]],[\"name/20\",[14,36.681]],[\"comment/20\",[]],[\"name/21\",[15,54.027]],[\"comment/21\",[]],[\"name/22\",[16,54.027]],[\"comment/22\",[]],[\"name/23\",[17,48.919]],[\"comment/23\",[]],[\"name/24\",[18,54.027]],[\"comment/24\",[]],[\"name/25\",[19,54.027]],[\"comment/25\",[]],[\"name/26\",[20,54.027]],[\"comment/26\",[]],[\"name/27\",[5,33.658]],[\"comment/27\",[]],[\"name/28\",[21,54.027]],[\"comment/28\",[]],[\"name/29\",[5,33.658]],[\"comment/29\",[]],[\"name/30\",[22,54.027]],[\"comment/30\",[]],[\"name/31\",[23,48.919]],[\"comment/31\",[]],[\"name/32\",[24,48.919]],[\"comment/32\",[]],[\"name/33\",[23,48.919]],[\"comment/33\",[]],[\"name/34\",[24,48.919]],[\"comment/34\",[]],[\"name/35\",[25,54.027]],[\"comment/35\",[]],[\"name/36\",[26,54.027]],[\"comment/36\",[]],[\"name/37\",[27,54.027]],[\"comment/37\",[]],[\"name/38\",[28,54.027]],[\"comment/38\",[]],[\"name/39\",[29,54.027]],[\"comment/39\",[]],[\"name/40\",[30,54.027]],[\"comment/40\",[]],[\"name/41\",[31,54.027]],[\"comment/41\",[]],[\"name/42\",[32,54.027]],[\"comment/42\",[]],[\"name/43\",[33,54.027]],[\"comment/43\",[]],[\"name/44\",[34,54.027]],[\"comment/44\",[]],[\"name/45\",[35,54.027]],[\"comment/45\",[]],[\"name/46\",[36,54.027]],[\"comment/46\",[]],[\"name/47\",[37,54.027]],[\"comment/47\",[]],[\"name/48\",[38,54.027]],[\"comment/48\",[]],[\"name/49\",[39,54.027]],[\"comment/49\",[]],[\"name/50\",[40,54.027]],[\"comment/50\",[]],[\"name/51\",[41,54.027]],[\"comment/51\",[]],[\"name/52\",[42,54.027]],[\"comment/52\",[]],[\"name/53\",[43,54.027]],[\"comment/53\",[]],[\"name/54\",[44,54.027]],[\"comment/54\",[]],[\"name/55\",[45,54.027]],[\"comment/55\",[]],[\"name/56\",[46,54.027]],[\"comment/56\",[]],[\"name/57\",[47,54.027]],[\"comment/57\",[]],[\"name/58\",[48,54.027]],[\"comment/58\",[]],[\"name/59\",[49,54.027]],[\"comment/59\",[]],[\"name/60\",[50,54.027]],[\"comment/60\",[]],[\"name/61\",[51,54.027]],[\"comment/61\",[]],[\"name/62\",[52,54.027]],[\"comment/62\",[]],[\"name/63\",[53,54.027]],[\"comment/63\",[]],[\"name/64\",[54,54.027]],[\"comment/64\",[]],[\"name/65\",[55,54.027]],[\"comment/65\",[]],[\"name/66\",[56,54.027]],[\"comment/66\",[]],[\"name/67\",[57,54.027]],[\"comment/67\",[]],[\"name/68\",[58,54.027]],[\"comment/68\",[]],[\"name/69\",[59,54.027]],[\"comment/69\",[]],[\"name/70\",[60,54.027]],[\"comment/70\",[]],[\"name/71\",[61,54.027]],[\"comment/71\",[]],[\"name/72\",[62,54.027]],[\"comment/72\",[]],[\"name/73\",[63,54.027]],[\"comment/73\",[]],[\"name/74\",[64,54.027]],[\"comment/74\",[]],[\"name/75\",[65,54.027]],[\"comment/75\",[]],[\"name/76\",[66,48.919]],[\"comment/76\",[]],[\"name/77\",[67,54.027]],[\"comment/77\",[]],[\"name/78\",[68,54.027]],[\"comment/78\",[]],[\"name/79\",[69,54.027]],[\"comment/79\",[]],[\"name/80\",[70,54.027]],[\"comment/80\",[]],[\"name/81\",[71,54.027]],[\"comment/81\",[]],[\"name/82\",[72,54.027]],[\"comment/82\",[]],[\"name/83\",[73,30.673]],[\"comment/83\",[]],[\"name/84\",[74,30.673]],[\"comment/84\",[]],[\"name/85\",[75,30.673]],[\"comment/85\",[]],[\"name/86\",[76,36.681]],[\"comment/86\",[]],[\"name/87\",[77,37.932]],[\"comment/87\",[]],[\"name/88\",[78,37.932]],[\"comment/88\",[]],[\"name/89\",[5,33.658]],[\"comment/89\",[]],[\"name/90\",[79,30.673]],[\"comment/90\",[]],[\"name/91\",[80,36.681]],[\"comment/91\",[]],[\"name/92\",[79,30.673]],[\"comment/92\",[]],[\"name/93\",[73,30.673]],[\"comment/93\",[]],[\"name/94\",[74,30.673]],[\"comment/94\",[]],[\"name/95\",[75,30.673]],[\"comment/95\",[]],[\"name/96\",[81,37.932]],[\"comment/96\",[]],[\"name/97\",[14,36.681]],[\"comment/97\",[]],[\"name/98\",[82,37.932]],[\"comment/98\",[]],[\"name/99\",[83,54.027]],[\"comment/99\",[]],[\"name/100\",[73,30.673]],[\"comment/100\",[]],[\"name/101\",[74,30.673]],[\"comment/101\",[]],[\"name/102\",[75,30.673]],[\"comment/102\",[]],[\"name/103\",[76,36.681]],[\"comment/103\",[]],[\"name/104\",[77,37.932]],[\"comment/104\",[]],[\"name/105\",[78,37.932]],[\"comment/105\",[]],[\"name/106\",[5,33.658]],[\"comment/106\",[]],[\"name/107\",[79,30.673]],[\"comment/107\",[]],[\"name/108\",[80,36.681]],[\"comment/108\",[]],[\"name/109\",[79,30.673]],[\"comment/109\",[]],[\"name/110\",[73,30.673]],[\"comment/110\",[]],[\"name/111\",[74,30.673]],[\"comment/111\",[]],[\"name/112\",[75,30.673]],[\"comment/112\",[]],[\"name/113\",[81,37.932]],[\"comment/113\",[]],[\"name/114\",[14,36.681]],[\"comment/114\",[]],[\"name/115\",[82,37.932]],[\"comment/115\",[]],[\"name/116\",[84,54.027]],[\"comment/116\",[]],[\"name/117\",[73,30.673]],[\"comment/117\",[]],[\"name/118\",[74,30.673]],[\"comment/118\",[]],[\"name/119\",[75,30.673]],[\"comment/119\",[]],[\"name/120\",[76,36.681]],[\"comment/120\",[]],[\"name/121\",[77,37.932]],[\"comment/121\",[]],[\"name/122\",[78,37.932]],[\"comment/122\",[]],[\"name/123\",[5,33.658]],[\"comment/123\",[]],[\"name/124\",[80,36.681]],[\"comment/124\",[]],[\"name/125\",[79,30.673]],[\"comment/125\",[]],[\"name/126\",[73,30.673]],[\"comment/126\",[]],[\"name/127\",[74,30.673]],[\"comment/127\",[]],[\"name/128\",[75,30.673]],[\"comment/128\",[]],[\"name/129\",[81,37.932]],[\"comment/129\",[]],[\"name/130\",[79,30.673]],[\"comment/130\",[]],[\"name/131\",[14,36.681]],[\"comment/131\",[]],[\"name/132\",[82,37.932]],[\"comment/132\",[]],[\"name/133\",[85,54.027]],[\"comment/133\",[]],[\"name/134\",[73,30.673]],[\"comment/134\",[]],[\"name/135\",[74,30.673]],[\"comment/135\",[]],[\"name/136\",[75,30.673]],[\"comment/136\",[]],[\"name/137\",[76,36.681]],[\"comment/137\",[]],[\"name/138\",[77,37.932]],[\"comment/138\",[]],[\"name/139\",[78,37.932]],[\"comment/139\",[]],[\"name/140\",[5,33.658]],[\"comment/140\",[]],[\"name/141\",[79,30.673]],[\"comment/141\",[]],[\"name/142\",[80,36.681]],[\"comment/142\",[]],[\"name/143\",[79,30.673]],[\"comment/143\",[]],[\"name/144\",[73,30.673]],[\"comment/144\",[]],[\"name/145\",[74,30.673]],[\"comment/145\",[]],[\"name/146\",[75,30.673]],[\"comment/146\",[]],[\"name/147\",[81,37.932]],[\"comment/147\",[]],[\"name/148\",[14,36.681]],[\"comment/148\",[]],[\"name/149\",[82,37.932]],[\"comment/149\",[]],[\"name/150\",[86,54.027]],[\"comment/150\",[]],[\"name/151\",[73,30.673]],[\"comment/151\",[]],[\"name/152\",[74,30.673]],[\"comment/152\",[]],[\"name/153\",[75,30.673]],[\"comment/153\",[]],[\"name/154\",[76,36.681]],[\"comment/154\",[]],[\"name/155\",[77,37.932]],[\"comment/155\",[]],[\"name/156\",[78,37.932]],[\"comment/156\",[]],[\"name/157\",[5,33.658]],[\"comment/157\",[]],[\"name/158\",[79,30.673]],[\"comment/158\",[]],[\"name/159\",[80,36.681]],[\"comment/159\",[]],[\"name/160\",[79,30.673]],[\"comment/160\",[]],[\"name/161\",[73,30.673]],[\"comment/161\",[]],[\"name/162\",[74,30.673]],[\"comment/162\",[]],[\"name/163\",[75,30.673]],[\"comment/163\",[]],[\"name/164\",[81,37.932]],[\"comment/164\",[]],[\"name/165\",[14,36.681]],[\"comment/165\",[]],[\"name/166\",[82,37.932]],[\"comment/166\",[]],[\"name/167\",[87,54.027]],[\"comment/167\",[]],[\"name/168\",[73,30.673]],[\"comment/168\",[]],[\"name/169\",[74,30.673]],[\"comment/169\",[]],[\"name/170\",[75,30.673]],[\"comment/170\",[]],[\"name/171\",[88,54.027]],[\"comment/171\",[]],[\"name/172\",[76,36.681]],[\"comment/172\",[]],[\"name/173\",[77,37.932]],[\"comment/173\",[]],[\"name/174\",[78,37.932]],[\"comment/174\",[]],[\"name/175\",[5,33.658]],[\"comment/175\",[]],[\"name/176\",[79,30.673]],[\"comment/176\",[]],[\"name/177\",[80,36.681]],[\"comment/177\",[]],[\"name/178\",[79,30.673]],[\"comment/178\",[]],[\"name/179\",[73,30.673]],[\"comment/179\",[]],[\"name/180\",[74,30.673]],[\"comment/180\",[]],[\"name/181\",[75,30.673]],[\"comment/181\",[]],[\"name/182\",[81,37.932]],[\"comment/182\",[]],[\"name/183\",[14,36.681]],[\"comment/183\",[]],[\"name/184\",[82,37.932]],[\"comment/184\",[]],[\"name/185\",[89,54.027]],[\"comment/185\",[]],[\"name/186\",[73,30.673]],[\"comment/186\",[]],[\"name/187\",[74,30.673]],[\"comment/187\",[]],[\"name/188\",[75,30.673]],[\"comment/188\",[]],[\"name/189\",[76,36.681]],[\"comment/189\",[]],[\"name/190\",[77,37.932]],[\"comment/190\",[]],[\"name/191\",[78,37.932]],[\"comment/191\",[]],[\"name/192\",[5,33.658]],[\"comment/192\",[]],[\"name/193\",[79,30.673]],[\"comment/193\",[]],[\"name/194\",[80,36.681]],[\"comment/194\",[]],[\"name/195\",[79,30.673]],[\"comment/195\",[]],[\"name/196\",[73,30.673]],[\"comment/196\",[]],[\"name/197\",[74,30.673]],[\"comment/197\",[]],[\"name/198\",[75,30.673]],[\"comment/198\",[]],[\"name/199\",[81,37.932]],[\"comment/199\",[]],[\"name/200\",[14,36.681]],[\"comment/200\",[]],[\"name/201\",[82,37.932]],[\"comment/201\",[]],[\"name/202\",[90,54.027]],[\"comment/202\",[]],[\"name/203\",[91,54.027]],[\"comment/203\",[]],[\"name/204\",[17,48.919]],[\"comment/204\",[]],[\"name/205\",[92,54.027]],[\"comment/205\",[]],[\"name/206\",[93,54.027]],[\"comment/206\",[]],[\"name/207\",[94,54.027]],[\"comment/207\",[]],[\"name/208\",[5,33.658]],[\"comment/208\",[]],[\"name/209\",[95,54.027]],[\"comment/209\",[]],[\"name/210\",[96,45.554]],[\"comment/210\",[]],[\"name/211\",[97,45.554]],[\"comment/211\",[]],[\"name/212\",[98,45.554]],[\"comment/212\",[]],[\"name/213\",[99,45.554]],[\"comment/213\",[]],[\"name/214\",[100,54.027]],[\"comment/214\",[]],[\"name/215\",[101,54.027]],[\"comment/215\",[]],[\"name/216\",[102,45.554]],[\"comment/216\",[]],[\"name/217\",[103,48.919]],[\"comment/217\",[]],[\"name/218\",[103,48.919]],[\"comment/218\",[]],[\"name/219\",[104,54.027]],[\"comment/219\",[]],[\"name/220\",[105,54.027]],[\"comment/220\",[]],[\"name/221\",[106,54.027]],[\"comment/221\",[]],[\"name/222\",[107,54.027]],[\"comment/222\",[]],[\"name/223\",[108,54.027]],[\"comment/223\",[]],[\"name/224\",[109,54.027]],[\"comment/224\",[]],[\"name/225\",[13,48.919]],[\"comment/225\",[]],[\"name/226\",[110,54.027]],[\"comment/226\",[]],[\"name/227\",[66,48.919]],[\"comment/227\",[]],[\"name/228\",[111,54.027]],[\"comment/228\",[]],[\"name/229\",[112,54.027]],[\"comment/229\",[]],[\"name/230\",[113,54.027]],[\"comment/230\",[]],[\"name/231\",[114,54.027]],[\"comment/231\",[]],[\"name/232\",[115,54.027]],[\"comment/232\",[]],[\"name/233\",[116,54.027]],[\"comment/233\",[]],[\"name/234\",[117,54.027]],[\"comment/234\",[]],[\"name/235\",[6,41.034]],[\"comment/235\",[]],[\"name/236\",[7,41.034]],[\"comment/236\",[]],[\"name/237\",[8,41.034]],[\"comment/237\",[]],[\"name/238\",[118,54.027]],[\"comment/238\",[]],[\"name/239\",[10,41.034]],[\"comment/239\",[]],[\"name/240\",[119,54.027]],[\"comment/240\",[]],[\"name/241\",[11,41.034]],[\"comment/241\",[]],[\"name/242\",[120,54.027]],[\"comment/242\",[]],[\"name/243\",[121,54.027]],[\"comment/243\",[]],[\"name/244\",[122,54.027]],[\"comment/244\",[]],[\"name/245\",[123,54.027]],[\"comment/245\",[]],[\"name/246\",[124,54.027]],[\"comment/246\",[]],[\"name/247\",[125,54.027]],[\"comment/247\",[]],[\"name/248\",[126,54.027]],[\"comment/248\",[]],[\"name/249\",[127,54.027]],[\"comment/249\",[]],[\"name/250\",[128,54.027]],[\"comment/250\",[]],[\"name/251\",[129,54.027]],[\"comment/251\",[]],[\"name/252\",[130,54.027]],[\"comment/252\",[]],[\"name/253\",[131,54.027]],[\"comment/253\",[]],[\"name/254\",[132,54.027]],[\"comment/254\",[]],[\"name/255\",[133,54.027]],[\"comment/255\",[]],[\"name/256\",[134,54.027]],[\"comment/256\",[]],[\"name/257\",[135,54.027]],[\"comment/257\",[]],[\"name/258\",[136,54.027]],[\"comment/258\",[]],[\"name/259\",[137,54.027]],[\"comment/259\",[]],[\"name/260\",[138,54.027]],[\"comment/260\",[]],[\"name/261\",[6,41.034]],[\"comment/261\",[]],[\"name/262\",[7,41.034]],[\"comment/262\",[]],[\"name/263\",[8,41.034]],[\"comment/263\",[]],[\"name/264\",[9,43.041]],[\"comment/264\",[]],[\"name/265\",[10,41.034]],[\"comment/265\",[]],[\"name/266\",[11,41.034]],[\"comment/266\",[]],[\"name/267\",[139,54.027]],[\"comment/267\",[]],[\"name/268\",[140,48.919]],[\"comment/268\",[]],[\"name/269\",[97,45.554]],[\"comment/269\",[]],[\"name/270\",[99,45.554]],[\"comment/270\",[]],[\"name/271\",[98,45.554]],[\"comment/271\",[]],[\"name/272\",[141,48.919]],[\"comment/272\",[]],[\"name/273\",[142,54.027]],[\"comment/273\",[]],[\"name/274\",[96,45.554]],[\"comment/274\",[]],[\"name/275\",[102,45.554]],[\"comment/275\",[]],[\"name/276\",[143,54.027]],[\"comment/276\",[]],[\"name/277\",[97,45.554]],[\"comment/277\",[]],[\"name/278\",[99,45.554]],[\"comment/278\",[]],[\"name/279\",[98,45.554]],[\"comment/279\",[]],[\"name/280\",[141,48.919]],[\"comment/280\",[]],[\"name/281\",[96,45.554]],[\"comment/281\",[]],[\"name/282\",[102,45.554]],[\"comment/282\",[]],[\"name/283\",[140,48.919]],[\"comment/283\",[]],[\"name/284\",[144,54.027]],[\"comment/284\",[]],[\"name/285\",[145,54.027]],[\"comment/285\",[]],[\"name/286\",[146,54.027]],[\"comment/286\",[]],[\"name/287\",[147,54.027]],[\"comment/287\",[]],[\"name/288\",[148,54.027]],[\"comment/288\",[]],[\"name/289\",[149,54.027]],[\"comment/289\",[]],[\"name/290\",[150,54.027]],[\"comment/290\",[]],[\"name/291\",[151,37.932]],[\"comment/291\",[]],[\"name/292\",[152,54.027]],[\"comment/292\",[]],[\"name/293\",[153,54.027]],[\"comment/293\",[]],[\"name/294\",[154,54.027]],[\"comment/294\",[]],[\"name/295\",[155,54.027]],[\"comment/295\",[]],[\"name/296\",[156,54.027]],[\"comment/296\",[]],[\"name/297\",[151,37.932]],[\"comment/297\",[]],[\"name/298\",[73,30.673]],[\"comment/298\",[]],[\"name/299\",[74,30.673]],[\"comment/299\",[]],[\"name/300\",[75,30.673]],[\"comment/300\",[]],[\"name/301\",[76,36.681]],[\"comment/301\",[]],[\"name/302\",[157,54.027]],[\"comment/302\",[]],[\"name/303\",[158,54.027]],[\"comment/303\",[]],[\"name/304\",[159,54.027]],[\"comment/304\",[]],[\"name/305\",[160,54.027]],[\"comment/305\",[]],[\"name/306\",[161,54.027]],[\"comment/306\",[]],[\"name/307\",[162,54.027]],[\"comment/307\",[]],[\"name/308\",[163,54.027]],[\"comment/308\",[]],[\"name/309\",[164,54.027]],[\"comment/309\",[]],[\"name/310\",[165,54.027]],[\"comment/310\",[]],[\"name/311\",[151,37.932]],[\"comment/311\",[]],[\"name/312\",[166,54.027]],[\"comment/312\",[]],[\"name/313\",[151,37.932]],[\"comment/313\",[]],[\"name/314\",[167,54.027]],[\"comment/314\",[]],[\"name/315\",[168,54.027]],[\"comment/315\",[]],[\"name/316\",[151,37.932]],[\"comment/316\",[]],[\"name/317\",[169,54.027]],[\"comment/317\",[]],[\"name/318\",[170,54.027]],[\"comment/318\",[]],[\"name/319\",[151,37.932]],[\"comment/319\",[]],[\"name/320\",[80,36.681]],[\"comment/320\",[]],[\"name/321\",[79,30.673]],[\"comment/321\",[]],[\"name/322\",[171,54.027]],[\"comment/322\",[]],[\"name/323\",[151,37.932]],[\"comment/323\",[]],[\"name/324\",[6,41.034]],[\"comment/324\",[]],[\"name/325\",[7,41.034]],[\"comment/325\",[]],[\"name/326\",[8,41.034]],[\"comment/326\",[]],[\"name/327\",[9,43.041]],[\"comment/327\",[]],[\"name/328\",[10,41.034]],[\"comment/328\",[]],[\"name/329\",[11,41.034]],[\"comment/329\",[]],[\"name/330\",[172,54.027]],[\"comment/330\",[]],[\"name/331\",[173,54.027]],[\"comment/331\",[]]],\"invertedIndex\":[[\"__type\",{\"_index\":151,\"name\":{\"291\":{},\"297\":{},\"311\":{},\"313\":{},\"316\":{},\"319\":{},\"323\":{}},\"comment\":{}}],[\"add\",{\"_index\":115,\"name\":{\"232\":{}},\"comment\":{}}],[\"addday\",{\"_index\":27,\"name\":{\"37\":{}},\"comment\":{}}],[\"addhour\",{\"_index\":28,\"name\":{\"38\":{}},\"comment\":{}}],[\"addminute\",{\"_index\":29,\"name\":{\"39\":{}},\"comment\":{}}],[\"addmonth\",{\"_index\":26,\"name\":{\"36\":{}},\"comment\":{}}],[\"addsecond\",{\"_index\":30,\"name\":{\"40\":{}},\"comment\":{}}],[\"addunit\",{\"_index\":37,\"name\":{\"47\":{}},\"comment\":{}}],[\"addyear\",{\"_index\":25,\"name\":{\"35\":{}},\"comment\":{}}],[\"annually\",{\"_index\":129,\"name\":{\"251\":{}},\"comment\":{}}],[\"applydateoperation\",{\"_index\":70,\"name\":{\"80\":{}},\"comment\":{}}],[\"chars\",{\"_index\":75,\"name\":{\"85\":{},\"95\":{},\"102\":{},\"112\":{},\"119\":{},\"128\":{},\"136\":{},\"146\":{},\"153\":{},\"163\":{},\"170\":{},\"181\":{},\"188\":{},\"198\":{},\"300\":{}},\"comment\":{}}],[\"compactfield\",{\"_index\":1,\"name\":{\"1\":{}},\"comment\":{}}],[\"constraints\",{\"_index\":77,\"name\":{\"87\":{},\"104\":{},\"121\":{},\"138\":{},\"155\":{},\"173\":{},\"190\":{}},\"comment\":{}}],[\"constructor\",{\"_index\":5,\"name\":{\"5\":{},\"27\":{},\"29\":{},\"89\":{},\"106\":{},\"123\":{},\"140\":{},\"157\":{},\"175\":{},\"192\":{},\"208\":{}},\"comment\":{}}],[\"count\",{\"_index\":147,\"name\":{\"287\":{}},\"comment\":{}}],[\"cronchars\",{\"_index\":155,\"name\":{\"295\":{}},\"comment\":{}}],[\"cronconstraints\",{\"_index\":156,\"name\":{\"296\":{}},\"comment\":{}}],[\"crondate\",{\"_index\":21,\"name\":{\"28\":{}},\"comment\":{}}],[\"crondayofmonth\",{\"_index\":72,\"name\":{\"82\":{}},\"comment\":{}}],[\"crondayoftheweek\",{\"_index\":83,\"name\":{\"99\":{}},\"comment\":{}}],[\"cronexpression\",{\"_index\":90,\"name\":{\"202\":{}},\"comment\":{}}],[\"cronexpressioniterator\",{\"_index\":152,\"name\":{\"292\":{}},\"comment\":{}}],[\"cronexpressioniteratorcallback\",{\"_index\":150,\"name\":{\"290\":{}},\"comment\":{}}],[\"cronexpressionoptions\",{\"_index\":139,\"name\":{\"267\":{}},\"comment\":{}}],[\"cronfield\",{\"_index\":84,\"name\":{\"116\":{}},\"comment\":{}}],[\"cronfieldcollection\",{\"_index\":0,\"name\":{\"0\":{}},\"comment\":{}}],[\"cronfieldcollectionoptions\",{\"_index\":138,\"name\":{\"260\":{}},\"comment\":{}}],[\"cronfieldtype\",{\"_index\":157,\"name\":{\"302\":{}},\"comment\":{}}],[\"cronhour\",{\"_index\":85,\"name\":{\"133\":{}},\"comment\":{}}],[\"cronmax\",{\"_index\":158,\"name\":{\"303\":{}},\"comment\":{}}],[\"cronmin\",{\"_index\":159,\"name\":{\"304\":{}},\"comment\":{}}],[\"cronminute\",{\"_index\":86,\"name\":{\"150\":{}},\"comment\":{}}],[\"cronmonth\",{\"_index\":87,\"name\":{\"167\":{}},\"comment\":{}}],[\"cronparseoptions\",{\"_index\":143,\"name\":{\"276\":{}},\"comment\":{}}],[\"cronparser\",{\"_index\":15,\"name\":{\"21\":{}},\"comment\":{}}],[\"cronsecond\",{\"_index\":89,\"name\":{\"185\":{}},\"comment\":{}}],[\"currentdate\",{\"_index\":97,\"name\":{\"211\":{},\"269\":{},\"277\":{}},\"comment\":{}}],[\"daily\",{\"_index\":132,\"name\":{\"254\":{}},\"comment\":{}}],[\"date\",{\"_index\":22,\"name\":{\"30\":{}},\"comment\":{}}],[\"datemathop\",{\"_index\":114,\"name\":{\"231\":{}},\"comment\":{}}],[\"day\",{\"_index\":118,\"name\":{\"238\":{}},\"comment\":{}}],[\"dayofmonth\",{\"_index\":9,\"name\":{\"9\":{},\"15\":{},\"264\":{},\"327\":{}},\"comment\":{}}],[\"dayofmonthrange\",{\"_index\":160,\"name\":{\"305\":{}},\"comment\":{}}],[\"dayofweek\",{\"_index\":11,\"name\":{\"11\":{},\"17\":{},\"241\":{},\"266\":{},\"329\":{}},\"comment\":{}}],[\"dayofweekrange\",{\"_index\":161,\"name\":{\"306\":{}},\"comment\":{}}],[\"daysinmonth\",{\"_index\":88,\"name\":{\"171\":{}},\"comment\":{}}],[\"default\",{\"_index\":173,\"name\":{\"331\":{}},\"comment\":{}}],[\"done\",{\"_index\":154,\"name\":{\"294\":{}},\"comment\":{}}],[\"dstend\",{\"_index\":24,\"name\":{\"32\":{},\"34\":{}},\"comment\":{}}],[\"dststart\",{\"_index\":23,\"name\":{\"31\":{},\"33\":{}},\"comment\":{}}],[\"end\",{\"_index\":148,\"name\":{\"288\":{}},\"comment\":{}}],[\"enddate\",{\"_index\":99,\"name\":{\"213\":{},\"270\":{},\"278\":{}},\"comment\":{}}],[\"errors\",{\"_index\":168,\"name\":{\"315\":{}},\"comment\":{}}],[\"expression\",{\"_index\":140,\"name\":{\"268\":{},\"283\":{}},\"comment\":{}}],[\"expressions\",{\"_index\":167,\"name\":{\"314\":{}},\"comment\":{}}],[\"fieldrange\",{\"_index\":145,\"name\":{\"285\":{}},\"comment\":{}}],[\"fields\",{\"_index\":103,\"name\":{\"217\":{},\"218\":{}},\"comment\":{}}],[\"fieldstoexpression\",{\"_index\":17,\"name\":{\"23\":{},\"204\":{}},\"comment\":{}}],[\"findschedule\",{\"_index\":113,\"name\":{\"230\":{}},\"comment\":{}}],[\"fri\",{\"_index\":125,\"name\":{\"247\":{}},\"comment\":{}}],[\"getdate\",{\"_index\":40,\"name\":{\"50\":{}},\"comment\":{}}],[\"getday\",{\"_index\":42,\"name\":{\"52\":{}},\"comment\":{}}],[\"getfullyear\",{\"_index\":41,\"name\":{\"51\":{}},\"comment\":{}}],[\"gethours\",{\"_index\":44,\"name\":{\"54\":{}},\"comment\":{}}],[\"getmilliseconds\",{\"_index\":47,\"name\":{\"57\":{}},\"comment\":{}}],[\"getminutes\",{\"_index\":45,\"name\":{\"55\":{}},\"comment\":{}}],[\"getmonth\",{\"_index\":43,\"name\":{\"53\":{}},\"comment\":{}}],[\"getseconds\",{\"_index\":46,\"name\":{\"56\":{}},\"comment\":{}}],[\"gettime\",{\"_index\":48,\"name\":{\"58\":{}},\"comment\":{}}],[\"getutc\",{\"_index\":71,\"name\":{\"81\":{}},\"comment\":{}}],[\"getutcdate\",{\"_index\":49,\"name\":{\"59\":{}},\"comment\":{}}],[\"getutcday\",{\"_index\":51,\"name\":{\"61\":{}},\"comment\":{}}],[\"getutcfullyear\",{\"_index\":50,\"name\":{\"60\":{}},\"comment\":{}}],[\"getutchours\",{\"_index\":53,\"name\":{\"63\":{}},\"comment\":{}}],[\"getutcminutes\",{\"_index\":54,\"name\":{\"64\":{}},\"comment\":{}}],[\"getutcmonth\",{\"_index\":52,\"name\":{\"62\":{}},\"comment\":{}}],[\"getutcseconds\",{\"_index\":55,\"name\":{\"65\":{}},\"comment\":{}}],[\"handlemaxdaysinmonth\",{\"_index\":2,\"name\":{\"2\":{}},\"comment\":{}}],[\"handlemultipleranges\",{\"_index\":4,\"name\":{\"4\":{}},\"comment\":{}}],[\"handlesinglerange\",{\"_index\":3,\"name\":{\"3\":{}},\"comment\":{}}],[\"hasiterated\",{\"_index\":101,\"name\":{\"215\":{}},\"comment\":{}}],[\"hasnext\",{\"_index\":106,\"name\":{\"221\":{}},\"comment\":{}}],[\"hasprev\",{\"_index\":107,\"name\":{\"222\":{}},\"comment\":{}}],[\"hour\",{\"_index\":8,\"name\":{\"8\":{},\"14\":{},\"237\":{},\"263\":{},\"326\":{}},\"comment\":{}}],[\"hourly\",{\"_index\":133,\"name\":{\"255\":{}},\"comment\":{}}],[\"hourrange\",{\"_index\":162,\"name\":{\"307\":{}},\"comment\":{}}],[\"includesdate\",{\"_index\":110,\"name\":{\"226\":{}},\"comment\":{}}],[\"intrange\",{\"_index\":163,\"name\":{\"308\":{}},\"comment\":{}}],[\"invokedateoperation\",{\"_index\":39,\"name\":{\"49\":{}},\"comment\":{}}],[\"isiterator\",{\"_index\":100,\"name\":{\"214\":{}},\"comment\":{}}],[\"islastdayofmonth\",{\"_index\":68,\"name\":{\"78\":{}},\"comment\":{}}],[\"islastweekdayofmonth\",{\"_index\":69,\"name\":{\"79\":{}},\"comment\":{}}],[\"islastweekdayofmonthmatch\",{\"_index\":94,\"name\":{\"207\":{}},\"comment\":{}}],[\"islinexpressions\",{\"_index\":93,\"name\":{\"206\":{}},\"comment\":{}}],[\"iswildcard\",{\"_index\":81,\"name\":{\"96\":{},\"113\":{},\"129\":{},\"147\":{},\"164\":{},\"182\":{},\"199\":{}},\"comment\":{}}],[\"iterate\",{\"_index\":108,\"name\":{\"223\":{}},\"comment\":{}}],[\"iterator\",{\"_index\":141,\"name\":{\"272\":{},\"280\":{}},\"comment\":{}}],[\"matchdayofmonth\",{\"_index\":111,\"name\":{\"228\":{}},\"comment\":{}}],[\"matchhour\",{\"_index\":112,\"name\":{\"229\":{}},\"comment\":{}}],[\"matchschedule\",{\"_index\":92,\"name\":{\"205\":{}},\"comment\":{}}],[\"max\",{\"_index\":74,\"name\":{\"84\":{},\"94\":{},\"101\":{},\"111\":{},\"118\":{},\"127\":{},\"135\":{},\"145\":{},\"152\":{},\"162\":{},\"169\":{},\"180\":{},\"187\":{},\"197\":{},\"299\":{}},\"comment\":{}}],[\"min\",{\"_index\":73,\"name\":{\"83\":{},\"93\":{},\"100\":{},\"110\":{},\"117\":{},\"126\":{},\"134\":{},\"144\":{},\"151\":{},\"161\":{},\"168\":{},\"179\":{},\"186\":{},\"196\":{},\"298\":{}},\"comment\":{}}],[\"minute\",{\"_index\":7,\"name\":{\"7\":{},\"13\":{},\"236\":{},\"262\":{},\"325\":{}},\"comment\":{}}],[\"minutely\",{\"_index\":134,\"name\":{\"256\":{}},\"comment\":{}}],[\"mon\",{\"_index\":121,\"name\":{\"243\":{}},\"comment\":{}}],[\"month\",{\"_index\":10,\"name\":{\"10\":{},\"16\":{},\"239\":{},\"265\":{},\"328\":{}},\"comment\":{}}],[\"monthly\",{\"_index\":130,\"name\":{\"252\":{}},\"comment\":{}}],[\"monthrange\",{\"_index\":164,\"name\":{\"309\":{}},\"comment\":{}}],[\"next\",{\"_index\":104,\"name\":{\"219\":{}},\"comment\":{}}],[\"nthdayofweek\",{\"_index\":102,\"name\":{\"216\":{},\"275\":{},\"282\":{}},\"comment\":{}}],[\"options\",{\"_index\":95,\"name\":{\"209\":{}},\"comment\":{}}],[\"parse\",{\"_index\":91,\"name\":{\"203\":{}},\"comment\":{}}],[\"parseentry\",{\"_index\":20,\"name\":{\"26\":{}},\"comment\":{}}],[\"parseexpression\",{\"_index\":16,\"name\":{\"22\":{}},\"comment\":{}}],[\"parsefile\",{\"_index\":19,\"name\":{\"25\":{}},\"comment\":{}}],[\"parsestring\",{\"_index\":18,\"name\":{\"24\":{}},\"comment\":{}}],[\"parsestringresponse\",{\"_index\":165,\"name\":{\"310\":{}},\"comment\":{}}],[\"predefinedexpressions\",{\"_index\":127,\"name\":{\"249\":{}},\"comment\":{}}],[\"prev\",{\"_index\":105,\"name\":{\"220\":{}},\"comment\":{}}],[\"rangefrom\",{\"_index\":169,\"name\":{\"317\":{}},\"comment\":{}}],[\"reset\",{\"_index\":109,\"name\":{\"224\":{}},\"comment\":{}}],[\"sat\",{\"_index\":126,\"name\":{\"248\":{}},\"comment\":{}}],[\"second\",{\"_index\":6,\"name\":{\"6\":{},\"12\":{},\"235\":{},\"261\":{},\"324\":{}},\"comment\":{}}],[\"secondly\",{\"_index\":135,\"name\":{\"257\":{}},\"comment\":{}}],[\"serialize\",{\"_index\":14,\"name\":{\"20\":{},\"97\":{},\"114\":{},\"131\":{},\"148\":{},\"165\":{},\"183\":{},\"200\":{}},\"comment\":{}}],[\"serializedcronfield\",{\"_index\":170,\"name\":{\"318\":{}},\"comment\":{}}],[\"serializedcronfields\",{\"_index\":171,\"name\":{\"322\":{}},\"comment\":{}}],[\"setdate\",{\"_index\":58,\"name\":{\"68\":{}},\"comment\":{}}],[\"setday\",{\"_index\":60,\"name\":{\"70\":{}},\"comment\":{}}],[\"setfullyear\",{\"_index\":59,\"name\":{\"69\":{}},\"comment\":{}}],[\"sethours\",{\"_index\":62,\"name\":{\"72\":{}},\"comment\":{}}],[\"setmilliseconds\",{\"_index\":65,\"name\":{\"75\":{}},\"comment\":{}}],[\"setminutes\",{\"_index\":63,\"name\":{\"73\":{}},\"comment\":{}}],[\"setmonth\",{\"_index\":61,\"name\":{\"71\":{}},\"comment\":{}}],[\"setseconds\",{\"_index\":64,\"name\":{\"74\":{}},\"comment\":{}}],[\"sixtyrange\",{\"_index\":172,\"name\":{\"330\":{}},\"comment\":{}}],[\"sorter\",{\"_index\":78,\"name\":{\"88\":{},\"105\":{},\"122\":{},\"139\":{},\"156\":{},\"174\":{},\"191\":{}},\"comment\":{}}],[\"start\",{\"_index\":146,\"name\":{\"286\":{}},\"comment\":{}}],[\"startdate\",{\"_index\":98,\"name\":{\"212\":{},\"271\":{},\"279\":{}},\"comment\":{}}],[\"step\",{\"_index\":149,\"name\":{\"289\":{}},\"comment\":{}}],[\"strict\",{\"_index\":144,\"name\":{\"284\":{}},\"comment\":{}}],[\"stringify\",{\"_index\":13,\"name\":{\"19\":{},\"225\":{}},\"comment\":{}}],[\"stringifyfield\",{\"_index\":12,\"name\":{\"18\":{}},\"comment\":{}}],[\"subtract\",{\"_index\":116,\"name\":{\"233\":{}},\"comment\":{}}],[\"subtractday\",{\"_index\":33,\"name\":{\"43\":{}},\"comment\":{}}],[\"subtracthour\",{\"_index\":34,\"name\":{\"44\":{}},\"comment\":{}}],[\"subtractminute\",{\"_index\":35,\"name\":{\"45\":{}},\"comment\":{}}],[\"subtractmonth\",{\"_index\":32,\"name\":{\"42\":{}},\"comment\":{}}],[\"subtractsecond\",{\"_index\":36,\"name\":{\"46\":{}},\"comment\":{}}],[\"subtractunit\",{\"_index\":38,\"name\":{\"48\":{}},\"comment\":{}}],[\"subtractyear\",{\"_index\":31,\"name\":{\"41\":{}},\"comment\":{}}],[\"sun\",{\"_index\":120,\"name\":{\"242\":{}},\"comment\":{}}],[\"thu\",{\"_index\":124,\"name\":{\"246\":{}},\"comment\":{}}],[\"timeunit\",{\"_index\":117,\"name\":{\"234\":{}},\"comment\":{}}],[\"todate\",{\"_index\":67,\"name\":{\"77\":{}},\"comment\":{}}],[\"toisostring\",{\"_index\":56,\"name\":{\"66\":{}},\"comment\":{}}],[\"tojson\",{\"_index\":57,\"name\":{\"67\":{}},\"comment\":{}}],[\"tostring\",{\"_index\":66,\"name\":{\"76\":{},\"227\":{}},\"comment\":{}}],[\"tue\",{\"_index\":122,\"name\":{\"244\":{}},\"comment\":{}}],[\"tz\",{\"_index\":96,\"name\":{\"210\":{},\"274\":{},\"281\":{}},\"comment\":{}}],[\"utc\",{\"_index\":142,\"name\":{\"273\":{}},\"comment\":{}}],[\"validate\",{\"_index\":82,\"name\":{\"98\":{},\"115\":{},\"132\":{},\"149\":{},\"166\":{},\"184\":{},\"201\":{}},\"comment\":{}}],[\"validchars\",{\"_index\":76,\"name\":{\"86\":{},\"103\":{},\"120\":{},\"137\":{},\"154\":{},\"172\":{},\"189\":{},\"301\":{}},\"comment\":{}}],[\"value\",{\"_index\":153,\"name\":{\"293\":{}},\"comment\":{}}],[\"values\",{\"_index\":79,\"name\":{\"90\":{},\"92\":{},\"107\":{},\"109\":{},\"125\":{},\"130\":{},\"141\":{},\"143\":{},\"158\":{},\"160\":{},\"176\":{},\"178\":{},\"193\":{},\"195\":{},\"321\":{}},\"comment\":{}}],[\"variables\",{\"_index\":166,\"name\":{\"312\":{}},\"comment\":{}}],[\"wed\",{\"_index\":123,\"name\":{\"245\":{}},\"comment\":{}}],[\"weekdays\",{\"_index\":136,\"name\":{\"258\":{}},\"comment\":{}}],[\"weekends\",{\"_index\":137,\"name\":{\"259\":{}},\"comment\":{}}],[\"weekly\",{\"_index\":131,\"name\":{\"253\":{}},\"comment\":{}}],[\"wildcard\",{\"_index\":80,\"name\":{\"91\":{},\"108\":{},\"124\":{},\"142\":{},\"159\":{},\"177\":{},\"194\":{},\"320\":{}},\"comment\":{}}],[\"year\",{\"_index\":119,\"name\":{\"240\":{}},\"comment\":{}}],[\"yearly\",{\"_index\":128,\"name\":{\"250\":{}},\"comment\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 00000000..5b967176 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1365 @@ +:root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + --light-color-warning-text: #222; + --light-color-background-warning: #e6e600; + --light-color-icon-background: var(--light-color-background); + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-accent); + --light-color-text: #222; + --light-color-text-aside: #6e6e6e; + --light-color-link: #1f70c2; + + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: var(--light-color-ts-variable); + --light-color-ts-method: var(--light-color-ts-function); + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var(--light-color-ts-constructor); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: var(--light-color-ts-type-alias); + --light-color-ts-accessor: var(--light-color-ts-property); + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + /* object literal not included as it is not used and will be removed in 0.25 */ + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: #5d5d6a; + --dark-color-text: #f5f5f5; + --dark-color-text-aside: #dddddd; + --dark-color-link: #00aff4; + + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: var(--dark-color-ts-variable); + --dark-color-ts-method: var(--dark-color-ts-function); + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: var(--dark-color-ts-type-alias); + --dark-color-ts-accessor: var(--dark-color-ts-property); + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + /* object literal not included as it is not used and will be removed in 0.25 */ + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } +} + +html { + color-scheme: var(--color-scheme); +} + +body { + margin: 0; +} + +:root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); +} + +:root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); +} + +.always-visible, +.always-visible .tsd-signatures { + display: inherit !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 > a, +h2 > a, +h3 > a, +h4 > a, +h5 > a, +h6 > a { + text-decoration: none; + color: var(--color-text); +} + +h1 { + font-size: 1.875rem; + margin: 0.67rem 0; +} + +h2 { + font-size: 1.5rem; + margin: 0.83rem 0; +} + +h3 { + font-size: 1.25rem; + margin: 1rem 0; +} + +h4 { + font-size: 1.05rem; + margin: 1.33rem 0; +} + +h5 { + font-size: 1rem; + margin: 1.5rem 0; +} + +h6 { + font-size: 0.875rem; + margin: 2.33rem 0; +} + +.uppercase { + text-transform: uppercase; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1700px; + padding: 0 2rem; +} + +/* Footer */ +.tsd-generator { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: 3.5rem; +} + +.tsd-generator > p { + margin-top: 0; + margin-bottom: 0; + padding: 0 1rem; +} + +.container-main { + margin: 0 auto; + /* toolbar, footer, margin */ + min-height: calc(100vh - 41px - 56px - 4rem); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; +} + +pre { + position: relative; + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); +} +pre code { + padding: 0; + font-size: 100%; +} +pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; +} +pre:hover > button, +pre > button.visible { + opacity: 1; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +.tsd-comment-tags { + display: flex; + flex-direction: column; +} +dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; +} +dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; +} +dl.tsd-comment-tag-group dd { + margin: 0; +} +code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; +} +h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; +} + +dl.tsd-comment-tag-group dd:before, +dl.tsd-comment-tag-group dd:after { + content: " "; +} +dl.tsd-comment-tag-group dd pre, +dl.tsd-comment-tag-group dd:after { + clear: both; +} +dl.tsd-comment-tag-group p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; +} +.tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; +} +.tsd-filter-input { + display: flex; + width: fit-content; + width: -moz-fit-content; + align-items: center; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + cursor: pointer; +} +.tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; +} +.tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; +} +.tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; +} +.tsd-filter-input input[type="checkbox"]:focus + svg { + transform: scale(0.95); +} +.tsd-filter-input input[type="checkbox"]:focus:not(:focus-visible) + svg { + transform: scale(1); +} +.tsd-checkbox-background { + fill: var(--color-accent); +} +input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; +} +.tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); +} + +.tsd-theme-toggle { + padding-top: 0.75rem; +} +.tsd-theme-toggle > h4 { + display: inline; + vertical-align: middle; + margin-right: 0.75rem; +} + +.tsd-hierarchy { + list-style: square; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-panel-group.tsd-index-group { + margin-bottom: 0; +} +.tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; +} +@media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } +} +@media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } +} +.tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: relative; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} + +.tsd-navigation.settings { + margin: 1rem 0; +} +.tsd-navigation > a, +.tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.5rem); +} +.tsd-navigation a, +.tsd-navigation summary > span, +.tsd-page-navigation a { + display: inline-flex; + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; +} +.tsd-navigation a.current, +.tsd-page-navigation a.current { + background: var(--color-active-menu-item); +} +.tsd-navigation a:hover, +.tsd-page-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul, +.tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li, +.tsd-page-navigation li { + padding: 0; + max-width: 100%; +} +.tsd-nested-navigation { + margin-left: 3rem; +} +.tsd-nested-navigation > li > details { + margin-left: -1.5rem; +} +.tsd-small-nested-navigation { + margin-left: 1.5rem; +} +.tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; +} + +.tsd-nested-navigation > li > a, +.tsd-nested-navigation > li > span { + width: calc(100% - 1.75rem - 0.5rem); +} + +.tsd-page-navigation ul { + padding-left: 1.75rem; +} + +#tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; +} +#tsd-sidebar-links a:last-of-type { + margin-bottom: 0; +} + +a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); +} +.tsd-accordion-summary { + list-style-type: none; + display: flex; + align-items: center; +} +.tsd-accordion-summary, +.tsd-accordion-summary a { + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + + cursor: pointer; +} +.tsd-accordion-summary a { + flex-grow: 1; +} +.tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} +.tsd-index-accordion .tsd-accordion-summary > svg { + margin-left: 0.25rem; +} +.tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; +} +.tsd-index-heading { + margin-top: 1.5rem; + margin-bottom: 0.75rem; +} + +.tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; +} +.tsd-kind-icon path { + transform-origin: center; + transform: scale(1.1); +} +.tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; +} + +.tsd-panel { + margin-bottom: 2.5rem; +} +.tsd-panel.tsd-member { + margin-bottom: 4rem; +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; +} + +.tsd-panel-group { + margin: 4rem 0; +} +.tsd-panel-group.tsd-index-group { + margin: 2rem 0; +} +.tsd-panel-group.tsd-index-group details { + margin: 2rem 0; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 2.5rem; + height: 100%; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title, +#tsd-toolbar-links a { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-background-secondary); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-accent); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-accent); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title, +#tsd-search.has-focus #tsd-toolbar-links a { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +#tsd-toolbar-links { + position: absolute; + top: 0; + right: 2rem; + height: 100%; + display: flex; + align-items: center; + justify-content: flex-end; +} +#tsd-toolbar-links a { + margin-left: 1.5rem; +} +#tsd-toolbar-links a:hover { + text-decoration: underline; +} + +.tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; +} +.tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; +} +.tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; +} + +ul.tsd-parameter-list, +ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameter-list > li.tsd-parameter-signature, +ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameter-list h5, +ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +.tsd-sources { + margin-top: 1rem; + font-size: 0.875em; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: 1px var(--color-accent) solid; + transition: transform 0.3s ease-in-out; +} +.tsd-page-toolbar a { + color: var(--color-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .tsd-toolbar-contents { + display: flex; + justify-content: space-between; + height: 2.5rem; + margin: 0 auto; +} +.tsd-page-toolbar .table-cell { + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} +.tsd-page-toolbar .tsd-toolbar-icon { + box-sizing: border-box; + line-height: 0; + padding: 12px 0; +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-accent); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} + +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} + +.deprecated { + text-decoration: line-through; +} + +.warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); +} + +.tsd-kind-project { + color: var(--color-ts-project); +} +.tsd-kind-module { + color: var(--color-ts-module); +} +.tsd-kind-namespace { + color: var(--color-ts-namespace); +} +.tsd-kind-enum { + color: var(--color-ts-enum); +} +.tsd-kind-enum-member { + color: var(--color-ts-enum-member); +} +.tsd-kind-variable { + color: var(--color-ts-variable); +} +.tsd-kind-function { + color: var(--color-ts-function); +} +.tsd-kind-class { + color: var(--color-ts-class); +} +.tsd-kind-interface { + color: var(--color-ts-interface); +} +.tsd-kind-constructor { + color: var(--color-ts-constructor); +} +.tsd-kind-property { + color: var(--color-ts-property); +} +.tsd-kind-method { + color: var(--color-ts-method); +} +.tsd-kind-call-signature { + color: var(--color-ts-call-signature); +} +.tsd-kind-index-signature { + color: var(--color-ts-index-signature); +} +.tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); +} +.tsd-kind-parameter { + color: var(--color-ts-parameter); +} +.tsd-kind-type-literal { + color: var(--color-ts-type-literal); +} +.tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); +} +.tsd-kind-accessor { + color: var(--color-ts-accessor); +} +.tsd-kind-get-signature { + color: var(--color-ts-get-signature); +} +.tsd-kind-set-signature { + color: var(--color-ts-set-signature); +} +.tsd-kind-type-alias { + color: var(--color-ts-type-alias); +} + +/* if we have a kind icon, don't color the text by kind */ +.tsd-kind-icon ~ span { + color: var(--color-text); +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); +} + +*::-webkit-scrollbar { + width: 0.75rem; +} + +*::-webkit-scrollbar-track { + background: var(--color-icon-background); +} + +*::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); +} + +/* mobile */ +@media (max-width: 769px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } + + .container-main { + display: flex; + } + html .col-content { + float: none; + max-width: 100%; + width: 100%; + } + html .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + html .col-sidebar > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +/* one sidebar */ +@media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + margin: 2rem auto; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } +} +@media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + padding-top: 1rem; + } + .site-menu { + margin-top: 1rem; + } +} + +/* two sidebars */ +@media (min-width: 1200px) { + .container-main { + grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax(0, 20rem); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 1rem 0; + } + + .page-menu, + .site-menu { + max-height: calc(100vh - 2rem - 42px); + overflow: auto; + position: sticky; + top: 42px; + } +} diff --git a/docs/classes/CronDate.html b/docs/classes/CronDate.html new file mode 100644 index 00000000..52995d35 --- /dev/null +++ b/docs/classes/CronDate.html @@ -0,0 +1,851 @@ +CronDate | 'CronParser'
+
+ +
+
+
+
+ +

Class CronDate

+
+

CronDate class that wraps the Luxon DateTime object to provide +a consistent API for working with dates and times in the context of cron.

+
+
+

Hierarchy

+
    +
  • CronDate
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +

    Constructs a new CronDate instance.

    +
    +
    +

    Parameters

    +
      +
    • +
      Optional timestamp: string | number | Date | CronDate
      +

      The timestamp to initialize the CronDate with.

      +
    • +
    • +
      Optional tz: string
      +

      The timezone to use for the CronDate.

      +
    +

    Returns CronDate

+
+

Properties

+
+ +
#date: DateTime
+
+ +
#dstEnd: null | number = null
+
+ +
#dstStart: null | number = null
+
+

Accessors

+
+ +
    +
  • get dstEnd(): null | number
  • +
  • +

    Returns daylight savings end time.

    +
    +

    Returns null | number

  • +
  • set dstEnd(value): void
  • +
  • +

    Sets daylight savings end time.

    +
    +
    +

    Parameters

    +
      +
    • +
      value: null | number
    +

    Returns void

+
+ +
    +
  • get dstStart(): null | number
  • +
  • +

    Returns daylight savings start time.

    +
    +

    Returns null | number

  • +
  • set dstStart(value): void
  • +
  • +

    Sets daylight savings start time.

    +
    +
    +

    Parameters

    +
      +
    • +
      value: null | number
    +

    Returns void

+
+

Methods

+
+ +
    + +
  • Private +

    Returns the UTC date.

    +
    +

    Returns DateTime

+
+ +
    + +
  • +

    Adds one day to the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Adds one hour to the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Adds one minute to the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Adds one month to the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Adds one second to the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Adds a unit of time to the current CronDate.

    +
    +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Adds one year to the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Primarily for internal use.

    +
    +
    +

    Parameters

    +
      +
    • +
      op: DateMathOp
      +

      The operation to perform.

      +
    • +
    • +
      unit: TimeUnit
      +

      The unit of time to use.

      +
    • +
    • +
      Optional hoursLength: number
      +

      The length of the hours. Required when unit is not month or day.

      +
    +

    Returns void

+
+ +
    + +
  • +

    Returns the day.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the day of the week.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the year.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the hour.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the milliseconds.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the minutes.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the month.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the seconds.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the time.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC day.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC day of the week.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC year.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC hour.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC minutes.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC month.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Returns the UTC seconds.

    +
    +

    Returns number

+
+ +
    + +
  • +

    Handles a math operation.

    +
    +
    +

    Parameters

    +
      +
    • +
      verb: DateMathOp
      +

      {'add' | 'subtract'}

      +
    • +
    • +
      unit: TimeUnit
      +

      {'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'}

      +
    +

    Returns void

+
+ +
    + +
  • +

    Returns true if the day is the last day of the month.

    +
    +

    Returns boolean

+
+ +
    + +
  • +

    Returns true if the day is the last weekday of the month.

    +
    +

    Returns boolean

+
+ +
    + +
  • +

    Sets the day.

    +
    +
    +

    Parameters

    +
      +
    • +
      d: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the day of the week.

    +
    +
    +

    Parameters

    +
      +
    • +
      d: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the year.

    +
    +
    +

    Parameters

    +
      +
    • +
      y: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the hour.

    +
    +
    +

    Parameters

    +
      +
    • +
      h: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the milliseconds.

    +
    +
    +

    Parameters

    +
      +
    • +
      s: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the minutes.

    +
    +
    +

    Parameters

    +
      +
    • +
      m: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the month.

    +
    +
    +

    Parameters

    +
      +
    • +
      m: number
    +

    Returns void

+
+ +
    + +
  • +

    Sets the seconds.

    +
    +
    +

    Parameters

    +
      +
    • +
      s: number
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts one day from the current CronDate. +If the day is 1, it will subtract one month instead.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts one hour from the current CronDate. +If the hour is 0, it will subtract one day instead.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts one minute from the current CronDate. +If the minute is 0, it will subtract one hour instead.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts one month from the current CronDate. +If the month is 1, it will subtract one year instead.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts one second from the current CronDate. +If the second is 0, it will subtract one minute instead.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts a unit of time from the current CronDate.

    +
    +
    +

    Parameters

    +
    +

    Returns void

+
+ +
    + +
  • +

    Subtracts one year from the current CronDate.

    +
    +

    Returns void

+
+ +
    + +
  • +

    Returns the date as a Date object.

    +
    +

    Returns Date

+
+ +
    + +
  • +

    Returns the UTC milliseconds.

    +
    +

    Returns null | string

+
+ +
    + +
  • +

    Returns the date as a JSON string.

    +
    +

    Returns null | string

+
+ +
    + +
  • +

    Returns the date as a string.

    +
    +

    Returns string

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronDayOfMonth.html b/docs/classes/CronDayOfMonth.html new file mode 100644 index 00000000..ce51149f --- /dev/null +++ b/docs/classes/CronDayOfMonth.html @@ -0,0 +1,344 @@ +CronDayOfMonth | 'CronParser'
+
+ +
+
+
+
+ +

Class CronDayOfMonth

+
+

Represents the "day of the month" field within a cron expression.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronDayOfTheWeek.html b/docs/classes/CronDayOfTheWeek.html new file mode 100644 index 00000000..f1851699 --- /dev/null +++ b/docs/classes/CronDayOfTheWeek.html @@ -0,0 +1,342 @@ +CronDayOfTheWeek | 'CronParser'
+
+ +
+
+
+
+ +

Class CronDayOfTheWeek

+
+

Represents the "day of the week" field within a cron expression.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
    + +
  • +

    CronDayOfTheWeek constructor. Initializes the "day of the week" field with the provided values.

    +
    +
    +

    Parameters

    +
      +
    • +
      values: (0 | 1 | 7 | 2 | 3 | 4 | 5 | 6)[]
      +

      Values for the "day of the week" field

      +
    • +
    • +
      Optional wildcard: boolean = false
      +

      Whether this field is a wildcard

      +
    +

    Returns CronDayOfTheWeek

+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get values(): (0 | 1 | 7 | 2 | 3 | 4 | 5 | 6)[]
  • +
  • +

    Returns an array of allowed values for the "day of the week" field.

    +
    +

    Returns (0 | 1 | 7 | 2 | 3 | 4 | 5 | 6)[]

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronExpression.html b/docs/classes/CronExpression.html new file mode 100644 index 00000000..3daace09 --- /dev/null +++ b/docs/classes/CronExpression.html @@ -0,0 +1,596 @@ +CronExpression | 'CronParser'
+
+ +
+
+
+
+ +

Class CronExpression

+
+

Class representing a Cron expression.

+
+
+

Hierarchy

+
    +
  • CronExpression
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Properties

+
+ +
#currentDate: CronDate
+
+ +
#endDate: null | CronDate
+
+ +
+
+ +
#hasIterated: boolean
+
+ +
#isIterator: boolean
+
+ +
#nthDayOfWeek: number
+
+ +
+
+ +
#startDate: null | CronDate
+
+ +
#tz?: string
+
+

Accessors

+
+ +
+
+

Methods

+
+ +
    + +
  • Private +

    Finds the next or previous schedule based on the cron expression.

    +
    +
    +

    Parameters

    +
      +
    • +
      Optional reverse: boolean = false
      +

      If true, finds the previous schedule; otherwise, finds the next schedule.

      +
    +

    Returns CronDate

      +
    • The next or previous schedule date.
    • +
    +
+
+ +
    + +
  • Private +

    Determines if the given date matches the cron expression's day of month and day of week fields.

    +

    The function checks the following rules: +Rule 1: If both "day of month" and "day of week" are restricted (not wildcard), then one or both must match the current day. +Rule 2: If "day of month" is restricted and "day of week" is not restricted, then "day of month" must match the current day. +Rule 3: If "day of month" is a wildcard, "day of week" is not a wildcard, and "day of week" matches the current day, then the match is accepted. +If none of the rules match, the match is rejected.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      currentDate: CronDate
      +

      The current date to be evaluated against the cron expression.

      +
    +

    Returns boolean

    Returns true if the current date matches the cron expression's day of month and day of week fields, otherwise false.

    +
+
+ +
    + +
  • +

    Determines if the current hour matches the cron expression.

    +
    +
    +

    Parameters

    +
      +
    • +
      currentDate: CronDate
      +

      The current date object.

      +
    • +
    • +
      dateMathVerb: DateMathOp
      +

      The date math operation enumeration value.

      +
    • +
    • +
      reverse: boolean
      +

      A flag indicating whether the matching should be done in reverse order.

      +
    +

    Returns boolean

      +
    • True if the current hour matches the cron expression; otherwise, false.
    • +
    +
+
+ +
    + +
  • +

    Check if there is a next scheduled date based on the current date and cron expression.

    + +

    Memberof

    CronExpression

    +
    +

    Returns boolean

      +
    • Returns true if there is a next scheduled date, false otherwise.
    • +
    +
+
+ +
    + +
  • +

    Check if there is a previous scheduled date based on the current date and cron expression.

    + +

    Memberof

    CronExpression

    +
    +

    Returns boolean

      +
    • Returns true if there is a previous scheduled date, false otherwise.
    • +
    +
+
+ +
    + +
  • +

    Check if the cron expression includes the given date

    +
    +
    +

    Parameters

    +
    +

    Returns boolean

+
+ +
    + +
  • +

    Iterate over a specified number of steps and optionally execute a callback function for each step.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      steps: number
      +

      The number of steps to iterate. Positive value iterates forward, negative value iterates backward.

      +
    • +
    • +
      Optional callback: CronExpressionIteratorCallback
      +

      Optional callback function to be executed for each step.

      +
    +

    Returns (CronDate | CronExpressionIterator)[]

      +
    • An array of iterator fields or CronDate objects.
    • +
    +
+
+ +
    + +
  • +

    Find the next scheduled date based on the cron expression.

    + +

    Memberof

    CronExpression

    +
    +

    Returns CronDate | {
        done: boolean;
        value: CronDate;
    }

      +
    • The next scheduled date or an ES6 compatible iterator object.
    • +
    +
+
+ +
    + +
  • +

    Find the previous scheduled date based on the cron expression.

    + +

    Memberof

    CronExpression

    +
    +

    Returns CronDate | {
        done: boolean;
        value: CronDate;
    }

      +
    • The previous scheduled date or an ES6 compatible iterator object.
    • +
    +
+
+ +
    + +
  • +

    Reset the iterators current date to a new date or the initial date.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      Optional newDate: Date | CronDate
      +

      Optional new date to reset to. If not provided, it will reset to the initial date.

      +
    +

    Returns void

+
+ +
    + +
  • +

    Generate a string representation of the cron expression.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      Optional includeSeconds: boolean = false
      +

      Whether to include the seconds field in the string representation.

      +
    +

    Returns string

      +
    • The string representation of the cron expression.
    • +
    +
+
+ +
    + +
  • +

    Returns the string representation of the cron expression.

    +
    +

    Returns string

      +
    • The next schedule date.
    • +
    +
+
+ +
    + +
  • Private +

    Checks if the 'L' character is present in any of the given expressions.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      expressions: (string | number)[]
      +

      An array of expressions to be checked.

      +
    +

    Returns boolean

      +
    • True if the 'L' character is present in any of the expressions; otherwise, false.
    • +
    +
+
+ +
    + +
  • Private +

    Determines if the current date matches the last specified weekday of the month.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      expressions: (string | number)[]
      +

      An array of expressions containing weekdays and "L" for the last weekday.

      +
    • +
    • +
      currentDate: CronDate
      +

      The current date object.

      +
    +

    Returns boolean

      +
    • True if the current date matches the last specified weekday of the month; otherwise, false.
    • +
    +
+
+ +
    + +
  • Private +

    Checks if the given value matches any element in the sequence.

    + +

    Memberof

    CronExpression

    +
    +
    +

    Parameters

    +
      +
    • +
      value: number
      +

      The value to be matched.

      +
    • +
    • +
      sequence: CronFieldType
      +

      The sequence to be checked against.

      +
    +

    Returns boolean

      +
    • True if the value matches an element in the sequence; otherwise, false.
    • +
    +
+
+ +
+
+ +
    + +
  • +

    Asynchronously parses the input cron expression string.

    +
    +
    +

    Parameters

    +
      +
    • +
      expression: string
      +

      The input cron expression string.

      +
    • +
    • +
      Optional options: CronParseOptions = {}
      +

      Optional parsing options.

      +
    +

    Returns CronExpression

      +
    • A new CronExpression instance.
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronField.html b/docs/classes/CronField.html new file mode 100644 index 00000000..0e173a30 --- /dev/null +++ b/docs/classes/CronField.html @@ -0,0 +1,336 @@ +CronField | 'CronParser'
+
+ +
+
+
+
+ +

Class CronFieldAbstract

+
+

Represents a field within a cron expression. +This is a base class and should not be instantiated directly.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
    + +
  • +

    CronField constructor. Initializes the field with the provided values.

    + +

    Throws

    if the constructor is called directly

    + +

    Throws

    if validation fails

    +
    +
    +

    Parameters

    +
      +
    • +
      values: (string | number)[]
      +

      Values for this field

      +
    • +
    • +
      Optional wildcard: boolean = false
      +

      Whether this field is a wildcard

      +
    +

    Returns CronField

+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronFieldCollection.html b/docs/classes/CronFieldCollection.html new file mode 100644 index 00000000..c154b0d6 --- /dev/null +++ b/docs/classes/CronFieldCollection.html @@ -0,0 +1,406 @@ +CronFieldCollection | 'CronParser'
+
+ +
+
+
+
+ +

Class CronFieldCollection

+
+

Represents a complete set of cron fields.

+
+
+

Hierarchy

+
    +
  • CronFieldCollection
+
+
+
+ +
+
+

Constructors

+
+ +
    + +
  • +

    CronFieldCollection constructor. Initializes the cron fields with the provided values.

    + +

    Throws

    if validation fails

    + +

    Example

    const cronFields = new CronFieldCollection({
    second: new CronSecond([0]),
    minute: new CronMinute([0, 30]),
    hour: new CronHour([9]),
    dayOfMonth: new CronDayOfMonth([15]),
    month: new CronMonth([1]),
    dayOfWeek: new CronDayOfTheWeek([1, 2, 3, 4, 5]),
    })

    console.log(cronFields.second.values); // [0]
    console.log(cronFields.minute.values); // [0, 30]
    console.log(cronFields.hour.values); // [9]
    console.log(cronFields.dayOfMonth.values); // [15]
    console.log(cronFields.month.values); // [1]
    console.log(cronFields.dayOfWeek.values); // [1, 2, 3, 4, 5] +
    +
    +
    +

    Parameters

    +
    +

    Returns CronFieldCollection

+
+

Properties

+
+ +
#dayOfMonth: CronDayOfMonth
+
+ +
#dayOfWeek: CronDayOfTheWeek
+
+ +
#hour: CronHour
+
+ +
#minute: CronMinute
+
+ +
#month: CronMonth
+
+ +
#second: CronSecond
+
+

Accessors

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Returns a string representation of the cron field values.

    +
    +
    +

    Parameters

    +
      +
    • +
      includeSeconds: boolean = false
      +

      Whether to include seconds in the output

      +
    +

    Returns string

    The formatted cron string

    +
+
+ +
    + +
  • +

    Returns a string representation of the cron fields.

    + +

    Static

    +
    +

    Parameters

    +
      +
    • +
      field: CronField
      +

      The cron field to stringify

      +
    +

    Returns string

      +
    • The stringified cron field
    • +
    +
+
+ +
    + +
  • Private +

    Handles a single range.

    +
    +
    +

    Parameters

    +
      +
    • +
      month: (1 | 7 | 12 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11)[]
      +

      The month range.

      +
    • +
    • +
      dayOfMonth: DayOfMonthRange[]
      +

      The day of the month range.

      +
    +

    Returns DayOfMonthRange[]

    The day of the month range.

    +
+
+ +
    + +
  • Private +

    Handles multiple ranges.

    +
    +
    +

    Parameters

    +
      +
    • +
      range: FieldRange
      +

      {start: number, end: number, step: number, count: number} The range to handle.

      +
    • +
    • +
      max: number
      +

      The maximum value for the field.

      +
    +

    Returns string

    The stringified range.

    +
+
+ +
    + +
  • Private +

    Handles a single range.

    +
    +
    +

    Parameters

    +
      +
    • +
      range: FieldRange
      +

      {start: number, end: number, step: number, count: number} The range to handle.

      +
    • +
    • +
      min: number
      +

      The minimum value for the field.

      +
    • +
    • +
      max: number
      +

      The maximum value for the field.

      +
    +

    Returns null | string

    The stringified range or null if it cannot be stringified.

    +
+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronHour.html b/docs/classes/CronHour.html new file mode 100644 index 00000000..c6264d38 --- /dev/null +++ b/docs/classes/CronHour.html @@ -0,0 +1,342 @@ +CronHour | 'CronParser'
+
+ +
+
+
+
+ +

Class CronHour

+
+

Represents the "hour" field within a cron expression.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
    + +
  • +

    CronHour constructor. Initializes the "hour" field with the provided values.

    +
    +
    +

    Parameters

    +
      +
    • +
      values: (0 | 1 | 7 | 12 | 23 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22)[]
      +

      Values for the "hour" field

      +
    • +
    • +
      Optional wildcard: boolean = false
      +

      Whether this field is a wildcard

      +
    +

    Returns CronHour

+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get values(): (0 | 1 | 7 | 12 | 23 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22)[]
  • +
  • +

    Returns an array of allowed values for the "hour" field.

    +
    +

    Returns (0 | 1 | 7 | 12 | 23 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22)[]

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronMinute.html b/docs/classes/CronMinute.html new file mode 100644 index 00000000..47ee864f --- /dev/null +++ b/docs/classes/CronMinute.html @@ -0,0 +1,342 @@ +CronMinute | 'CronParser'
+
+ +
+
+
+
+ +

Class CronMinute

+
+

Represents the "second" field within a cron expression.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
    + +
  • +

    CronSecond constructor. Initializes the "second" field with the provided values.

    +
    +
    +

    Parameters

    +
      +
    • +
      values: (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[]
      +

      Values for the "second" field

      +
    • +
    • +
      Optional wildcard: boolean = false
      +

      Whether this field is a wildcard

      +
    +

    Returns CronMinute

+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get values(): (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[]
  • +
  • +

    Returns an array of allowed values for the "second" field.

    +
    +

    Returns (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[]

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronMonth.html b/docs/classes/CronMonth.html new file mode 100644 index 00000000..c7b584c4 --- /dev/null +++ b/docs/classes/CronMonth.html @@ -0,0 +1,352 @@ +CronMonth | 'CronParser'
+
+ +
+
+
+
+ +

Class CronMonth

+
+

Represents the "day of the month" field within a cron expression.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
    + +
  • +

    CronDayOfMonth constructor. Initializes the "day of the month" field with the provided values.

    +
    +
    +

    Parameters

    +
      +
    • +
      values: (1 | 7 | 12 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11)[]
      +

      Values for the "day of the month" field

      +
    • +
    • +
      Optional wildcard: boolean = false
      +

      Whether this field is a wildcard

      +
    +

    Returns CronMonth

+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get values(): (1 | 7 | 12 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11)[]
  • +
  • +

    Returns an array of allowed values for the "day of the month" field.

    +
    +

    Returns (1 | 7 | 12 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11)[]

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronParser.html b/docs/classes/CronParser.html new file mode 100644 index 00000000..31683d53 --- /dev/null +++ b/docs/classes/CronParser.html @@ -0,0 +1,226 @@ +CronParser | 'CronParser'
+
+ +
+
+
+
+ +

Class CronParser

+
+

Hierarchy

+
    +
  • CronParser
+
+
+
+ +
+
+

Constructors

+
+ +
+
+

Methods

+
+ +
    + +
  • Private +

    Parse crontab entry

    +
    +
    +

    Parameters

    +
      +
    • +
      entry: string
      +

      Crontab file entry/line

      +
    +

    Returns {
        command?: undefined;
        interval: CronExpression;
    } | {
        command: string[];
        interval: CronExpression;
    }

+
+ +
+
+ +
    + +
  • +

    Wrapper for CronExpression.parse method

    +
    +
    +

    Parameters

    +
      +
    • +
      expression: string
      +

      Input expression

      +
    • +
    • +
      Optional options: object
      +

      Parsing options

      +
    +

    Returns CronExpression

+
+ +
    + +
  • +

    Parse crontab file

    +
    +
    +

    Parameters

    +
      +
    • +
      filePath: string
      +

      Path to file

      +
    • +
    • +
      callback: ((error, data?) => void)
      +
        +
      • +
          +
        • (error, data?): void
        • +
        • +
          +

          Parameters

          +
          +

          Returns void

    +

    Returns void

+
+ +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/classes/CronSecond.html b/docs/classes/CronSecond.html new file mode 100644 index 00000000..65a75195 --- /dev/null +++ b/docs/classes/CronSecond.html @@ -0,0 +1,342 @@ +CronSecond | 'CronParser'
+
+ +
+
+
+
+ +

Class CronSecond

+
+

Represents the "second" field within a cron expression.

+
+
+

Hierarchy

+
+
+
+
+ +
+
+

Constructors

+
+
+

Properties

+
+
+

Accessors

+
+
+

Methods

+
+
+

Constructors

+
+ +
    + +
  • +

    CronSecond constructor. Initializes the "second" field with the provided values.

    +
    +
    +

    Parameters

    +
      +
    • +
      values: (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[]
      +

      Values for the "second" field

      +
    • +
    • +
      Optional wildcard: boolean = false
      +

      Whether this field is a wildcard

      +
    +

    Returns CronSecond

+
+

Properties

+
+ +
#values: (string | number)[] = []
+
+ +
#wildcard: boolean = false
+
+

Accessors

+
+ +
    +
  • get chars(): readonly string[]
  • +
  • +

    Returns an array of allowed special characters for this field.

    +
    +

    Returns readonly string[]

+
+ +
    +
  • get isWildcard(): boolean
  • +
  • +

    Indicates whether this field is a wildcard.

    +
    +

    Returns boolean

+
+ +
    +
  • get max(): number
  • +
  • +

    Returns the maximum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get min(): number
  • +
  • +

    Returns the minimum value allowed for this field.

    +
    +

    Returns number

+
+ +
    +
  • get values(): (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[]
  • +
  • +

    Returns an array of allowed values for the "second" field.

    +
    +

    Returns (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[]

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
    +
  • get validChars(): RegExp
  • +
  • +

    Returns the regular expression used to validate this field.

    +
    +

    Returns RegExp

+
+

Methods

+
+ +
+
+ +
    + +
  • +

    Validates the field values against the allowed range and special characters.

    + +

    Throws

    if validation fails

    +
    +

    Returns void

+
+ +
    + +
  • +

    Helper function to sort values in ascending order.

    +
    +
    +

    Parameters

    +
      +
    • +
      a: string | number
      +

      First value to compare

      +
    • +
    • +
      b: string | number
      +

      Second value to compare

      +
    +

    Returns number

      +
    • A negative, zero, or positive value, depending on the sort order
    • +
    +
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/DateMathOp.html b/docs/enums/DateMathOp.html new file mode 100644 index 00000000..e44e06c2 --- /dev/null +++ b/docs/enums/DateMathOp.html @@ -0,0 +1,105 @@ +DateMathOp | 'CronParser'
+
+ +
+
+
+
+ +

Enumeration DateMathOp

+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
Add: "Add"
+
+ +
Subtract: "Subtract"
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/DayOfWeek.html b/docs/enums/DayOfWeek.html new file mode 100644 index 00000000..cf23a52d --- /dev/null +++ b/docs/enums/DayOfWeek.html @@ -0,0 +1,140 @@ +DayOfWeek | 'CronParser'
+
+ +
+
+
+
+ +

Enumeration DayOfWeek

+
+
+
+ +
+
+

Enumeration Members

+
fri +mon +sat +sun +thu +tue +wed +
+
+

Enumeration Members

+
+ +
fri: 5
+
+ +
mon: 1
+
+ +
sat: 6
+
+ +
sun: 0
+
+ +
thu: 4
+
+ +
tue: 2
+
+ +
wed: 3
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/PredefinedExpressions.html b/docs/enums/PredefinedExpressions.html new file mode 100644 index 00000000..ccee61e2 --- /dev/null +++ b/docs/enums/PredefinedExpressions.html @@ -0,0 +1,161 @@ +PredefinedExpressions | 'CronParser'
+
+ +
+
+
+
+ +

Enumeration PredefinedExpressions

+
+
+
+ +
+
+

Enumeration Members

+
+ +
@annually: "0 0 0 1 1 *"
+
+ +
@daily: "0 0 0 * * *"
+
+ +
@hourly: "0 0 * * * *"
+
+ +
@minutely: "0 * * * * *"
+
+ +
@monthly: "0 0 0 1 * *"
+
+ +
@secondly: "* * * * * *"
+
+ +
@weekdays: "0 0 0 * * 1-5"
+
+ +
@weekends: "0 0 0 * * 0,6"
+
+ +
@weekly: "0 0 0 * * 0"
+
+ +
@yearly: "0 0 0 1 1 *"
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/enums/TimeUnit.html b/docs/enums/TimeUnit.html new file mode 100644 index 00000000..f066eb7a --- /dev/null +++ b/docs/enums/TimeUnit.html @@ -0,0 +1,133 @@ +TimeUnit | 'CronParser'
+
+ +
+
+
+
+ +

Enumeration TimeUnit

+
+
+
+ +
+
+

Enumeration Members

+
+
+

Enumeration Members

+
+ +
Day: "Day"
+
+ +
Hour: "Hour"
+
+ +
Minute: "Minute"
+
+ +
Month: "Month"
+
+ +
Second: "Second"
+
+ +
Year: "Year"
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..deb924ba --- /dev/null +++ b/docs/index.html @@ -0,0 +1,138 @@ +'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/CronExpressionIterator.html b/docs/interfaces/CronExpressionIterator.html new file mode 100644 index 00000000..59496a08 --- /dev/null +++ b/docs/interfaces/CronExpressionIterator.html @@ -0,0 +1,109 @@ +CronExpressionIterator | 'CronParser'
+
+ +
+
+
+
+ +

Interface CronExpressionIterator

+
+

Hierarchy

+
    +
  • CronExpressionIterator
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
done: boolean
+
+ +
value: CronDate
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/CronExpressionOptions.html b/docs/interfaces/CronExpressionOptions.html new file mode 100644 index 00000000..eb9ff7c0 --- /dev/null +++ b/docs/interfaces/CronExpressionOptions.html @@ -0,0 +1,151 @@ +CronExpressionOptions | 'CronParser'
+
+ +
+
+
+
+ +

Interface CronExpressionOptions

+
+

Hierarchy

+
    +
  • CronExpressionOptions
+
+
+
+ +
+
+

Properties

+
+ +
currentDate?: string | number | Date | CronDate
+
+ +
endDate?: string | number | Date | CronDate
+
+ +
expression?: string
+
+ +
iterator?: boolean
+
+ +
nthDayOfWeek?: number
+
+ +
startDate?: string | number | Date | CronDate
+
+ +
tz?: string
+
+ +
utc?: boolean
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/CronFieldCollectionOptions.html b/docs/interfaces/CronFieldCollectionOptions.html new file mode 100644 index 00000000..e76b4c4f --- /dev/null +++ b/docs/interfaces/CronFieldCollectionOptions.html @@ -0,0 +1,137 @@ +CronFieldCollectionOptions | 'CronParser'
+
+ +
+
+
+
+ +

Interface CronFieldCollectionOptions

+
+

Hierarchy

+
    +
  • CronFieldCollectionOptions
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
+
+ +
dayOfWeek: CronDayOfTheWeek | (0 | 1 | 7 | 2 | 3 | 4 | 5 | 6)[]
+
+ +
hour: CronHour | (0 | 1 | 7 | 12 | 23 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22)[]
+
+ +
minute: (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[] | CronMinute
+
+ +
month: CronMonth | (1 | 7 | 12 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11)[]
+
+ +
second: (0 | 1 | 7 | 12 | 23 | 31 | 59 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58)[] | CronSecond
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/CronParseOptions.html b/docs/interfaces/CronParseOptions.html new file mode 100644 index 00000000..1008bb33 --- /dev/null +++ b/docs/interfaces/CronParseOptions.html @@ -0,0 +1,151 @@ +CronParseOptions | 'CronParser'
+
+ +
+
+
+
+ +

Interface CronParseOptions

+
+

Hierarchy

+
    +
  • CronParseOptions
+
+
+
+ +
+
+

Properties

+
+ +
currentDate?: string | number | Date | CronDate
+
+ +
endDate?: string | number | Date | CronDate
+
+ +
expression?: string
+
+ +
iterator?: boolean
+
+ +
nthDayOfWeek?: number
+
+ +
startDate?: string | number | Date | CronDate
+
+ +
strict?: boolean
+
+ +
tz?: string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/interfaces/FieldRange.html b/docs/interfaces/FieldRange.html new file mode 100644 index 00000000..41013a23 --- /dev/null +++ b/docs/interfaces/FieldRange.html @@ -0,0 +1,123 @@ +FieldRange | 'CronParser'
+
+ +
+
+
+
+ +

Interface FieldRange

+
+

Hierarchy

+
    +
  • FieldRange
+
+
+
+ +
+
+

Properties

+
+
+

Properties

+
+ +
count: number
+
+ +
end?: number
+
+ +
start: number | CronChars
+
+ +
step?: number
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/CronChars.html b/docs/types/CronChars.html new file mode 100644 index 00000000..78bd3b62 --- /dev/null +++ b/docs/types/CronChars.html @@ -0,0 +1,78 @@ +CronChars | 'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/CronConstraints.html b/docs/types/CronConstraints.html new file mode 100644 index 00000000..a49c91f1 --- /dev/null +++ b/docs/types/CronConstraints.html @@ -0,0 +1,89 @@ +CronConstraints | 'CronParser'
+
+ +
+
+
+
+ +

Type alias CronConstraints

+
CronConstraints: {
    chars: readonly CronChars[];
    max: CronMax;
    min: CronMin;
    validChars: RegExp;
}
+
+

Type declaration

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/CronExpressionIteratorCallback.html b/docs/types/CronExpressionIteratorCallback.html new file mode 100644 index 00000000..499c1cfe --- /dev/null +++ b/docs/types/CronExpressionIteratorCallback.html @@ -0,0 +1,93 @@ +CronExpressionIteratorCallback | 'CronParser'
+
+ +
+
+
+
+ +

Type alias CronExpressionIteratorCallback

+
CronExpressionIteratorCallback: ((item, index) => void)
+
+

Type declaration

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/CronMax.html b/docs/types/CronMax.html new file mode 100644 index 00000000..0faaee27 --- /dev/null +++ b/docs/types/CronMax.html @@ -0,0 +1,78 @@ +CronMax | 'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/CronMin.html b/docs/types/CronMin.html new file mode 100644 index 00000000..d1fa3cc5 --- /dev/null +++ b/docs/types/CronMin.html @@ -0,0 +1,78 @@ +CronMin | 'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/HourRange.html b/docs/types/HourRange.html new file mode 100644 index 00000000..716226c1 --- /dev/null +++ b/docs/types/HourRange.html @@ -0,0 +1,78 @@ +HourRange | 'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/IntRange.html b/docs/types/IntRange.html new file mode 100644 index 00000000..e858c7fc --- /dev/null +++ b/docs/types/IntRange.html @@ -0,0 +1,87 @@ +IntRange | 'CronParser'
+
+ +
+
+
+
+ +

Type alias IntRange<FROM, TO, ACC>

+
IntRange<FROM, TO, ACC>: FROM["length"] extends TO
    ? ACC | TO
    : IntRange<[...FROM, 1], TO, ACC | FROM["length"]>
+
+

Type Parameters

+
    +
  • +

    FROM extends number[]

  • +
  • +

    TO extends number

  • +
  • +

    ACC extends number = never

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/MonthRange.html b/docs/types/MonthRange.html new file mode 100644 index 00000000..afb843a9 --- /dev/null +++ b/docs/types/MonthRange.html @@ -0,0 +1,78 @@ +MonthRange | 'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/ParseStringResponse.html b/docs/types/ParseStringResponse.html new file mode 100644 index 00000000..69cf830a --- /dev/null +++ b/docs/types/ParseStringResponse.html @@ -0,0 +1,93 @@ +ParseStringResponse | 'CronParser'
+
+ +
+
+
+
+ +

Type alias ParseStringResponse

+
ParseStringResponse: {
    errors: {
        [key: string]: unknown;
    };
    expressions: CronExpression[];
    variables: {
        [key: string]: number | string;
    };
}
+
+

Type declaration

+
    +
  • +
    errors: {
        [key: string]: unknown;
    }
    +
      +
    • +
      [key: string]: unknown
  • +
  • +
    expressions: CronExpression[]
  • +
  • +
    variables: {
        [key: string]: number | string;
    }
    +
      +
    • +
      [key: string]: number | string
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/RangeFrom.html b/docs/types/RangeFrom.html new file mode 100644 index 00000000..43131177 --- /dev/null +++ b/docs/types/RangeFrom.html @@ -0,0 +1,85 @@ +RangeFrom | 'CronParser'
+
+ +
+
+
+
+ +

Type alias RangeFrom<LENGTH, ACC>

+
RangeFrom<LENGTH, ACC>: ACC["length"] extends LENGTH
    ? ACC
    : RangeFrom<LENGTH, [...ACC, 1]>
+
+

Type Parameters

+
    +
  • +

    LENGTH extends number

  • +
  • +

    ACC extends unknown[] = []

+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/SerializedCronField.html b/docs/types/SerializedCronField.html new file mode 100644 index 00000000..2ce7cd14 --- /dev/null +++ b/docs/types/SerializedCronField.html @@ -0,0 +1,85 @@ +SerializedCronField | 'CronParser'
+
+ +
+
+
+
+ +

Type alias SerializedCronField

+
SerializedCronField: {
    values: (number | string)[];
    wildcard: boolean;
}
+
+

Type declaration

+
    +
  • +
    values: (number | string)[]
  • +
  • +
    wildcard: boolean
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/SerializedCronFields.html b/docs/types/SerializedCronFields.html new file mode 100644 index 00000000..a5a9700b --- /dev/null +++ b/docs/types/SerializedCronFields.html @@ -0,0 +1,93 @@ +SerializedCronFields | 'CronParser'
+
+ +
+
+
+
+ +

Type alias SerializedCronFields

+
SerializedCronFields: {
    dayOfMonth: SerializedCronField;
    dayOfWeek: SerializedCronField;
    hour: SerializedCronField;
    minute: SerializedCronField;
    month: SerializedCronField;
    second: SerializedCronField;
}
+
+

Type declaration

+
+
+
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/docs/types/SixtyRange.html b/docs/types/SixtyRange.html new file mode 100644 index 00000000..7dc80e13 --- /dev/null +++ b/docs/types/SixtyRange.html @@ -0,0 +1,78 @@ +SixtyRange | 'CronParser'
+
+ +
+ +
+

Generated using TypeDoc

+
\ No newline at end of file diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index c9f6f047..00000000 --- a/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './types' diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..76b9f493 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + testMatch: [ + '**/tests/**/*.test.ts' + ], + verbose: false, + testEnvironment: 'node', + transform: { + '^.+\\.ts$': 'ts-jest', + }, + coverageReporters: ['text', 'lcov', 'json-summary'], + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/index.ts', + '!dist/**/*' + ], + coverageThreshold: { + global: { + branches: 95, + functions: 90, + lines: 99, + statements: 99, + }, + }, +}; diff --git a/lib/date.js b/lib/date.js deleted file mode 100644 index c54e3a5b..00000000 --- a/lib/date.js +++ /dev/null @@ -1,252 +0,0 @@ -'use strict'; - -var luxon = require('luxon'); - -CronDate.prototype.addYear = function() { - this._date = this._date.plus({ years: 1 }); -}; - -CronDate.prototype.addMonth = function() { - this._date = this._date.plus({ months: 1 }).startOf('month'); -}; - -CronDate.prototype.addDay = function() { - this._date = this._date.plus({ days: 1 }).startOf('day'); -}; - -CronDate.prototype.addHour = function() { - var prev = this._date; - this._date = this._date.plus({ hours: 1 }).startOf('hour'); - if (this._date <= prev) { - this._date = this._date.plus({ hours: 1 }); - } -}; - -CronDate.prototype.addMinute = function() { - var prev = this._date; - this._date = this._date.plus({ minutes: 1 }).startOf('minute'); - if (this._date < prev) { - this._date = this._date.plus({ hours: 1 }); - } -}; - -CronDate.prototype.addSecond = function() { - var prev = this._date; - this._date = this._date.plus({ seconds: 1 }).startOf('second'); - if (this._date < prev) { - this._date = this._date.plus({ hours: 1 }); - } -}; - -CronDate.prototype.subtractYear = function() { - this._date = this._date.minus({ years: 1 }); -}; - -CronDate.prototype.subtractMonth = function() { - this._date = this._date - .minus({ months: 1 }) - .endOf('month') - .startOf('second'); -}; - -CronDate.prototype.subtractDay = function() { - this._date = this._date - .minus({ days: 1 }) - .endOf('day') - .startOf('second'); -}; - -CronDate.prototype.subtractHour = function() { - var prev = this._date; - this._date = this._date - .minus({ hours: 1 }) - .endOf('hour') - .startOf('second'); - if (this._date >= prev) { - this._date = this._date.minus({ hours: 1 }); - } -}; - -CronDate.prototype.subtractMinute = function() { - var prev = this._date; - this._date = this._date.minus({ minutes: 1 }) - .endOf('minute') - .startOf('second'); - if (this._date > prev) { - this._date = this._date.minus({ hours: 1 }); - } -}; - -CronDate.prototype.subtractSecond = function() { - var prev = this._date; - this._date = this._date - .minus({ seconds: 1 }) - .startOf('second'); - if (this._date > prev) { - this._date = this._date.minus({ hours: 1 }); - } -}; - -CronDate.prototype.getDate = function() { - return this._date.day; -}; - -CronDate.prototype.getFullYear = function() { - return this._date.year; -}; - -CronDate.prototype.getDay = function() { - var weekday = this._date.weekday; - return weekday == 7 ? 0 : weekday; -}; - -CronDate.prototype.getMonth = function() { - return this._date.month - 1; -}; - -CronDate.prototype.getHours = function() { - return this._date.hour; -}; - -CronDate.prototype.getMinutes = function() { - return this._date.minute; -}; - -CronDate.prototype.getSeconds = function() { - return this._date.second; -}; - -CronDate.prototype.getMilliseconds = function() { - return this._date.millisecond; -}; - -CronDate.prototype.getTime = function() { - return this._date.valueOf(); -}; - -CronDate.prototype.getUTCDate = function() { - return this._getUTC().day; -}; - -CronDate.prototype.getUTCFullYear = function() { - return this._getUTC().year; -}; - -CronDate.prototype.getUTCDay = function() { - var weekday = this._getUTC().weekday; - return weekday == 7 ? 0 : weekday; -}; - -CronDate.prototype.getUTCMonth = function() { - return this._getUTC().month - 1; -}; - -CronDate.prototype.getUTCHours = function() { - return this._getUTC().hour; -}; - -CronDate.prototype.getUTCMinutes = function() { - return this._getUTC().minute; -}; - -CronDate.prototype.getUTCSeconds = function() { - return this._getUTC().second; -}; - -CronDate.prototype.toISOString = function() { - return this._date.toUTC().toISO(); -}; - -CronDate.prototype.toJSON = function() { - return this._date.toJSON(); -}; - -CronDate.prototype.setDate = function(d) { - this._date = this._date.set({ day: d }); -}; - -CronDate.prototype.setFullYear = function(y) { - this._date = this._date.set({ year: y }); -}; - -CronDate.prototype.setDay = function(d) { - this._date = this._date.set({ weekday: d }); -}; - -CronDate.prototype.setMonth = function(m) { - this._date = this._date.set({ month: m + 1 }); -}; - -CronDate.prototype.setHours = function(h) { - this._date = this._date.set({ hour: h }); -}; - -CronDate.prototype.setMinutes = function(m) { - this._date = this._date.set({ minute: m }); -}; - -CronDate.prototype.setSeconds = function(s) { - this._date = this._date.set({ second: s }); -}; - -CronDate.prototype.setMilliseconds = function(s) { - this._date = this._date.set({ millisecond: s }); -}; - -CronDate.prototype._getUTC = function() { - return this._date.toUTC(); -}; - -CronDate.prototype.toString = function() { - return this.toDate().toString(); -}; - -CronDate.prototype.toDate = function() { - return this._date.toJSDate(); -}; - -CronDate.prototype.isLastDayOfMonth = function() { - //next day - var newDate = this._date.plus({ days: 1 }).startOf('day'); - return this._date.month !== newDate.month; -}; - -/** - * Returns true when the current weekday is the last occurrence of this weekday - * for the present month. - */ -CronDate.prototype.isLastWeekdayOfMonth = function() { - // Check this by adding 7 days to the current date and seeing if it's - // a different month - var newDate = this._date.plus({ days: 7 }).startOf('day'); - return this._date.month !== newDate.month; -}; - -function CronDate (timestamp, tz) { - var dateOpts = { zone: tz }; - if (!timestamp) { - this._date = luxon.DateTime.local(); - } else if (timestamp instanceof CronDate) { - this._date = timestamp._date; - } else if (timestamp instanceof Date) { - this._date = luxon.DateTime.fromJSDate(timestamp, dateOpts); - } else if (typeof timestamp === 'number') { - this._date = luxon.DateTime.fromMillis(timestamp, dateOpts); - } else if (typeof timestamp === 'string') { - this._date = luxon.DateTime.fromISO(timestamp, dateOpts); - this._date.isValid || (this._date = luxon.DateTime.fromRFC2822(timestamp, dateOpts)); - this._date.isValid || (this._date = luxon.DateTime.fromSQL(timestamp, dateOpts)); - // RFC2822-like format without the required timezone offset (used in tests) - this._date.isValid || (this._date = luxon.DateTime.fromFormat(timestamp, 'EEE, d MMM yyyy HH:mm:ss', dateOpts)); - } - - if (!this._date || !this._date.isValid) { - throw new Error('CronDate: unhandled timestamp: ' + JSON.stringify(timestamp)); - } - - if (tz && tz !== this._date.zoneName) { - this._date = this._date.setZone(tz); - } -} - -module.exports = CronDate; diff --git a/lib/expression.js b/lib/expression.js deleted file mode 100644 index 0a568531..00000000 --- a/lib/expression.js +++ /dev/null @@ -1,1002 +0,0 @@ -'use strict'; - -// Load Date class extensions -var CronDate = require('./date'); - -var stringifyField = require('./field_stringify'); - -/** - * Cron iteration loop safety limit - */ -var LOOP_LIMIT = 10000; - -/** - * Construct a new expression parser - * - * Options: - * currentDate: iterator start date - * endDate: iterator end date - * - * @constructor - * @private - * @param {Object} fields Expression fields parsed values - * @param {Object} options Parser options - */ -function CronExpression (fields, options) { - this._options = options; - this._utc = options.utc || false; - this._tz = this._utc ? 'UTC' : options.tz; - this._currentDate = new CronDate(options.currentDate, this._tz); - this._startDate = options.startDate ? new CronDate(options.startDate, this._tz) : null; - this._endDate = options.endDate ? new CronDate(options.endDate, this._tz) : null; - this._isIterator = options.iterator || false; - this._hasIterated = false; - this._nthDayOfWeek = options.nthDayOfWeek || 0; - this.fields = CronExpression._freezeFields(fields); -} - -/** - * Field mappings - * @type {Array} - */ -CronExpression.map = [ 'second', 'minute', 'hour', 'dayOfMonth', 'month', 'dayOfWeek' ]; - -/** - * Prefined intervals - * @type {Object} - */ -CronExpression.predefined = { - '@yearly': '0 0 1 1 *', - '@monthly': '0 0 1 * *', - '@weekly': '0 0 * * 0', - '@daily': '0 0 * * *', - '@hourly': '0 * * * *' -}; - -/** - * Fields constraints - * @type {Array} - */ -CronExpression.constraints = [ - { min: 0, max: 59, chars: [] }, // Second - { min: 0, max: 59, chars: [] }, // Minute - { min: 0, max: 23, chars: [] }, // Hour - { min: 1, max: 31, chars: ['L'] }, // Day of month - { min: 1, max: 12, chars: [] }, // Month - { min: 0, max: 7, chars: ['L'] }, // Day of week -]; - -/** - * Days in month - * @type {number[]} - */ -CronExpression.daysInMonth = [ - 31, - 29, - 31, - 30, - 31, - 30, - 31, - 31, - 30, - 31, - 30, - 31 -]; - -/** - * Field aliases - * @type {Object} - */ -CronExpression.aliases = { - month: { - jan: 1, - feb: 2, - mar: 3, - apr: 4, - may: 5, - jun: 6, - jul: 7, - aug: 8, - sep: 9, - oct: 10, - nov: 11, - dec: 12 - }, - - dayOfWeek: { - sun: 0, - mon: 1, - tue: 2, - wed: 3, - thu: 4, - fri: 5, - sat: 6 - } -}; - -/** - * Field defaults - * @type {Array} - */ -CronExpression.parseDefaults = [ '0', '*', '*', '*', '*', '*' ]; - -CronExpression.standardValidCharacters = /^[,*\d/-]+$/; -CronExpression.dayOfWeekValidCharacters = /^[?,*\dL#/-]+$/; -CronExpression.dayOfMonthValidCharacters = /^[?,*\dL/-]+$/; -CronExpression.validCharacters = { - second: CronExpression.standardValidCharacters, - minute: CronExpression.standardValidCharacters, - hour: CronExpression.standardValidCharacters, - dayOfMonth: CronExpression.dayOfMonthValidCharacters, - month: CronExpression.standardValidCharacters, - dayOfWeek: CronExpression.dayOfWeekValidCharacters, -}; - -CronExpression._isValidConstraintChar = function _isValidConstraintChar(constraints, value) { - if (typeof value !== 'string') { - return false; - } - - return constraints.chars.some(function(char) { - return value.indexOf(char) > -1; - }); -}; - -/** - * Parse input interval - * - * @param {String} field Field symbolic name - * @param {String} value Field value - * @param {Array} constraints Range upper and lower constraints - * @return {Array} Sequence of sorted values - * @private - */ -CronExpression._parseField = function _parseField (field, value, constraints) { - // Replace aliases - switch (field) { - case 'month': - case 'dayOfWeek': - var aliases = CronExpression.aliases[field]; - - value = value.replace(/[a-z]{3}/gi, function(match) { - match = match.toLowerCase(); - - if (typeof aliases[match] !== 'undefined') { - return aliases[match]; - } else { - throw new Error('Validation error, cannot resolve alias "' + match + '"'); - } - }); - break; - } - - // Check for valid characters. - if (!(CronExpression.validCharacters[field].test(value))) { - throw new Error('Invalid characters, got value: ' + value); - } - - // Replace '*' and '?' - if (value.indexOf('*') !== -1) { - value = value.replace(/\*/g, constraints.min + '-' + constraints.max); - } else if (value.indexOf('?') !== -1) { - value = value.replace(/\?/g, constraints.min + '-' + constraints.max); - } - - // - // Inline parsing functions - // - // Parser path: - // - parseSequence - // - parseRepeat - // - parseRange - - /** - * Parse sequence - * - * @param {String} val - * @return {Array} - * @private - */ - function parseSequence (val) { - var stack = []; - - function handleResult (result) { - if (result instanceof Array) { // Make sequence linear - for (var i = 0, c = result.length; i < c; i++) { - var value = result[i]; - - if (CronExpression._isValidConstraintChar(constraints, value)) { - stack.push(value); - continue; - } - // Check constraints - if (typeof value !== 'number' || Number.isNaN(value) || value < constraints.min || value > constraints.max) { - throw new Error( - 'Constraint error, got value ' + value + ' expected range ' + - constraints.min + '-' + constraints.max - ); - } - - stack.push(value); - } - } else { // Scalar value - - if (CronExpression._isValidConstraintChar(constraints, result)) { - stack.push(result); - return; - } - - var numResult = +result; - - // Check constraints - if (Number.isNaN(numResult) || numResult < constraints.min || numResult > constraints.max) { - throw new Error( - 'Constraint error, got value ' + result + ' expected range ' + - constraints.min + '-' + constraints.max - ); - } - - if (field === 'dayOfWeek') { - numResult = numResult % 7; - } - - stack.push(numResult); - } - } - - var atoms = val.split(','); - if (!atoms.every(function (atom) { - return atom.length > 0; - })) { - throw new Error('Invalid list value format'); - } - - if (atoms.length > 1) { - for (var i = 0, c = atoms.length; i < c; i++) { - handleResult(parseRepeat(atoms[i])); - } - } else { - handleResult(parseRepeat(val)); - } - - stack.sort(CronExpression._sortCompareFn); - - return stack; - } - - /** - * Parse repetition interval - * - * @param {String} val - * @return {Array} - */ - function parseRepeat (val) { - var repeatInterval = 1; - var atoms = val.split('/'); - - if (atoms.length > 2) { - throw new Error('Invalid repeat: ' + val); - } - - if (atoms.length > 1) { - if (atoms[0] == +atoms[0]) { - atoms = [atoms[0] + '-' + constraints.max, atoms[1]]; - } - return parseRange(atoms[0], atoms[atoms.length - 1]); - } - - return parseRange(val, repeatInterval); - } - - /** - * Parse range - * - * @param {String} val - * @param {Number} repeatInterval Repetition interval - * @return {Array} - * @private - */ - function parseRange (val, repeatInterval) { - var stack = []; - var atoms = val.split('-'); - - if (atoms.length > 1 ) { - // Invalid range, return value - if (atoms.length < 2) { - return +val; - } - - if (!atoms[0].length) { - if (!atoms[1].length) { - throw new Error('Invalid range: ' + val); - } - - return +val; - } - - // Validate range - var min = +atoms[0]; - var max = +atoms[1]; - - if (Number.isNaN(min) || Number.isNaN(max) || - min < constraints.min || max > constraints.max) { - throw new Error( - 'Constraint error, got range ' + - min + '-' + max + - ' expected range ' + - constraints.min + '-' + constraints.max - ); - } else if (min > max) { - throw new Error('Invalid range: ' + val); - } - - // Create range - var repeatIndex = +repeatInterval; - - if (Number.isNaN(repeatIndex) || repeatIndex <= 0) { - throw new Error('Constraint error, cannot repeat at every ' + repeatIndex + ' time.'); - } - - // JS DOW is in range of 0-6 (SUN-SAT) but we also support 7 in the expression - // Handle case when range contains 7 instead of 0 and translate this value to 0 - if (field === 'dayOfWeek' && max % 7 === 0) { - stack.push(0); - } - - for (var index = min, count = max; index <= count; index++) { - var exists = stack.indexOf(index) !== -1; - if (!exists && repeatIndex > 0 && (repeatIndex % repeatInterval) === 0) { - repeatIndex = 1; - stack.push(index); - } else { - repeatIndex++; - } - } - return stack; - } - - return Number.isNaN(+val) ? val : +val; - } - - return parseSequence(value); -}; - -CronExpression._sortCompareFn = function(a, b) { - var aIsNumber = typeof a === 'number'; - var bIsNumber = typeof b === 'number'; - - if (aIsNumber && bIsNumber) { - return a - b; - } - - if (!aIsNumber && bIsNumber) { - return 1; - } - - if (aIsNumber && !bIsNumber) { - return -1; - } - - return a.localeCompare(b); -}; - -CronExpression._handleMaxDaysInMonth = function(mappedFields) { - // Filter out any day of month value that is larger than given month expects - if (mappedFields.month.length === 1) { - var daysInMonth = CronExpression.daysInMonth[mappedFields.month[0] - 1]; - - if (mappedFields.dayOfMonth[0] > daysInMonth) { - throw new Error('Invalid explicit day of month definition'); - } - - return mappedFields.dayOfMonth - .filter(function(dayOfMonth) { - return dayOfMonth === 'L' ? true : dayOfMonth <= daysInMonth; - }) - .sort(CronExpression._sortCompareFn); - } -}; - -CronExpression._freezeFields = function(fields) { - for (var i = 0, c = CronExpression.map.length; i < c; ++i) { - var field = CronExpression.map[i]; // Field name - var value = fields[field]; - fields[field] = Object.freeze(value); - } - return Object.freeze(fields); -}; - -CronExpression.prototype._applyTimezoneShift = function(currentDate, dateMathVerb, method) { - if ((method === 'Month') || (method === 'Day')) { - var prevTime = currentDate.getTime(); - currentDate[dateMathVerb + method](); - var currTime = currentDate.getTime(); - if (prevTime === currTime) { - // Jumped into a not existent date due to a DST transition - if ((currentDate.getMinutes() === 0) && - (currentDate.getSeconds() === 0)) { - currentDate.addHour(); - } else if ((currentDate.getMinutes() === 59) && - (currentDate.getSeconds() === 59)) { - currentDate.subtractHour(); - } - } - } else { - var previousHour = currentDate.getHours(); - currentDate[dateMathVerb + method](); - var currentHour = currentDate.getHours(); - var diff = currentHour - previousHour; - if (diff === 2) { - // Starting DST - if (this.fields.hour.length !== 24) { - // Hour is specified - this._dstStart = currentHour; - } - } else if ((diff === 0) && - (currentDate.getMinutes() === 0) && - (currentDate.getSeconds() === 0)) { - // Ending DST - if (this.fields.hour.length !== 24) { - // Hour is specified - this._dstEnd = currentHour; - } - } - } -}; - - -/** - * Find next or previous matching schedule date - * - * @return {CronDate} - * @private - */ -CronExpression.prototype._findSchedule = function _findSchedule (reverse) { - - /** - * Match field value - * - * @param {String} value - * @param {Array} sequence - * @return {Boolean} - * @private - */ - function matchSchedule (value, sequence) { - for (var i = 0, c = sequence.length; i < c; i++) { - if (sequence[i] >= value) { - return sequence[i] === value; - } - } - - return sequence[0] === value; - } - - /** - * Helps determine if the provided date is the correct nth occurence of the - * desired day of week. - * - * @param {CronDate} date - * @param {Number} nthDayOfWeek - * @return {Boolean} - * @private - */ - function isNthDayMatch(date, nthDayOfWeek) { - if (nthDayOfWeek < 6) { - if ( - date.getDate() < 8 && - nthDayOfWeek === 1 // First occurence has to happen in first 7 days of the month - ) { - return true; - } - - var offset = date.getDate() % 7 ? 1 : 0; // Math is off by 1 when dayOfWeek isn't divisible by 7 - var adjustedDate = date.getDate() - (date.getDate() % 7); // find the first occurance - var occurrence = Math.floor(adjustedDate / 7) + offset; - - return occurrence === nthDayOfWeek; - } - - return false; - } - - /** - * Helper function that checks if 'L' is in the array - * - * @param {Array} expressions - */ - function isLInExpressions(expressions) { - return expressions.length > 0 && expressions.some(function(expression) { - return typeof expression === 'string' && expression.indexOf('L') >= 0; - }); - } - - - // Whether to use backwards directionality when searching - reverse = reverse || false; - var dateMathVerb = reverse ? 'subtract' : 'add'; - - var currentDate = new CronDate(this._currentDate, this._tz); - var startDate = this._startDate; - var endDate = this._endDate; - - // Find matching schedule - var startTimestamp = currentDate.getTime(); - var stepCount = 0; - - function isLastWeekdayOfMonthMatch(expressions) { - return expressions.some(function(expression) { - // There might be multiple expressions and not all of them will contain - // the "L". - if (!isLInExpressions([expression])) { - return false; - } - - // The first character represents the weekday - var weekday = Number.parseInt(expression[0]) % 7; - - if (Number.isNaN(weekday)) { - throw new Error('Invalid last weekday of the month expression: ' + expression); - } - - return currentDate.getDay() === weekday && currentDate.isLastWeekdayOfMonth(); - }); - } - - while (stepCount < LOOP_LIMIT) { - stepCount++; - - // Validate timespan - if (reverse) { - if (startDate && (currentDate.getTime() - startDate.getTime() < 0)) { - throw new Error('Out of the timespan range'); - } - } else { - if (endDate && (endDate.getTime() - currentDate.getTime()) < 0) { - throw new Error('Out of the timespan range'); - } - } - - // Day of month and week matching: - // - // "The day of a command's execution can be specified by two fields -- - // day of month, and day of week. If both fields are restricted (ie, - // aren't *), the command will be run when either field matches the cur- - // rent time. For example, "30 4 1,15 * 5" would cause a command to be - // run at 4:30 am on the 1st and 15th of each month, plus every Friday." - // - // http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 - // - - var dayOfMonthMatch = matchSchedule(currentDate.getDate(), this.fields.dayOfMonth); - if (isLInExpressions(this.fields.dayOfMonth)) { - dayOfMonthMatch = dayOfMonthMatch || currentDate.isLastDayOfMonth(); - } - var dayOfWeekMatch = matchSchedule(currentDate.getDay(), this.fields.dayOfWeek); - if (isLInExpressions(this.fields.dayOfWeek)) { - dayOfWeekMatch = dayOfWeekMatch || isLastWeekdayOfMonthMatch(this.fields.dayOfWeek); - } - var isDayOfMonthWildcardMatch = this.fields.dayOfMonth.length >= CronExpression.daysInMonth[currentDate.getMonth()]; - var isDayOfWeekWildcardMatch = this.fields.dayOfWeek.length === CronExpression.constraints[5].max - CronExpression.constraints[5].min + 1; - var currentHour = currentDate.getHours(); - - // Add or subtract day if select day not match with month (according to calendar) - if (!dayOfMonthMatch && (!dayOfWeekMatch || isDayOfWeekWildcardMatch)) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); - continue; - } - - // Add or subtract day if not day of month is set (and no match) and day of week is wildcard - if (!isDayOfMonthWildcardMatch && isDayOfWeekWildcardMatch && !dayOfMonthMatch) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); - continue; - } - - // Add or subtract day if not day of week is set (and no match) and day of month is wildcard - if (isDayOfMonthWildcardMatch && !isDayOfWeekWildcardMatch && !dayOfWeekMatch) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); - continue; - } - - // Add or subtract day if day of week & nthDayOfWeek are set (and no match) - if ( - this._nthDayOfWeek > 0 && - !isNthDayMatch(currentDate, this._nthDayOfWeek) - ) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Day'); - continue; - } - - // Match month - if (!matchSchedule(currentDate.getMonth() + 1, this.fields.month)) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Month'); - continue; - } - - // Match hour - if (!matchSchedule(currentHour, this.fields.hour)) { - if (this._dstStart !== currentHour) { - this._dstStart = null; - this._applyTimezoneShift(currentDate, dateMathVerb, 'Hour'); - continue; - } else if (!matchSchedule(currentHour - 1, this.fields.hour)) { - currentDate[dateMathVerb + 'Hour'](); - continue; - } - } else if (this._dstEnd === currentHour) { - if (!reverse) { - this._dstEnd = null; - this._applyTimezoneShift(currentDate, 'add', 'Hour'); - continue; - } - } - - // Match minute - if (!matchSchedule(currentDate.getMinutes(), this.fields.minute)) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Minute'); - continue; - } - - // Match second - if (!matchSchedule(currentDate.getSeconds(), this.fields.second)) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Second'); - continue; - } - - // Increase a second in case in the first iteration the currentDate was not - // modified - if (startTimestamp === currentDate.getTime()) { - if ((dateMathVerb === 'add') || (currentDate.getMilliseconds() === 0)) { - this._applyTimezoneShift(currentDate, dateMathVerb, 'Second'); - } else { - currentDate.setMilliseconds(0); - } - - continue; - } - - break; - } - - if (stepCount >= LOOP_LIMIT) { - throw new Error('Invalid expression, loop limit exceeded'); - } - - this._currentDate = new CronDate(currentDate, this._tz); - this._hasIterated = true; - - return currentDate; -}; - -/** - * Find next suitable date - * - * @public - * @return {CronDate|Object} - */ -CronExpression.prototype.next = function next () { - var schedule = this._findSchedule(); - - // Try to return ES6 compatible iterator - if (this._isIterator) { - return { - value: schedule, - done: !this.hasNext() - }; - } - - return schedule; -}; - -/** - * Find previous suitable date - * - * @public - * @return {CronDate|Object} - */ -CronExpression.prototype.prev = function prev () { - var schedule = this._findSchedule(true); - - // Try to return ES6 compatible iterator - if (this._isIterator) { - return { - value: schedule, - done: !this.hasPrev() - }; - } - - return schedule; -}; - -/** - * Check if next suitable date exists - * - * @public - * @return {Boolean} - */ -CronExpression.prototype.hasNext = function() { - var current = this._currentDate; - var hasIterated = this._hasIterated; - - try { - this._findSchedule(); - return true; - } catch (err) { - return false; - } finally { - this._currentDate = current; - this._hasIterated = hasIterated; - } -}; - -/** - * Check if previous suitable date exists - * - * @public - * @return {Boolean} - */ -CronExpression.prototype.hasPrev = function() { - var current = this._currentDate; - var hasIterated = this._hasIterated; - - try { - this._findSchedule(true); - return true; - } catch (err) { - return false; - } finally { - this._currentDate = current; - this._hasIterated = hasIterated; - } -}; - -/** - * Iterate over expression iterator - * - * @public - * @param {Number} steps Numbers of steps to iterate - * @param {Function} callback Optional callback - * @return {Array} Array of the iterated results - */ -CronExpression.prototype.iterate = function iterate (steps, callback) { - var dates = []; - - if (steps >= 0) { - for (var i = 0, c = steps; i < c; i++) { - try { - var item = this.next(); - dates.push(item); - - // Fire the callback - if (callback) { - callback(item, i); - } - } catch (err) { - break; - } - } - } else { - for (var i = 0, c = steps; i > c; i--) { - try { - var item = this.prev(); - dates.push(item); - - // Fire the callback - if (callback) { - callback(item, i); - } - } catch (err) { - break; - } - } - } - - return dates; -}; - -/** - * Reset expression iterator state - * - * @public - */ -CronExpression.prototype.reset = function reset (newDate) { - this._currentDate = new CronDate(newDate || this._options.currentDate); -}; - -/** - * Stringify the expression - * - * @public - * @param {Boolean} [includeSeconds] Should stringify seconds - * @return {String} - */ -CronExpression.prototype.stringify = function stringify(includeSeconds) { - var resultArr = []; - for (var i = includeSeconds ? 0 : 1, c = CronExpression.map.length; i < c; ++i) { - var field = CronExpression.map[i]; - var value = this.fields[field]; - var constraint = CronExpression.constraints[i]; - - if (field === 'dayOfMonth' && this.fields.month.length === 1) { - constraint = { min: 1, max: CronExpression.daysInMonth[this.fields.month[0] - 1] }; - } else if (field === 'dayOfWeek') { - // Prefer 0-6 range when serializing day of week field - constraint = { min: 0, max: 6 }; - value = value[value.length - 1] === 7 ? value.slice(0, -1) : value; - } - - resultArr.push(stringifyField(value, constraint.min, constraint.max)); - } - return resultArr.join(' '); -}; - -/** - * Parse input expression (async) - * - * @public - * @param {String} expression Input expression - * @param {Object} [options] Parsing options - */ -CronExpression.parse = function parse(expression, options) { - var self = this; - if (typeof options === 'function') { - options = {}; - } - - function parse (expression, options) { - if (!options) { - options = {}; - } - - if (typeof options.currentDate === 'undefined') { - options.currentDate = new CronDate(undefined, self._tz); - } - - // Is input expression predefined? - if (CronExpression.predefined[expression]) { - expression = CronExpression.predefined[expression]; - } - - // Split fields - var fields = []; - var atoms = (expression + '').trim().split(/\s+/); - - if (atoms.length > 6) { - throw new Error('Invalid cron expression'); - } - - // Resolve fields - var start = (CronExpression.map.length - atoms.length); - for (var i = 0, c = CronExpression.map.length; i < c; ++i) { - var field = CronExpression.map[i]; // Field name - var value = atoms[atoms.length > c ? i : i - start]; // Field value - - if (i < start || !value) { // Use default value - fields.push(CronExpression._parseField( - field, - CronExpression.parseDefaults[i], - CronExpression.constraints[i] - ) - ); - } else { - var val = field === 'dayOfWeek' ? parseNthDay(value) : value; - - fields.push(CronExpression._parseField( - field, - val, - CronExpression.constraints[i] - ) - ); - } - } - - var mappedFields = {}; - for (var i = 0, c = CronExpression.map.length; i < c; i++) { - var key = CronExpression.map[i]; - mappedFields[key] = fields[i]; - } - - var dayOfMonth = CronExpression._handleMaxDaysInMonth(mappedFields); - mappedFields.dayOfMonth = dayOfMonth || mappedFields.dayOfMonth; - return new CronExpression(mappedFields, options); - - /** - * Parses out the # special character for the dayOfWeek field & adds it to options. - * - * @param {String} val - * @return {String} - * @private - */ - function parseNthDay(val) { - var atoms = val.split('#'); - if (atoms.length > 1) { - var nthValue = +atoms[atoms.length - 1]; - if(/,/.test(val)) { - throw new Error('Constraint error, invalid dayOfWeek `#` and `,` ' - + 'special characters are incompatible'); - } - if(/\//.test(val)) { - throw new Error('Constraint error, invalid dayOfWeek `#` and `/` ' - + 'special characters are incompatible'); - } - if(/-/.test(val)) { - throw new Error('Constraint error, invalid dayOfWeek `#` and `-` ' - + 'special characters are incompatible'); - } - if (atoms.length > 2 || Number.isNaN(nthValue) || (nthValue < 1 || nthValue > 5)) { - throw new Error('Constraint error, invalid dayOfWeek occurrence number (#)'); - } - - options.nthDayOfWeek = nthValue; - return atoms[0]; - } - return val; - } - } - - return parse(expression, options); -}; - -/** - * Convert cron fields back to Cron Expression - * - * @public - * @param {Object} fields Input fields - * @param {Object} [options] Parsing options - * @return {Object} - */ -CronExpression.fieldsToExpression = function fieldsToExpression(fields, options) { - function validateConstraints (field, values, constraints) { - if (!values) { - throw new Error('Validation error, Field ' + field + ' is missing'); - } - if (values.length === 0) { - throw new Error('Validation error, Field ' + field + ' contains no values'); - } - for (var i = 0, c = values.length; i < c; i++) { - var value = values[i]; - - if (CronExpression._isValidConstraintChar(constraints, value)) { - continue; - } - - // Check constraints - if (typeof value !== 'number' || Number.isNaN(value) || value < constraints.min || value > constraints.max) { - throw new Error( - 'Constraint error, got value ' + value + ' expected range ' + - constraints.min + '-' + constraints.max - ); - } - } - } - - var mappedFields = {}; - for (var i = 0, c = CronExpression.map.length; i < c; ++i) { - var field = CronExpression.map[i]; // Field name - var values = fields[field]; - validateConstraints( - field, - values, - CronExpression.constraints[i] - ); - var copy = []; - var j = -1; - while (++j < values.length) { - copy[j] = values[j]; - } - values = copy.sort(CronExpression._sortCompareFn) - .filter(function(item, pos, ary) { - return !pos || item !== ary[pos - 1]; - }); - if (values.length !== copy.length) { - throw new Error('Validation error, Field ' + field + ' contains duplicate values'); - } - mappedFields[field] = values; - } - var dayOfMonth = CronExpression._handleMaxDaysInMonth(mappedFields); - mappedFields.dayOfMonth = dayOfMonth || mappedFields.dayOfMonth; - return new CronExpression(mappedFields, options || {}); -}; - -module.exports = CronExpression; diff --git a/lib/field_compactor.js b/lib/field_compactor.js deleted file mode 100644 index f9aeb807..00000000 --- a/lib/field_compactor.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict'; - -function buildRange(item) { - return { - start: item, - count: 1 - }; -} - -function completeRangeWithItem(range, item) { - range.end = item; - range.step = item - range.start; - range.count = 2; -} - -function finalizeCurrentRange(results, currentRange, currentItemRange) { - if (currentRange) { - // Two elements do not form a range so split them into 2 single elements - if (currentRange.count === 2) { - results.push(buildRange(currentRange.start)); - results.push(buildRange(currentRange.end)); - } else { - results.push(currentRange); - } - } - if (currentItemRange) { - results.push(currentItemRange); - } -} - -function compactField(arr) { - var results = []; - var currentRange = undefined; - - for (var i = 0; i < arr.length; i++) { - var currentItem = arr[i]; - if (typeof currentItem !== 'number') { - // String elements can't form a range - finalizeCurrentRange(results, currentRange, buildRange(currentItem)); - currentRange = undefined; - } else if (!currentRange) { - // Start a new range - currentRange = buildRange(currentItem); - } else if (currentRange.count === 1) { - // Guess that the current item starts a range - completeRangeWithItem(currentRange, currentItem); - } else { - if (currentRange.step === currentItem - currentRange.end) { - // We found another item that matches the current range - currentRange.count++; - currentRange.end = currentItem; - } else if (currentRange.count === 2) { // The current range can't be continued - // Break the first item of the current range into a single element, and try to start a new range with the second item - results.push(buildRange(currentRange.start)); - currentRange = buildRange(currentRange.end); - completeRangeWithItem(currentRange, currentItem); - } else { - // Persist the current range and start a new one with current item - finalizeCurrentRange(results, currentRange); - currentRange = buildRange(currentItem); - } - } - } - - finalizeCurrentRange(results, currentRange); - - return results; -} - -module.exports = compactField; diff --git a/lib/field_stringify.js b/lib/field_stringify.js deleted file mode 100644 index 9a8c4d75..00000000 --- a/lib/field_stringify.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -var compactField = require('./field_compactor'); - -function stringifyField(arr, min, max) { - var ranges = compactField(arr); - if (ranges.length === 1) { - var singleRange = ranges[0]; - var step = singleRange.step; - if (step === 1 && singleRange.start === min && singleRange.end === max) { - return '*'; - } - if (step !== 1 && singleRange.start === min && singleRange.end === max - step + 1) { - return '*/' + step; - } - } - - var result = []; - for (var i = 0, l = ranges.length; i < l; ++i) { - var range = ranges[i]; - if (range.count === 1) { - result.push(range.start); - continue; - } - - var step = range.step; - if (range.step === 1) { - result.push(range.start + '-' + range.end); - continue; - } - - var multiplier = range.start == 0 ? range.count - 1 : range.count; - if (range.step * multiplier > range.end) { - result = result.concat( - Array - .from({ length: range.end - range.start + 1 }) - .map(function (_, index) { - var value = range.start + index; - if ((value - range.start) % range.step === 0) { - return value; - } - return null; - }) - .filter(function (value) { - return value != null; - }) - ); - } else if (range.end === max - range.step + 1) { - result.push(range.start + '/' + range.step); - } else { - result.push(range.start + '-' + range.end + '/' + range.step); - } - } - - return result.join(','); -} - -module.exports = stringifyField; diff --git a/lib/parser.js b/lib/parser.js deleted file mode 100644 index 362a416c..00000000 --- a/lib/parser.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; - -var CronExpression = require('./expression'); - -function CronParser() {} - -/** - * Parse crontab entry - * - * @private - * @param {String} entry Crontab file entry/line - */ -CronParser._parseEntry = function _parseEntry (entry) { - var atoms = entry.split(' '); - - if (atoms.length === 6) { - return { - interval: CronExpression.parse(entry) - }; - } else if (atoms.length > 6) { - return { - interval: CronExpression.parse( - atoms.slice(0, 6).join(' ') - ), - command: atoms.slice(6, atoms.length) - }; - } else { - throw new Error('Invalid entry: ' + entry); - } -}; - -/** - * Wrapper for CronExpression.parser method - * - * @public - * @param {String} expression Input expression - * @param {Object} [options] Parsing options - * @return {Object} - */ -CronParser.parseExpression = function parseExpression (expression, options) { - return CronExpression.parse(expression, options); -}; - -/** - * Wrapper for CronExpression.fieldsToExpression method - * - * @public - * @param {Object} fields Input fields - * @param {Object} [options] Parsing options - * @return {Object} - */ -CronParser.fieldsToExpression = function fieldsToExpression (fields, options) { - return CronExpression.fieldsToExpression(fields, options); -}; - -/** - * Parse content string - * - * @public - * @param {String} data Crontab content - * @return {Object} - */ -CronParser.parseString = function parseString (data) { - var blocks = data.split('\n'); - - var response = { - variables: {}, - expressions: [], - errors: {} - }; - - for (var i = 0, c = blocks.length; i < c; i++) { - var block = blocks[i]; - var matches = null; - var entry = block.trim(); // Remove surrounding spaces - - if (entry.length > 0) { - if (entry.match(/^#/)) { // Comment - continue; - } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable - response.variables[matches[1]] = matches[2]; - } else { // Expression? - var result = null; - - try { - result = CronParser._parseEntry('0 ' + entry); - response.expressions.push(result.interval); - } catch (err) { - response.errors[entry] = err; - } - } - } - } - - return response; -}; - -/** - * Parse crontab file - * - * @public - * @param {String} filePath Path to file - * @param {Function} callback - */ -CronParser.parseFile = function parseFile (filePath, callback) { - require('fs').readFile(filePath, function(err, data) { - if (err) { - callback(err); - return; - } - - return callback(null, CronParser.parseString(data.toString())); - }); -}; - -module.exports = CronParser; diff --git a/package-lock.json b/package-lock.json index 771f5444..6e557789 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "cron-parser", "version": "4.8.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9,25 +9,45 @@ "version": "4.8.1", "license": "MIT", "dependencies": { + "debug": "^4.3.4", "luxon": "^3.2.1" }, "devDependencies": { - "eslint": "^8.27.0", + "@tsd/typescript": "^5.0.4", + "@types/debug": "^4.1.7", + "@types/jest": "^29.5.1", + "@types/luxon": "^3.3.0", + "@types/node": "^18.15.13", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "cross-env": "^7.0.3", + "eslint": "^8.39.0", + "husky": "^8.0.3", + "jest": "^29.5.0", + "jest-coverage-badges": "^1.0.0", + "jest-runner-tsd": "^5.0.0", + "lint-staged": "^13.2.1", + "rimraf": "^5.0.0", + "shx": "^0.3.4", "sinon": "^15.0.1", - "tap": "^16.3.3", - "tsd": "^0.26.0" + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "tsd": "^0.28.1", + "typedoc": "^0.24.6", + "typescript": "^5.0.4" }, "engines": { - "node": ">=12.0.0" + "node": ">=15.14.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -35,10 +55,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -47,34 +68,36 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, + "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "engines": { @@ -90,47 +113,38 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -140,32 +154,52 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -176,6 +210,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -184,41 +219,54 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.2" }, @@ -231,6 +279,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -243,6 +292,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -252,28 +302,31 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -284,6 +337,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -293,1316 +347,1533 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "color-name": "1.1.3" } }, - "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.8.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=4" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, + "license": "MIT", "bin": { - "js-yaml": "bin/js-yaml.js" + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=10.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "engines": { - "node": ">=12.22" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "engines": { - "node": ">=6.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "engines": { - "node": ">=6.0.0" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/@babel/traverse": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@tsd/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-+UgxOvJUl5rQdPFSSOOwhmSmpThm8DJ3HwHxAOq5XYe7CcmG1LcM2QeqWwILzUIT5tbeMqY8qABiCsRtIjk/2g==", - "dev": true + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=6.0.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^1.9.0" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=4" + "node": ">=10.10.0" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "license": "Apache-2.0", "engines": { - "node": ">= 8" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { - "default-require-extensions": "^3.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/argparse": { + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/async-hook-domain": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", - "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", + "node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/bind-obj-methods": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", - "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "jest-get-type": "^29.4.3" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "node_modules/@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", "dev": true, + "license": "MIT", "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "node_modules/@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "license": "MIT" }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "bin": { - "color-support": "bin.js" + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 8" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.10.0" + "node": ">=14" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true, + "license": "MIT" }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type-detect": "4.0.8" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, - "engines": { - "node": ">=0.3.1" + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsd/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.3.0" + } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "@types/ms": "*" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", "dev": true, - "engines": { - "node": ">=0.8.0" + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@types/node": "*" } }, - "node_modules/eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/eslint-formatter-pretty/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/istanbul-lib-report": "*" } }, - "node_modules/eslint-formatter-pretty/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/jest": { + "version": "29.5.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", + "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/eslint-formatter-pretty/node_modules/color-convert": { + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", + "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/yargs-parser": "*" } }, - "node_modules/eslint-formatter-pretty/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true, + "license": "MIT" }, - "node_modules/eslint-formatter-pretty/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", + "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/type-utils": "5.59.0", + "@typescript-eslint/utils": "5.59.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/eslint-formatter-pretty/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@typescript-eslint/parser": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", + "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "has-flag": "^4.0.0" + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/eslint-rule-docs": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", + "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", + "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/utils": "5.59.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/@typescript-eslint/types": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", + "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", + "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "color-convert": "^2.0.1" + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/visitor-keys": "5.59.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@typescript-eslint/utils": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", + "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.0", + "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "color-name": "~1.1.4" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=8.0.0" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", + "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@typescript-eslint/types": "5.59.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=10.13.0" + "node": ">=0.4.0" } }, - "node_modules/eslint/node_modules/glob-parent/node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1610,658 +1881,913 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { - "has-flag": "^4.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "estraverse": "^5.1.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">=4.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, - "engines": { - "node": ">=4.0" + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", - "dev": true + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=8.6.0" + "node": ">=8" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "fast-json-stable-stringify": "2.x" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 6" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "to-regex-range": "^5.0.1" - }, + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/camelcase-keys/node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/findit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", - "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", - "dev": true + "node_modules/caniuse-lite": { + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=10" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/sibiraj-s" } - ] - }, - "node_modules/fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" ], + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function-loop": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", - "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", - "dev": true + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true, + "license": "MIT" }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=8" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, "engines": { - "node": ">=8.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=14" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, + "license": "MIT" + }, + "node_modules/create-jest-runner": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/create-jest-runner/-/create-jest-runner-0.12.3.tgz", + "integrity": "sha512-xrGcSrr86F2YdbrOoAZIowSYMYBpxrOrqHEvJqIpG0vsuMVcq3+OKSe7JJR1SWJFLGiMhHInPyR48+rW9ZHq9Q==", + "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "chalk": "^4.1.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0" }, - "engines": { - "node": ">= 0.4.0" + "bin": { + "create-jest-runner": "generator/index.js" + }, + "peerDependencies": { + "@jest/test-result": "^28.0.0 || ^29.0.0", + "jest-runner": "^28.0.0 || ^29.0.0" + }, + "peerDependenciesMeta": { + "@jest/test-result": { + "optional": true + }, + "jest-runner": { + "optional": true + } } }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, + "license": "MIT", "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "cross-spawn": "^7.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imurmurhash": { + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=0.10.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "has": "^1.0.3" + "esutils": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/electron-to-chromium": { + "version": "1.4.369", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.369.tgz", + "integrity": "sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "engines": { - "node": ">=0.12.0" - } + "license": "MIT" }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "node_modules/eslint": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/eslint-formatter-pretty": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", + "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.2.13", + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "eslint-rule-docs": "^1.1.5", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", + "string-width": "^4.2.0", + "supports-hyperlinks": "^2.0.0" + }, "engines": { "node": ">=10" }, @@ -2269,795 +2795,667 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/eslint-rule-docs": { + "version": "1.1.235", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", + "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { - "append-transform": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "node_modules/espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "has-flag": "^4.0.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=4.0" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/jackspeak": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz", - "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "dependencies": { - "cliui": "^7.0.4" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/libtap": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.0.tgz", - "integrity": "sha512-STLFynswQ2A6W14JkabgGetBNk6INL1REgJ9UeNKw5llXroC2cGLgKTqavv0sl8OLVztLLipVKMcQ7yeUcqpmg==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "license": "MIT", "dependencies": { - "async-hook-domain": "^2.0.4", - "bind-obj-methods": "^3.0.0", - "diff": "^4.0.2", - "function-loop": "^2.0.1", - "minipass": "^3.1.5", - "own-or": "^1.0.0", - "own-or-env": "^1.0.2", - "signal-exit": "^3.0.4", - "stack-utils": "^2.0.4", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "tcompare": "^5.0.6", - "trivial-deferred": "^1.0.1" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { - "p-locate": "^4.1.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, + "license": "ISC", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "reusify": "^1.0.4" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "bser": "2.1.1" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "to-regex-range": "^5.0.1" }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=10" - } - }, - "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", - "engines": { - "node": ">=12" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { - "semver": "^6.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", "dev": true, + "license": "ISC", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "engines": { - "node": ">=10" - } + "license": "ISC" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=6.9.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "license": "ISC", "engines": { - "node": ">=8.6" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=8.0.0" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } + "license": "ISC" }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } + "license": "MIT" }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">=8.9" + "node": ">=10" } }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, - "dependencies": { - "wrappy": "1" + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, + "license": "MIT", "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "husky": "lib/bin.js" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", - "dev": true - }, - "node_modules/own-or-env": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", - "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "dependencies": { - "own-or": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" @@ -3066,173 +3464,205 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.8.19" } }, - "node_modules/package-hash": { + "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, + "license": "ISC", "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { - "isarray": "0.0.1" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=8" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "dependencies": { - "irregular-plurals": "^3.2.0" + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3240,1418 +3670,1540 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "fromentries": "^1.2.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "engines": { - "node": ">=6" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/quick-lru": { + "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/jackspeak": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.1.0.tgz", + "integrity": "sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "cliui": "^7.0.4" }, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, "bin": { - "semver": "bin/semver" + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/jest-changed-files/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/jest-changed-files/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=10.17.0" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/jest-changed-files/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "node_modules/jest-changed-files/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { - "es6-error": "^4.0.1" + "path-key": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/jest-changed-files/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" }, "bin": { - "resolve": "bin/resolve" + "jest": "bin/jest.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/jest-coverage-badges": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jest-coverage-badges/-/jest-coverage-badges-1.0.0.tgz", + "integrity": "sha512-2PzLRTBMYxaRtDy3gAfVhzZcP5MGb90vzS/6v23tR67J7ejh2D6rGlGvl3IF0LJxqKKJlWSxkTNTzgXMsDb9ug==", "dev": true, + "bin": { + "jest-coverage-badges": "cli.js" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=6.11", + "npm": ">=5.3" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sinon": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", - "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "10.0.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/sinon/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, "engines": { - "node": ">=0.3.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/sinon/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner-tsd": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jest-runner-tsd/-/jest-runner-tsd-5.0.0.tgz", + "integrity": "sha512-vcjJX382rSuGUpySL+T8PuPbqKu+gv3ZeO2sdT/9vq1O+WcKH8/7q09x9CHt2lzMcKNhdhJ6tDMLClpHBildgw==", "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "@babel/code-frame": "^7.15.8", + "chalk": "^4.1.2", + "create-jest-runner": "^0.12.0", + "tsd-lite": "^0.7.0" }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" + "peerDependencies": { + "@tsd/typescript": "4.x || 5.x" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", "dev": true, + "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, - "engines": { - "node": ">= 0.4" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/tap": { - "version": "16.3.4", - "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.4.tgz", - "integrity": "sha512-SAexdt2ZF4XBgye6TPucFI2y7VE0qeFXlXucJIV1XDPCs+iJodk0MYacr1zR6Ycltzz7PYg8zrblDXKbAZM2LQ==", - "bundleDependencies": [ - "ink", - "treport", - "@types/react", - "@isaacs/import-jsx", - "react" - ], + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/import-jsx": "^4.0.1", - "@types/react": "^17.0.52", - "chokidar": "^3.3.0", - "findit": "^2.0.0", - "foreground-child": "^2.0.0", - "fs-exists-cached": "^1.0.0", - "glob": "^7.2.3", - "ink": "^3.2.0", - "isexe": "^2.0.0", - "istanbul-lib-processinfo": "^2.0.3", - "jackspeak": "^1.4.2", - "libtap": "^1.4.0", - "minipass": "^3.3.4", - "mkdirp": "^1.0.4", - "nyc": "^15.1.0", - "opener": "^1.5.1", - "react": "^17.0.2", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.6", - "source-map-support": "^0.5.16", - "tap-mocha-reporter": "^5.0.3", - "tap-parser": "^11.0.2", - "tap-yaml": "^1.0.2", - "tcompare": "^5.0.7", - "treport": "^3.0.4", - "which": "^2.0.2" + "argparse": "^2.0.1" }, "bin": { - "tap": "bin/run.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "peerDependencies": { - "coveralls": "^3.1.1", - "flow-remove-types": ">=2.112.0", - "ts-node": ">=8.5.2", - "typescript": ">=3.7.2" - }, - "peerDependenciesMeta": { - "coveralls": { - "optional": true - }, - "flow-remove-types": { - "optional": true - }, - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/tap-mocha-reporter": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", - "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "dependencies": { - "color-support": "^1.1.0", - "debug": "^4.1.1", - "diff": "^4.0.1", - "escape-string-regexp": "^2.0.0", - "glob": "^7.0.5", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, + "license": "MIT", "bin": { - "tap-mocha-reporter": "index.js" + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/tap-parser": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", - "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "dependencies": { - "events-to-array": "^1.0.1", - "minipass": "^3.1.6", - "tap-yaml": "^1.0.0" - }, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", "bin": { - "tap-parser": "bin/cmd.js" + "json5": "lib/cli.js" }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/tap-yaml": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", - "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, - "dependencies": { - "yaml": "^1.10.2" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@ampproject/remapping": { - "version": "2.1.2", + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/code-frame": { - "version": "7.16.7", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/@babel/compat-data": { - "version": "7.17.7", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/tap/node_modules/@babel/core": { - "version": "7.17.8", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=6" } }, - "node_modules/tap/node_modules/@babel/generator": { - "version": "7.17.7", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.7" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.8.0" } }, - "node_modules/tap/node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=10" } }, - "node_modules/tap/node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/helper-function-name": { - "version": "7.16.7", + "node_modules/lint-staged": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", + "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": ">=6.9.0" + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/tap/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { - "node": ">=6.9.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/tap/node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, - "node_modules/tap/node_modules/@babel/helper-module-imports": { - "version": "7.16.7", + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/tap/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/helper-simple-access": { - "version": "7.17.7", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.17.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/helper-validator-option": { - "version": "7.16.7", + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "license": "MIT" }, - "node_modules/tap/node_modules/@babel/helpers": { - "version": "7.17.8", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/highlight": { - "version": "7.16.10", + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/tap/node_modules/@babel/parser": { - "version": "7.17.8", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=10" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/tap/node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "yallist": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=10" } }, - "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.17.7", + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, - "inBundle": true, + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", + "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/tap/node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.7", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "semver": "^6.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.3", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/tap/node_modules/@babel/template": { - "version": "7.16.7", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" + "tmpl": "1.0.5" } }, - "node_modules/tap/node_modules/@babel/traverse": { - "version": "7.17.3", + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/@babel/types": { - "version": "7.17.0", + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" + "bin": { + "marked": "bin/marked.js" }, "engines": { - "node": ">=6.9.0" + "node": ">= 12" } }, - "node_modules/tap/node_modules/@isaacs/import-jsx": { - "version": "4.0.1", + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.5.5", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-react-jsx": "^7.3.0", - "caller-path": "^3.0.1", - "find-cache-dir": "^3.2.0", - "make-dir": "^3.0.2", - "resolve-from": "^3.0.0", - "rimraf": "^3.0.0" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/tap/node_modules/@types/prop-types": { - "version": "15.7.4", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "inBundle": true, "license": "MIT" }, - "node_modules/tap/node_modules/@types/react": { - "version": "17.0.52", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "engines": { + "node": ">= 8" } }, - "node_modules/tap/node_modules/@types/scheduler": { - "version": "0.16.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/@types/yoga-layout": { - "version": "1.9.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/ansi-escapes": { - "version": "4.3.2", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6" } }, - "node_modules/tap/node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "inBundle": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/tap/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/tap/node_modules/ansi-styles": { - "version": "3.2.1", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "color-convert": "^1.9.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/tap/node_modules/ansicolors": { - "version": "0.3.2", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "inBundle": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/tap/node_modules/astral-regex": { - "version": "2.0.0", + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/tap/node_modules/auto-bind": { - "version": "4.0.0", + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/balanced-match": { - "version": "1.0.2", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "inBundle": true, "license": "MIT" }, - "node_modules/tap/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" } }, - "node_modules/tap/node_modules/browserslist": { - "version": "4.20.2", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "inBundle": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=10" } }, - "node_modules/tap/node_modules/caller-callsite": { - "version": "4.1.0", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "callsites": "^3.1.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/caller-path": { - "version": "3.0.1", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "caller-callsite": "^4.1.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/callsites": { - "version": "3.1.0", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/caniuse-lite": { - "version": "1.0.30001319", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "inBundle": true, - "license": "CC-BY-4.0" - }, - "node_modules/tap/node_modules/cardinal": { - "version": "2.1.1", + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap/node_modules/chalk": { - "version": "2.4.2", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "wrappy": "1" } }, - "node_modules/tap/node_modules/ci-info": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/cli-boxes": { - "version": "2.2.1", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { "node": ">=6" }, @@ -4659,472 +5211,426 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/cli-cursor": { - "version": "3.1.0", + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/tap/node_modules/cli-truncate": { - "version": "2.1.0", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/code-excerpt": { - "version": "3.0.0", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "convert-to-spaces": "^1.0.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/tap/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/tap/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/convert-source-map": { - "version": "1.8.0", + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/tap/node_modules/convert-to-spaces": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", + "p-try": "^2.0.0" + }, "engines": { - "node": ">= 4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/csstype": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/debug": { - "version": "4.3.4", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=6.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/electron-to-chromium": { - "version": "1.4.89", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/escalade": { - "version": "3.1.1", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/tap/node_modules/escape-string-regexp": { - "version": "1.0.5", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "inBundle": true, "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tap/node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "dependencies": { + "callsites": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/tap/node_modules/events-to-array": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/find-cache-dir": { - "version": "3.3.2", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/find-up": { - "version": "4.1.0", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/fs.realpath": { - "version": "1.0.0", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/tap/node_modules/gensync": { - "version": "1.0.0-beta.2", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/glob": { - "version": "7.2.3", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", + "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "lru-cache": "^9.0.0", + "minipass": "^5.0.0" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/globals": { - "version": "11.12.0", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=4" + "node": "14 || >=16.14" } }, - "node_modules/tap/node_modules/has-flag": { - "version": "3.0.0", + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "inBundle": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "isarray": "0.0.1" } }, - "node_modules/tap/node_modules/indent-string": { + "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/tap/node_modules/inherits": { - "version": "2.0.4", + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true, - "inBundle": true, "license": "ISC" }, - "node_modules/tap/node_modules/ink": { - "version": "3.2.0", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "auto-bind": "4.0.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", - "indent-string": "^4.0.0", - "is-ci": "^2.0.0", - "lodash": "^4.17.20", - "patch-console": "^1.0.0", - "react-devtools-core": "^4.19.1", - "react-reconciler": "^0.26.2", - "scheduler": "^0.20.2", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "stack-utils": "^2.0.2", - "string-width": "^4.2.2", - "type-fest": "^0.12.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "ws": "^7.5.5", - "yoga-layout-prebuilt": "^1.9.6" - }, "engines": { - "node": ">=10" + "node": ">=8.6" }, - "peerDependencies": { - "@types/react": ">=16.8.0", - "react": ">=16.8.0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=0.10" } }, - "node_modules/tap/node_modules/ink/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tap/node_modules/ink/node_modules/chalk": { - "version": "4.1.2", + "node_modules/plur": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "irregular-plurals": "^3.2.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/ink/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.8.0" } }, - "node_modules/tap/node_modules/ink/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/ink/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/tap/node_modules/ink/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tap/node_modules/is-ci": { - "version": "2.0.0", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ci-info": "^2.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">= 6" } }, - "node_modules/tap/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/tap/node_modules/js-tokens": { - "version": "4.0.0", + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", "dev": true, - "inBundle": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], "license": "MIT" }, - "node_modules/tap/node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tap/node_modules/json5": { - "version": "2.2.3", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/tap/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/lodash": { - "version": "4.17.21", + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true, - "inBundle": true, "license": "MIT" }, - "node_modules/tap/node_modules/loose-envify": { - "version": "1.4.0", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/tap/node_modules/make-dir": { - "version": "3.1.0", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { "node": ">=8" @@ -5133,699 +5639,701 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/mimic-fn": { - "version": "2.1.0", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tap/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "ISC" }, - "node_modules/tap/node_modules/minipass": { - "version": "3.3.4", + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/tap/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/node-releases": { - "version": "2.0.2", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/tap/node_modules/object-assign": { - "version": "4.1.1", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/once": { - "version": "1.4.0", + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, - "inBundle": true, - "license": "ISC", "dependencies": { - "wrappy": "1" + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/tap/node_modules/onetime": { - "version": "5.1.2", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/tap/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=6" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tap/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/p-try": { - "version": "2.2.0", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tap/node_modules/patch-console": { - "version": "1.0.0", + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/tap/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/picocolors": { - "version": "1.0.0", + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true, - "inBundle": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/tap/node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/rimraf": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz", + "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "find-up": "^4.0.0" + "glob": "^10.0.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tap/node_modules/punycode": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tap/node_modules/react": { - "version": "17.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "bin": { + "rimraf": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/react-devtools-core": { - "version": "4.24.1", + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" + "balanced-match": "^1.0.0" } }, - "node_modules/tap/node_modules/react-reconciler": { - "version": "0.26.2", + "node_modules/rimraf/node_modules/glob": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", + "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.0", + "minipass": "^5.0.0", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.17" }, - "peerDependencies": { - "react": "^17.0.2" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/redeyed": { - "version": "2.1.1", + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/tap/node_modules/resolve-from": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/restore-cursor": { - "version": "3.1.0", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/tap/node_modules/rimraf": { - "version": "3.0.2", + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "tslib": "^2.1.0" } }, - "node_modules/tap/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/scheduler": { - "version": "0.20.2", + "node_modules/rxjs/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } + "license": "0BSD" }, - "node_modules/tap/node_modules/semver": { - "version": "6.3.0", + "node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, - "inBundle": true, "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/tap/node_modules/shell-quote": { - "version": "1.7.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/slice-ansi": { - "version": "3.0.0", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" } }, - "node_modules/tap/node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/shiki": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", + "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/shx": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", + "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", + "dev": true, + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" }, "engines": { - "node": ">=7.0.0" + "node": ">=6" } }, - "node_modules/tap/node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/tap/node_modules/source-map": { - "version": "0.5.7", + "node_modules/sinon": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz", + "integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==", "dev": true, - "inBundle": true, "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "node_modules/tap/node_modules/stack-utils": { - "version": "2.0.5", + "node_modules/sinon/node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" + "type-detect": "4.0.8" } }, - "node_modules/tap/node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", + "node_modules/sinon/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, - "inBundle": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.3.1" } }, - "node_modules/tap/node_modules/string-width": { - "version": "4.2.3", + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/tap/node_modules/supports-color": { - "version": "5.5.0", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/tap/node_modules/tap-parser": { - "version": "11.0.2", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "events-to-array": "^1.0.1", - "minipass": "^3.1.6", - "tap-yaml": "^1.0.0" - }, - "bin": { - "tap-parser": "bin/cmd.js" - }, "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/tap-yaml": { - "version": "1.0.2", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yaml": "^1.10.2" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/tap/node_modules/to-fast-properties": { - "version": "2.0.0", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "inBundle": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/tap/node_modules/treport": { - "version": "3.0.4", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "@isaacs/import-jsx": "^4.0.1", - "cardinal": "^2.1.1", - "chalk": "^3.0.0", - "ink": "^3.2.0", - "ms": "^2.1.2", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, - "peerDependencies": { - "react": "^17.0.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/tap/node_modules/treport/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/tap/node_modules/treport/node_modules/chalk": { - "version": "3.0.0", + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/tap/node_modules/treport/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/treport/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/treport/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.6.19" } }, - "node_modules/tap/node_modules/treport/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/tap/node_modules/type-fest": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tap/node_modules/unicode-length": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/tap/node_modules/unicode-length/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tap/node_modules/unicode-length/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/widest-line": { - "version": "3.1.0", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "string-width": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/wrap-ansi": { - "version": "6.2.0", + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "min-indent": "^1.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=8" } }, - "node_modules/tap/node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/ws": { - "version": "7.5.7", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=8" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tap/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/tap/node_modules/yaml": { - "version": "1.10.2", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/tap/node_modules/yoga-layout-prebuilt": { - "version": "1.10.0", + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "@types/yoga-layout": "1.9.2" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/tcompare": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", - "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "dependencies": { - "diff": "^4.0.2" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/test-exclude": { @@ -5833,6 +6341,7 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -5846,13 +6355,29 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -5862,6 +6387,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -5874,4824 +6400,511 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/trivial-deferred": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw==", - "dev": true - }, - "node_modules/tsd": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.26.0.tgz", - "integrity": "sha512-CNkmeivuy6rH+8iijKf5dRf7lVgHYR2vet+YZFjQgoObDuI9v22ojaOh8Zf2lfJ4wnyT60QYbRsPAN68KVZ+9g==", + "node_modules/ts-jest": { + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", + "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", "dev": true, + "license": "MIT", "dependencies": { - "@tsd/typescript": "~4.9.5", - "eslint-formatter-pretty": "^4.1.0", - "globby": "^11.0.1", - "meow": "^9.0.0", - "path-exists": "^4.0.0", - "read-pkg-up": "^7.0.0" + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" }, "bin": { - "tsd": "dist/cli.js" + "ts-jest": "cli.js" }, "engines": { - "node": ">=14.16" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/unicode-length": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", - "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==", - "dev": true, - "dependencies": { - "punycode": "^2.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, "bin": { - "node-which": "bin/node-which" + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/yargs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/yargs/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", - "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", - "dev": true - }, - "@babel/core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", - "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.2", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.1", - "@babel/parser": "^7.20.2", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", - "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", - "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", - "dev": true - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0" - } - }, - "@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "@tsd/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-+UgxOvJUl5rQdPFSSOOwhmSmpThm8DJ3HwHxAOq5XYe7CcmG1LcM2QeqWwILzUIT5tbeMqY8qABiCsRtIjk/2g==", - "dev": true - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "async-hook-domain": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", - "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bind-obj-methods": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", - "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001431", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz", - "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - }, - "dependencies": { - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-formatter-pretty": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.1.0.tgz", - "integrity": "sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==", - "dev": true, - "requires": { - "@types/eslint": "^7.2.13", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.5", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-rule-docs": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", - "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "findit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", - "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-exists-cached": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", - "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function-loop": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", - "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jackspeak": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz", - "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==", - "dev": true, - "requires": { - "cliui": "^7.0.4" - } - }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "libtap": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.0.tgz", - "integrity": "sha512-STLFynswQ2A6W14JkabgGetBNk6INL1REgJ9UeNKw5llXroC2cGLgKTqavv0sl8OLVztLLipVKMcQ7yeUcqpmg==", - "dev": true, - "requires": { - "async-hook-domain": "^2.0.4", - "bind-obj-methods": "^3.0.0", - "diff": "^4.0.2", - "function-loop": "^2.0.1", - "minipass": "^3.1.5", - "own-or": "^1.0.0", - "own-or-env": "^1.0.2", - "signal-exit": "^3.0.4", - "stack-utils": "^2.0.4", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "tcompare": "^5.0.6", - "trivial-deferred": "^1.0.1" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==" - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "dependencies": { - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - } - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nise": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.2.tgz", - "integrity": "sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", - "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } - } - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "own-or": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", - "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", - "dev": true - }, - "own-or-env": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", - "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", - "dev": true, - "requires": { - "own-or": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "requires": { - "irregular-plurals": "^3.2.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sinon": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", - "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "10.0.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - }, - "dependencies": { - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tap": { - "version": "16.3.4", - "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.4.tgz", - "integrity": "sha512-SAexdt2ZF4XBgye6TPucFI2y7VE0qeFXlXucJIV1XDPCs+iJodk0MYacr1zR6Ycltzz7PYg8zrblDXKbAZM2LQ==", - "dev": true, - "requires": { - "@isaacs/import-jsx": "^4.0.1", - "@types/react": "^17.0.52", - "chokidar": "^3.3.0", - "findit": "^2.0.0", - "foreground-child": "^2.0.0", - "fs-exists-cached": "^1.0.0", - "glob": "^7.2.3", - "ink": "^3.2.0", - "isexe": "^2.0.0", - "istanbul-lib-processinfo": "^2.0.3", - "jackspeak": "^1.4.2", - "libtap": "^1.4.0", - "minipass": "^3.3.4", - "mkdirp": "^1.0.4", - "nyc": "^15.1.0", - "opener": "^1.5.1", - "react": "^17.0.2", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.6", - "source-map-support": "^0.5.16", - "tap-mocha-reporter": "^5.0.3", - "tap-parser": "^11.0.2", - "tap-yaml": "^1.0.2", - "tcompare": "^5.0.7", - "treport": "^3.0.4", - "which": "^2.0.2" - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "bundled": true, - "dev": true - }, - "@babel/core": { - "version": "7.17.8", - "bundled": true, - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.17.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "bundled": true, - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "bundled": true, - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "bundled": true, - "dev": true - }, - "@babel/helpers": { - "version": "7.17.8", - "bundled": true, - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.16.10", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.17.8", - "bundled": true, - "dev": true - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.17.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.0", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.7" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.17.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.17.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/template": { - "version": "7.16.7", - "bundled": true, - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.3", - "bundled": true, - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.17.0", - "bundled": true, - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@isaacs/import-jsx": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "requires": { - "@babel/core": "^7.5.5", - "@babel/plugin-proposal-object-rest-spread": "^7.5.5", - "@babel/plugin-transform-destructuring": "^7.5.0", - "@babel/plugin-transform-react-jsx": "^7.3.0", - "caller-path": "^3.0.1", - "find-cache-dir": "^3.2.0", - "make-dir": "^3.0.2", - "resolve-from": "^3.0.0", - "rimraf": "^3.0.0" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "bundled": true, - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "bundled": true, - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "bundled": true, - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@types/prop-types": { - "version": "15.7.4", - "bundled": true, - "dev": true - }, - "@types/react": { - "version": "17.0.52", - "bundled": true, - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "bundled": true, - "dev": true - }, - "@types/yoga-layout": { - "version": "1.9.2", - "bundled": true, - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "bundled": true, - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "bundled": true, - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "auto-bind": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browserslist": { - "version": "4.20.2", - "bundled": true, - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "caller-callsite": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "callsites": "^3.1.0" - } - }, - "caller-path": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "caller-callsite": "^4.1.0" - } - }, - "callsites": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001319", - "bundled": true, - "dev": true - }, - "cardinal": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - } - }, - "chalk": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "ci-info": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "code-excerpt": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "convert-to-spaces": "^1.0.1" - } - }, - "color-convert": { - "version": "1.9.3", - "bundled": true, - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "bundled": true, - "dev": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "convert-to-spaces": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "csstype": { - "version": "3.0.11", - "bundled": true, - "dev": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "electron-to-chromium": { - "version": "1.4.89", - "bundled": true, - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "dev": true - }, - "escalade": { - "version": "3.1.1", - "bundled": true, - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "esprima": { - "version": "4.0.1", - "bundled": true, - "dev": true - }, - "events-to-array": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "bundled": true, - "dev": true - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globals": { - "version": "11.12.0", - "bundled": true, - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "dev": true - }, - "ink": { - "version": "3.2.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "auto-bind": "4.0.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", - "indent-string": "^4.0.0", - "is-ci": "^2.0.0", - "lodash": "^4.17.20", - "patch-console": "^1.0.0", - "react-devtools-core": "^4.19.1", - "react-reconciler": "^0.26.2", - "scheduler": "^0.20.2", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "stack-utils": "^2.0.2", - "string-width": "^4.2.2", - "type-fest": "^0.12.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "ws": "^7.5.5", - "yoga-layout-prebuilt": "^1.9.6" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "is-ci": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "bundled": true, - "dev": true - }, - "json5": { - "version": "2.2.3", - "bundled": true, - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "bundled": true, - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.3.4", - "bundled": true, - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "node-releases": { - "version": "2.0.2", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "patch-console": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "react": { - "version": "17.0.2", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-devtools-core": { - "version": "4.24.1", - "bundled": true, - "dev": true, - "requires": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "react-reconciler": { - "version": "0.26.2", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "redeyed": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "esprima": "~4.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "scheduler": { - "version": "0.20.2", - "bundled": true, - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "semver": { - "version": "6.3.0", - "bundled": true, - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true, - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "bundled": true, - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "bundled": true, - "dev": true - } - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tap-parser": { - "version": "11.0.2", - "bundled": true, - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "minipass": "^3.1.6", - "tap-yaml": "^1.0.0" - } - }, - "tap-yaml": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "yaml": "^1.10.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "treport": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "@isaacs/import-jsx": "^4.0.1", - "cardinal": "^2.1.1", - "chalk": "^3.0.0", - "ink": "^3.2.0", - "ms": "^2.1.2", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "type-fest": { - "version": "0.12.0", - "bundled": true, - "dev": true - }, - "unicode-length": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "punycode": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "widest-line": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "ws": { - "version": "7.5.7", - "bundled": true, - "dev": true, - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yaml": { - "version": "1.10.2", - "bundled": true, - "dev": true - }, - "yoga-layout-prebuilt": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "@types/yoga-layout": "1.9.2" - } - } - } - }, - "tap-mocha-reporter": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", - "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", - "dev": true, - "requires": { - "color-support": "^1.1.0", - "debug": "^4.1.1", - "diff": "^4.0.1", - "escape-string-regexp": "^2.0.0", - "glob": "^7.0.5", - "tap-parser": "^11.0.0", - "tap-yaml": "^1.0.0", - "unicode-length": "^2.0.2" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "tap-parser": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", - "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", - "dev": true, - "requires": { - "events-to-array": "^1.0.1", - "minipass": "^3.1.6", - "tap-yaml": "^1.0.0" - } - }, - "tap-yaml": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", - "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", - "dev": true, - "requires": { - "yaml": "^1.10.2" - } - }, - "tcompare": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", - "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", - "dev": true, - "requires": { - "diff": "^4.0.2" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "trivial-deferred": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", - "integrity": "sha512-dagAKX7vaesNNAwOc9Np9C2mJ+7YopF4lk+jE2JML9ta4kZ91Y6UruJNH65bLRYoUROD8EY+Pmi44qQWwXR7sw==", - "dev": true - }, - "tsd": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.26.0.tgz", - "integrity": "sha512-CNkmeivuy6rH+8iijKf5dRf7lVgHYR2vet+YZFjQgoObDuI9v22ojaOh8Zf2lfJ4wnyT60QYbRsPAN68KVZ+9g==", + "node_modules/tsd": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.28.1.tgz", + "integrity": "sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==", "dev": true, - "requires": { - "@tsd/typescript": "~4.9.5", + "license": "MIT", + "dependencies": { + "@tsd/typescript": "~5.0.2", "eslint-formatter-pretty": "^4.1.0", "globby": "^11.0.1", + "jest-diff": "^29.0.3", "meow": "^9.0.0", "path-exists": "^4.0.0", "read-pkg-up": "^7.0.0" + }, + "bin": { + "tsd": "dist/cli.js" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/tsd-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tsd-lite/-/tsd-lite-0.7.0.tgz", + "integrity": "sha512-XhQ7w/RPzfjSb98LIQB1qx7yAvRV6+h5JFP4dCvd79Hbp23X8CCx4EdRAQm6faTkRdprKYvZE8kxlK6LpJp8vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@tsd/typescript": "4.x || 5.x" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "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" } }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/typedoc": { + "version": "0.24.6", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.6.tgz", + "integrity": "sha512-c3y3h45xJv3qYwKDAwU6Cl+26CjT0ZvblHzfHJ+SjQDM4p1mZxtgHky4lhmG0+nNarRht8kADfZlbspJWdZarQ==", "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "license": "Apache-2.0", + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.3.0", + "minimatch": "^9.0.0", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" } }, - "unicode-length": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", - "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==", + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", + "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", "dev": true, - "requires": { - "punycode": "^2.0.0" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { + "license": "BSD-2-Clause", + "dependencies": { "punycode": "^2.1.0" } }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" }, - "validate-npm-package-license": { + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { + "license": "Apache-2.0", + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "which": { + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "word-wrap": { + "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "requires": { + "license": "ISC", + "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 14" + } }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.cjs.json b/package.cjs.json new file mode 100644 index 00000000..70b158ff --- /dev/null +++ b/package.cjs.json @@ -0,0 +1,4 @@ +{ + "main": "dist/cjs/index.js", + "type": "commonjs" +} diff --git a/package.json b/package.json index b3be32f7..32cd6b6b 100644 --- a/package.json +++ b/package.json @@ -2,25 +2,73 @@ "name": "cron-parser", "version": "4.8.1", "description": "Node.js library for parsing crontab instructions", - "main": "lib/parser.js", - "types": "index.d.ts", - "typesVersions": { - "<4.1": { - "*": [ - "types/ts3/*" - ] - } - }, - "directories": { - "test": "test" - }, + "main": "dist/index.js", + "types": "dist/types/index.d.ts", + "type": "commonjs", "scripts": { - "test:tsd": "tsd", - "test:unit": "TZ=UTC tap ./test/*.js", - "test:cover": "TZ=UTC tap --coverage-report=html ./test/*.js", + "clean": "rimraf dist", + "build": "npm run clean && tsc -p tsconfig.json", + "prepublishOnly": "npm run build", + "prepare": "husky install && npm run build", + "precommit": "lint-staged", "lint": "eslint .", "lint:fix": "eslint --fix .", - "test": "npm run lint && npm run test:unit && npm run test:tsd" + "lint:debug": "cross-env DEBUG=eslint:cli-engine eslint .", + "test:unit": "cross-env TZ=UTC jest", + "test:coverage": "cross-env TZ=UTC jest --coverage", + "generate-badges": "jest-coverage-badges", + "test:types": "npm run build && tsd", + "test": "cross-env TZ=UTC npm run lint && npm run test:types && npm run test:coverage && npm run generate-badges", + "docs": "rimraf docs && typedoc --out docs --readme none --name 'CronParser' src" + }, + "dependencies": { + "luxon": "^3.2.1" + }, + "devDependencies": { + "@tsd/typescript": "^5.0.4", + "@types/jest": "^29.5.1", + "@types/luxon": "^3.3.0", + "@types/node": "^18.15.13", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "cross-env": "^7.0.3", + "eslint": "^8.39.0", + "husky": "^8.0.3", + "jest": "^29.5.0", + "jest-coverage-badges": "^1.0.0", + "jest-runner-tsd": "^5.0.0", + "lint-staged": "^13.2.1", + "rimraf": "^5.0.0", + "shx": "^0.3.4", + "sinon": "^15.0.1", + "ts-jest": "^29.1.0", + "ts-node": "^10.9.1", + "tsd": "^0.28.1", + "typedoc": "^0.24.6", + "typescript": "^5.0.4" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{ts,js,json}": [ + "eslint --fix", + "git add" + ] + }, + "engines": { + "node": ">=15.14.0" + }, + "browser": { + "fs": false + }, + "tap": { + "check-coverage": false + }, + "tsd": { + "directory": "tests" }, "repository": { "type": "git", @@ -54,32 +102,5 @@ "Andy Thompson ", "Regev Brody " ], - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "devDependencies": { - "eslint": "^8.27.0", - "sinon": "^15.0.1", - "tap": "^16.3.3", - "tsd": "^0.26.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "browser": { - "fs": false - }, - "tap": { - "check-coverage": false - }, - "tsd": { - "directory": "test", - "compilerOptions": { - "lib": [ - "es2017", - "dom" - ] - } - } + "license": "MIT" } diff --git a/src/CronDate.ts b/src/CronDate.ts new file mode 100644 index 00000000..448ecfc4 --- /dev/null +++ b/src/CronDate.ts @@ -0,0 +1,507 @@ +import { DateTime } from 'luxon'; +import assert from 'assert'; +import { DateMathOp, TimeUnit } from './types'; + +type VerbMap = { + [key in TimeUnit]: () => void; +}; + +/** + * CronDate class that wraps the Luxon DateTime object to provide + * a consistent API for working with dates and times in the context of cron. + */ +export class CronDate { + #date: DateTime; + #dstStart: number | null = null; + #dstEnd: number | null = null; + + /** + * Constructs a new CronDate instance. + * @param {CronDate | Date | number | string} [timestamp] - The timestamp to initialize the CronDate with. + * @param {string} [tz] - The timezone to use for the CronDate. + */ + constructor(timestamp?: CronDate | Date | number | string, tz?: string) { + const dateOpts = { zone: tz }; + + // Initialize the internal DateTime object based on the type of timestamp provided. + if (!timestamp) { + this.#date = DateTime.local(); + } else if (timestamp instanceof CronDate) { + this.#date = timestamp.#date; + this.#dstStart = timestamp.#dstStart; + this.#dstEnd = timestamp.#dstEnd; + } else if (timestamp instanceof Date) { + this.#date = DateTime.fromJSDate(timestamp, dateOpts); + } else if (typeof timestamp === 'number') { + this.#date = DateTime.fromMillis(timestamp, dateOpts); + } else { + // redundant typeof check: 'timestamp' always has type 'string' + this.#date = DateTime.fromISO(timestamp, dateOpts); + this.#date.isValid || (this.#date = DateTime.fromRFC2822(timestamp, dateOpts)); + this.#date.isValid || (this.#date = DateTime.fromSQL(timestamp, dateOpts)); + this.#date.isValid || (this.#date = DateTime.fromFormat(timestamp, 'EEE, d MMM yyyy HH:mm:ss', dateOpts)); + } + + // Check for valid DateTime and throw an error if not valid. + assert(this.#date && this.#date.isValid, `CronDate: unhandled timestamp: ${JSON.stringify(timestamp)}`); + + // Set the timezone if it is provided and different from the current zone. + if (tz && tz !== this.#date.zoneName) { + this.#date = this.#date.setZone(tz); + } + } + + /** + * Returns daylight savings start time. + * @returns {number | null} + */ + get dstStart(): number | null { + return this.#dstStart; + } + + /** + * Sets daylight savings start time. + * @param {number | null} value + */ + set dstStart(value: number | null) { + this.#dstStart = value; + } + + /** + * Returns daylight savings end time. + * @returns {number | null} + */ + get dstEnd(): number | null { + return this.#dstEnd; + } + + /** + * Sets daylight savings end time. + * @param {number | null} value + */ + set dstEnd(value: number | null) { + this.#dstEnd = value; + } + + /** + * Adds one year to the current CronDate. + */ + addYear(): void { + this.#date = this.#date.plus({ years: 1 }); + } + + /** + * Adds one month to the current CronDate. + */ + addMonth(): void { + this.#date = this.#date.plus({ months: 1 }).startOf('month'); + } + + /** + * Adds one day to the current CronDate. + */ + addDay(): void { + this.#date = this.#date.plus({ days: 1 }).startOf('day'); + } + + /** + * Adds one hour to the current CronDate. + */ + addHour(): void { + this.#date = this.#date.plus({ hours: 1 }).startOf('hour'); + } + + /** + * Adds one minute to the current CronDate. + */ + addMinute(): void { + this.#date = this.#date.plus({ minutes: 1 }).startOf('minute'); + } + + /** + * Adds one second to the current CronDate. + */ + addSecond(): void { + this.#date = this.#date.plus({ seconds: 1 }).startOf('second'); + } + + /** + * Subtracts one year from the current CronDate. + */ + subtractYear(): void { + this.#date = this.#date.minus({ years: 1 }); + } + + /** + * Subtracts one month from the current CronDate. + * If the month is 1, it will subtract one year instead. + */ + subtractMonth(): void { + this.#date = this.#date.minus({ months: 1 }).endOf('month').startOf('second'); + } + + /** + * Subtracts one day from the current CronDate. + * If the day is 1, it will subtract one month instead. + */ + subtractDay(): void { + this.#date = this.#date.minus({ days: 1 }).endOf('day').startOf('second'); + } + + /** + * Subtracts one hour from the current CronDate. + * If the hour is 0, it will subtract one day instead. + */ + subtractHour(): void { + this.#date = this.#date.minus({ hours: 1 }).endOf('hour').startOf('second'); + } + + /** + * Subtracts one minute from the current CronDate. + * If the minute is 0, it will subtract one hour instead. + */ + subtractMinute(): void { + this.#date = this.#date.minus({ minutes: 1 }).endOf('minute').startOf('second'); + } + + /** + * Subtracts one second from the current CronDate. + * If the second is 0, it will subtract one minute instead. + */ + subtractSecond(): void { + this.#date = this.#date.minus({ seconds: 1 }).startOf('second'); + } + + /** + * Adds a unit of time to the current CronDate. + * @param {TimeUnit} unit + */ + addUnit(unit: TimeUnit): void { + const unitMap: VerbMap = { + [TimeUnit.Year]: () => this.addYear(), + [TimeUnit.Month]: () => this.addMonth(), + [TimeUnit.Day]: () => this.addDay(), + [TimeUnit.Hour]: () => this.addHour(), + [TimeUnit.Minute]: () => this.addMinute(), + [TimeUnit.Second]: () => this.addSecond(), + }; + assert(unit in unitMap, `Invalid unit: ${unit}`); + unitMap[unit](); + } + + /** + * Subtracts a unit of time from the current CronDate. + * @param {TimeUnit} unit + */ + subtractUnit(unit: TimeUnit): void { + const unitMap: VerbMap = { + [TimeUnit.Year]: () => this.subtractYear(), + [TimeUnit.Month]: () => this.subtractMonth(), + [TimeUnit.Day]: () => this.subtractDay(), + [TimeUnit.Hour]: () => this.subtractHour(), + [TimeUnit.Minute]: () => this.subtractMinute(), + [TimeUnit.Second]: () => this.subtractSecond(), + }; + assert(unit in unitMap, `Invalid unit: ${unit}`); + unitMap[unit](); + } + + /** + * Handles a math operation. + * @param {DateMathOp} verb - {'add' | 'subtract'} + * @param {TimeUnit} unit - {'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'} + */ + invokeDateOperation(verb: DateMathOp, unit: TimeUnit) { + if (verb === DateMathOp.Add) { + this.addUnit(unit); + return; + } + if (verb === DateMathOp.Subtract) { + this.subtractUnit(unit); + return; + } + /* istanbul ignore next - this would only happen if an end user call the handleMathOp with an invalid verb */ + throw new Error(`Invalid verb: ${verb}`); + } + + /** + * Returns the day. + * @returns {number} + */ + getDate(): number { + return this.#date.day; + } + + /** + * Returns the year. + * @returns {number} + */ + getFullYear(): number { + return this.#date.year; + } + + /** + * Returns the day of the week. + * @returns {number} + */ + getDay(): number { + const weekday = this.#date.weekday; + return weekday === 7 ? 0 : weekday; + } + + /** + * Returns the month. + * @returns {number} + */ + getMonth(): number { + return this.#date.month - 1; + } + + /** + * Returns the hour. + * @returns {number} + */ + getHours(): number { + return this.#date.hour; + } + + /** + * Returns the minutes. + * @returns {number} + */ + getMinutes(): number { + return this.#date.minute; + } + + /** + * Returns the seconds. + * @returns {number} + */ + getSeconds(): number { + return this.#date.second; + } + + /** + * Returns the milliseconds. + * @returns {number} + */ + getMilliseconds(): number { + return this.#date.millisecond; + } + + /** + * Returns the time. + * @returns {number} + */ + getTime(): number { + return this.#date.valueOf(); + } + + /** + * Returns the UTC day. + * @returns {number} + */ + getUTCDate(): number { + return this.#getUTC().day; + } + + /** + * Returns the UTC year. + * @returns {number} + */ + getUTCFullYear(): number { + return this.#getUTC().year; + } + + /** + * Returns the UTC day of the week. + * @returns {number} + */ + getUTCDay(): number { + const weekday = this.#getUTC().weekday; + return weekday === 7 ? 0 : weekday; + } + + /** + * Returns the UTC month. + * @returns {number} + */ + getUTCMonth(): number { + return this.#getUTC().month - 1; + } + + /** + * Returns the UTC hour. + * @returns {number} + */ + getUTCHours(): number { + return this.#getUTC().hour; + } + + /** + * Returns the UTC minutes. + * @returns {number} + */ + getUTCMinutes(): number { + return this.#getUTC().minute; + } + + /** + * Returns the UTC seconds. + * @returns {number} + */ + getUTCSeconds(): number { + return this.#getUTC().second; + } + + /** + * Returns the UTC milliseconds. + * @returns {string | null} + */ + toISOString(): string | null { + return this.#date.toUTC().toISO(); + } + + /** + * Returns the date as a JSON string. + * @returns {string | null} + */ + toJSON(): string | null { + return this.#date.toJSON(); + } + + /** + * Sets the day. + * @param d + */ + setDate(d: number): void { + this.#date = this.#date.set({ day: d }); + } + + /** + * Sets the year. + * @param y + */ + setFullYear(y: number): void { + this.#date = this.#date.set({ year: y }); + } + + /** + * Sets the day of the week. + * @param d + */ + setDay(d: number): void { + this.#date = this.#date.set({ weekday: d }); + } + + /** + * Sets the month. + * @param m + */ + setMonth(m: number): void { + this.#date = this.#date.set({ month: m + 1 }); + } + + /** + * Sets the hour. + * @param h + */ + setHours(h: number): void { + this.#date = this.#date.set({ hour: h }); + } + + /** + * Sets the minutes. + * @param m + */ + setMinutes(m: number): void { + this.#date = this.#date.set({ minute: m }); + } + + /** + * Sets the seconds. + * @param s + */ + setSeconds(s: number): void { + this.#date = this.#date.set({ second: s }); + } + + /** + * Sets the milliseconds. + * @param s + */ + setMilliseconds(s: number): void { + this.#date = this.#date.set({ millisecond: s }); + } + + /** + * Returns the date as a string. + * @returns {string} + */ + toString(): string { + return this.toDate().toString(); + } + + /** + * Returns the date as a Date object. + * @returns {Date} + */ + toDate(): Date { + return this.#date.toJSDate(); + } + + /** + * Returns true if the day is the last day of the month. + * @returns {boolean} + */ + isLastDayOfMonth(): boolean { + const newDate = this.#date.plus({ days: 1 }).startOf('day'); + return this.#date.month !== newDate.month; + } + + /** + * Returns true if the day is the last weekday of the month. + * @returns {boolean} + */ + isLastWeekdayOfMonth(): boolean { + const newDate = this.#date.plus({ days: 7 }).startOf('day'); + return this.#date.month !== newDate.month; + } + + /** + * Primarily for internal use. + * @param {DateMathOp} op - The operation to perform. + * @param {TimeUnit} unit - The unit of time to use. + * @param {number} [hoursLength] - The length of the hours. Required when unit is not month or day. + */ + applyDateOperation(op: DateMathOp, unit: TimeUnit, hoursLength?: number): void { + if (unit === TimeUnit.Month || unit === TimeUnit.Day) { + return void this.invokeDateOperation(op, unit); + } + assert(hoursLength !== undefined, 'hoursLength must be defined when unit is not month or day'); + const previousHour = this.getHours(); + this.invokeDateOperation(op, unit); + const currentHour = this.getHours(); + const diff = currentHour - previousHour; + if (diff === 2) { + if (hoursLength !== 24) { + this.dstStart = currentHour; + } + } else if (diff === 0 && this.getMinutes() === 0 && this.getSeconds() === 0) { + if (hoursLength !== 24) { + this.dstEnd = currentHour; + } + } + } + + /** + * Returns the UTC date. + * @private + * @returns {DateTime} + */ + #getUTC(): DateTime { + return this.#date.toUTC(); + } +} + +export default CronDate; diff --git a/src/CronExpression.ts b/src/CronExpression.ts new file mode 100644 index 00000000..f88d94fb --- /dev/null +++ b/src/CronExpression.ts @@ -0,0 +1,458 @@ +import { CronExpressionParser } from './CronExpressionParser'; +import { CronDate } from './CronDate'; +import { CronFieldCollection } from './CronFieldCollection'; +import assert from 'assert'; +import { + CronFieldType, + DateMathOp, + DayOfMonthRange, + DayOfWeekRange, + HourRange, + CronExpressionOptions, + CronFieldCollectionOptions, + CronParseOptions, + CronExpressionIteratorCallback, + CronExpressionIterator, + MonthRange, + SixtyRange, + TimeUnit, +} from './types'; +import { DateTime } from 'luxon'; + + +/** + * Cron iteration loop safety limit + */ +const LOOP_LIMIT = 10000; + +/** + * Class representing a Cron expression. + */ +export class CronExpression { + #options: CronParseOptions; + readonly #tz?: string; + #currentDate: CronDate; + readonly #startDate: CronDate | null; + readonly #endDate: CronDate | null; + readonly #isIterator: boolean; + #hasIterated: boolean; + readonly #nthDayOfWeek: number; + readonly #fields: CronFieldCollection; + + /** + * Creates a new CronExpression instance. + * + * @param {CronFieldCollection | CronFieldCollectionOptions} fields - Cron fields. + * @param {CronExpressionOptions} options - Parser options. + */ + constructor(fields: CronFieldCollection | CronFieldCollectionOptions, options: CronExpressionOptions) { + this.#options = options; + this.#tz = options.tz; + this.#currentDate = new CronDate(options.currentDate, this.#tz); + this.#startDate = options.startDate ? new CronDate(options.startDate, this.#tz) : null; + this.#endDate = options.endDate ? new CronDate(options.endDate, this.#tz) : null; + this.#isIterator = options.iterator || false; + this.#hasIterated = false; + this.#nthDayOfWeek = options.nthDayOfWeek || 0; + const { second, minute, hour, dayOfMonth, month, dayOfWeek } = fields; + this.#fields = new CronFieldCollection({ + second, + minute, + hour, + dayOfMonth, + month, + dayOfWeek, + }); + } + + /** + * Getter for the cron fields. + * + * @returns {CronFieldCollection} Cron fields. + */ + get fields(): CronFieldCollection { + return this.#fields; + } + + /** + * Asynchronously parses the input cron expression string. + * + * @public + * @param {string} expression - The input cron expression string. + * @param {CronParseOptions} [options] - Optional parsing options. + * @returns {CronExpression} - A new CronExpression instance. + */ + static parse(expression: string, options: CronParseOptions = {}): CronExpression { + return CronExpressionParser.parse(expression, options); + } + + /** + * Converts cron fields back to a CronExpression instance. + * + * @public + * @param {Record} fields - The input cron fields object. + * @param {CronParseOptions} [options] - Optional parsing options. + * @returns {CronExpression} - A new CronExpression instance. + */ + static fieldsToExpression(fields: CronFieldCollection, options?: CronExpressionOptions): CronExpression { + return new CronExpression(fields, options || {}); + } + + /** + * Checks if the given value matches any element in the sequence. + * + * @param {number} value - The value to be matched. + * @param {number[]} sequence - The sequence to be checked against. + * @returns {boolean} - True if the value matches an element in the sequence; otherwise, false. + * @memberof CronExpression + * @private + */ + static #matchSchedule(value: number, sequence: CronFieldType): boolean { + return sequence.some((element) => element === value); + } + + /** + * Checks if the 'L' character is present in any of the given expressions. + * + * @param {Array} expressions - An array of expressions to be checked. + * @returns {boolean} - True if the 'L' character is present in any of the expressions; otherwise, false. + * @memberof CronExpression + * @private + */ + static #isLInExpressions(expressions: (number | string)[]): boolean { + return ( + expressions.length > 0 && + expressions.some((expression: number | string) => { + return typeof expression === 'string' && expression.indexOf('L') >= 0; + }) + ); + } + + /** + * Determines if the current date matches the last specified weekday of the month. + * + * @param {Array<(number|string)>} expressions - An array of expressions containing weekdays and "L" for the last weekday. + * @param {CronDate} currentDate - The current date object. + * @returns {boolean} - True if the current date matches the last specified weekday of the month; otherwise, false. + * @memberof CronExpression + * @private + */ + static #isLastWeekdayOfMonthMatch(expressions: (number | string)[], currentDate: CronDate): boolean { + return expressions.some((expression: number | string) => { + // There might be multiple expressions and not all of them will contain the "L". + if (!CronExpression.#isLInExpressions([expression])) { + return false; + } + + // The first character represents the weekday + const weekday = parseInt(expression.toString().charAt(0), 10) % 7; + assert(!Number.isNaN(weekday), `Invalid last weekday of the month expression: ${expression}`); + + // Check if the current date matches the last specified weekday of the month + return currentDate.getDay() === weekday && currentDate.isLastWeekdayOfMonth(); + }); + } + + /** + * Find the next scheduled date based on the cron expression. + * @returns {CronDate | { value: CronDate; done: boolean }} - The next scheduled date or an ES6 compatible iterator object. + * @memberof CronExpression + * @public + */ + next(): CronDate | { value: CronDate; done: boolean } { + const schedule = this.#findSchedule(); + // Try to return ES6 compatible iterator + return this.#isIterator ? { value: schedule, done: !this.hasNext() } : schedule; + } + + /** + * Find the previous scheduled date based on the cron expression. + * @returns {CronDate | { value: CronDate; done: boolean }} - The previous scheduled date or an ES6 compatible iterator object. + * @memberof CronExpression + * @public + */ + prev(): CronDate | { value: CronDate; done: boolean } { + const schedule = this.#findSchedule(true); + // Try to return ES6 compatible iterator + // TODO: this needs to be refactored into a real iterator + /* istanbul ignore next - no idea how to trigger first branch */ + return this.#isIterator ? { value: schedule, done: !this.hasPrev() } : schedule; + } + + /** + * Check if there is a next scheduled date based on the current date and cron expression. + * @returns {boolean} - Returns true if there is a next scheduled date, false otherwise. + * @memberof CronExpression + * @public + */ + hasNext(): boolean { + const current = this.#currentDate; + const hasIterated = this.#hasIterated; + + try { + this.#findSchedule(); + return true; + } catch (err) { + return false; + } finally { + this.#currentDate = current; + this.#hasIterated = hasIterated; + } + } + + /** + * Check if there is a previous scheduled date based on the current date and cron expression. + * @returns {boolean} - Returns true if there is a previous scheduled date, false otherwise. + * @memberof CronExpression + * @public + */ + hasPrev(): boolean { + const current = this.#currentDate; + const hasIterated = this.#hasIterated; + + try { + this.#findSchedule(true); + return true; + } catch (err) { + return false; + } finally { + this.#currentDate = current; + this.#hasIterated = hasIterated; + } + } + + /** + * Iterate over a specified number of steps and optionally execute a callback function for each step. + * @param {number} steps - The number of steps to iterate. Positive value iterates forward, negative value iterates backward. + * @param {CronExpressionIteratorCallback} [callback] - Optional callback function to be executed for each step. + * @returns {(CronExpressionIterator | CronDate)[]} - An array of iterator fields or CronDate objects. + * @memberof CronExpression + * @public + */ + iterate(steps: number, callback?: CronExpressionIteratorCallback): (CronExpressionIterator | CronDate)[] { + const dates: (CronExpressionIterator | CronDate)[] = []; + + /** + * Process each step and execute the action function. + * @param {number} step - The current step number. + * @param {() => CronExpressionIterator | CronDate} action - The action function to be executed for the current step. + */ + const processStep = (step: number, action: () => CronExpressionIterator | CronDate) => { + try { + const item: CronExpressionIterator | CronDate = action(); + dates.push(item); + + // Fire the callback + if (callback) { + callback(item, step); + } + } catch (err) { + // Do nothing, as the loop will break on its own + } + }; + + if (steps >= 0) { + for (let i = 0; i < steps; i++) { + processStep(i, () => this.next()); + } + } else { + for (let i = 0; i > steps; i--) { + processStep(i, () => this.prev()); + } + } + + return dates; + } + + /** + * Reset the iterators current date to a new date or the initial date. + * @param {Date | CronDate} [newDate] - Optional new date to reset to. If not provided, it will reset to the initial date. + * @memberof CronExpression + * @public + */ + reset(newDate?: Date | CronDate): void { + this.#currentDate = new CronDate(newDate || this.#options.currentDate); + } + + /** + * Generate a string representation of the cron expression. + * @param {boolean} [includeSeconds=false] - Whether to include the seconds field in the string representation. + * @returns {string} - The string representation of the cron expression. + * @memberof CronExpression + * @public + */ + stringify(includeSeconds = false) { + return this.#fields.stringify(includeSeconds); + } + + /** + * Check if the cron expression includes the given date + * @param {Date|CronDate} date + * @returns {boolean} + */ + includesDate(date: Date | CronDate): boolean { + const { second, minute, hour, dayOfMonth, month, dayOfWeek } = this.#fields; + const dtStr = date.toISOString(); + assert(dtStr != null, 'Invalid date'); + const dt = DateTime.fromISO(dtStr, { zone: this.#tz }); + return ( + dayOfMonth.values.includes(dt.day) && + dayOfWeek.values.includes(dt.weekday) && + month.values.includes(dt.month) && + hour.values.includes(dt.hour) && + minute.values.includes(dt.minute) && + second.values.includes(dt.second) + ); + } + + /** + * Returns the string representation of the cron expression. + * @returns {CronDate} - The next schedule date. + */ + toString(): string { + /* istanbul ignore next - should be impossible under normal use to trigger the or branch */ + return this.#options.expression || this.stringify(true); + } + + /** + * Determines if the given date matches the cron expression's day of month and day of week fields. + * + * The function checks the following rules: + * Rule 1: If both "day of month" and "day of week" are restricted (not wildcard), then one or both must match the current day. + * Rule 2: If "day of month" is restricted and "day of week" is not restricted, then "day of month" must match the current day. + * Rule 3: If "day of month" is a wildcard, "day of week" is not a wildcard, and "day of week" matches the current day, then the match is accepted. + * If none of the rules match, the match is rejected. + * + * @param {CronDate} currentDate - The current date to be evaluated against the cron expression. + * @returns {boolean} Returns true if the current date matches the cron expression's day of month and day of week fields, otherwise false. + * @memberof CronExpression + * @private + */ + #matchDayOfMonth(currentDate: CronDate): boolean { + // Check if day of month and day of week fields are wildcards or restricted (not wildcard). + const isDayOfMonthWildcardMatch = this.#fields.dayOfMonth.isWildcard; + const isRestrictedDayOfMonth = !isDayOfMonthWildcardMatch; + const isDayOfWeekWildcardMatch = this.#fields.dayOfWeek.isWildcard; + const isRestrictedDayOfWeek = !isDayOfWeekWildcardMatch; + + // Calculate if the current date matches the day of month and day of week fields. + const matchedDOM = + CronExpression.#matchSchedule(currentDate.getDate(), this.#fields.dayOfMonth.values) || + (CronExpression.#isLInExpressions(this.#fields.dayOfMonth.values) && currentDate.isLastDayOfMonth()); + const matchedDOW = + CronExpression.#matchSchedule(currentDate.getDay(), this.#fields.dayOfWeek.values) || + (CronExpression.#isLInExpressions(this.#fields.dayOfWeek.values) && + CronExpression.#isLastWeekdayOfMonthMatch(this.#fields.dayOfWeek.values, currentDate)); + + // Rule 1: Both "day of month" and "day of week" are restricted; one or both must match the current day. + if (isRestrictedDayOfMonth && isRestrictedDayOfWeek && (matchedDOM || matchedDOW)) { + return true; + } + + // Rule 2: "day of month" restricted and "day of week" not restricted; "day of month" must match the current day. + if (matchedDOM && !isRestrictedDayOfWeek) { + return true; + } + + // Rule 3: "day of month" is a wildcard, "day of week" is not a wildcard, and "day of week" matches the current day. + if (isDayOfMonthWildcardMatch && !isDayOfWeekWildcardMatch && matchedDOW) { + return true; + } + + // If none of the rules match, the match is rejected. + return false; + } + + /** + * Determines if the current hour matches the cron expression. + * + * @param {CronDate} currentDate - The current date object. + * @param {DateMathOp} dateMathVerb - The date math operation enumeration value. + * @param {boolean} reverse - A flag indicating whether the matching should be done in reverse order. + * @returns {boolean} - True if the current hour matches the cron expression; otherwise, false. + */ + #matchHour(currentDate: CronDate, dateMathVerb: DateMathOp, reverse: boolean): boolean { + const currentHour = currentDate.getHours(); + const isMatch = CronExpression.#matchSchedule(currentHour, this.#fields.hour.values); + const isDstStart = currentDate.dstStart === currentHour; + const isDstEnd = currentDate.dstEnd === currentHour; + + if (!isMatch && !isDstStart) { + currentDate.dstStart = null; + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Hour, this.#fields.hour.values.length); + return false; + } + if (isDstStart && !CronExpression.#matchSchedule(currentHour - 1, this.#fields.hour.values)) { + currentDate.invokeDateOperation(dateMathVerb, TimeUnit.Hour); + return false; + } + if (isDstEnd && !reverse) { + currentDate.dstEnd = null; + currentDate.applyDateOperation(DateMathOp.Add, TimeUnit.Hour, this.#fields.hour.values.length); + return false; + } + return true; + } + + /** + * Finds the next or previous schedule based on the cron expression. + * + * @param {boolean} [reverse=false] - If true, finds the previous schedule; otherwise, finds the next schedule. + * @returns {CronDate} - The next or previous schedule date. + * @private + */ + #findSchedule(reverse = false): CronDate { + const dateMathVerb: DateMathOp = reverse ? DateMathOp.Subtract : DateMathOp.Add; + const currentDate = new CronDate(this.#currentDate, this.#tz); + const startDate = this.#startDate; + const endDate = this.#endDate; + const startTimestamp = currentDate.getTime(); + let stepCount = 0; + + while (stepCount++ < LOOP_LIMIT) { + assert(stepCount < LOOP_LIMIT, 'Invalid expression, loop limit exceeded'); + assert(!reverse || !(startDate && startDate.getTime() > currentDate.getTime()), 'Out of the timespan range'); + assert(reverse || !(endDate && currentDate.getTime() > endDate.getTime()), 'Out of the timespan range'); + + if (!this.#matchDayOfMonth(currentDate)) { + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Day, this.#fields.hour.values.length); + continue; + } + if (!(this.#nthDayOfWeek <= 0 || Math.ceil(currentDate.getDate() / 7) === this.#nthDayOfWeek)) { + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Day, this.#fields.hour.values.length); + continue; + } + if (!CronExpression.#matchSchedule(currentDate.getMonth() + 1, this.#fields.month.values)) { + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Month, this.#fields.hour.values.length); + continue; + } + if (!this.#matchHour(currentDate, dateMathVerb, reverse)) { + continue; + } + if (!CronExpression.#matchSchedule(currentDate.getMinutes(), this.#fields.minute.values)) { + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Minute, this.#fields.hour.values.length); + continue; + } + if (!CronExpression.#matchSchedule(currentDate.getSeconds(), this.#fields.second.values)) { + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Second, this.#fields.hour.values.length); + continue; + } + + if (startTimestamp === currentDate.getTime()) { + if (dateMathVerb === 'Add' || currentDate.getMilliseconds() === 0) { + currentDate.applyDateOperation(dateMathVerb, TimeUnit.Second, this.#fields.hour.values.length); + } else { + currentDate.setMilliseconds(0); + } + continue; + } + break; + } + + this.#currentDate = new CronDate(currentDate, this.#tz); + this.#hasIterated = true; + return currentDate; + } +} + +export default CronExpression; diff --git a/src/CronExpressionParser.ts b/src/CronExpressionParser.ts new file mode 100644 index 00000000..033490c1 --- /dev/null +++ b/src/CronExpressionParser.ts @@ -0,0 +1,281 @@ +import { CronDayOfMonth, CronDayOfTheWeek, CronFieldCollection, CronHour, CronMinute, CronMonth, CronSecond } from './CronFieldCollection'; +import { CronDate } from './CronDate'; +import { CronExpression } from './CronExpression'; +import { + CronConstraints, + CronUnit, + DayOfMonthRange, + DayOfWeekRange, + DayOfWeek, + HourRange, + CronParseOptions, + MonthRange, + Months, + ParseRageResponse, + PredefinedExpressions, + RawCronFields, + SixtyRange, +} from './types'; +import assert from 'assert'; + +/** + * Static class that parses a cron expression and returns a CronExpression object. + * @static + * @class CronExpressionParser + */ +export class CronExpressionParser { + /** + * Parses a cron expression and returns a CronExpression object. + * @param {string} expression - The cron expression to parse. + * @param {CronParseOptions} [options={}] - The options to use when parsing the expression. + * @param {boolean} [options.currentDate=false] - If true, will throw an error if the expression contains both dayOfMonth and dayOfWeek. + * @param {boolean} [options.strict=false] - If true, will throw an error if the expression contains both dayOfMonth and dayOfWeek. + * @param {CronDate} [options.currentDate=new CronDate(undefined, 'UTC')] - The date to use when calculating the next/previous occurrence. + * + * @returns {CronExpression} A CronExpression object. + */ + static parse(expression: string, options: CronParseOptions = {}): CronExpression { + const { strict = false } = options; + const currentDate = options.currentDate || new CronDate(undefined, 'UTC'); + + expression = PredefinedExpressions[ expression as keyof typeof PredefinedExpressions ] || expression; + const rawFields = CronExpressionParser.#getRawFields(expression, strict); + assert(rawFields.dayOfMonth === '*' || rawFields.dayOfWeek === '*' || !strict, 'Cannot use both dayOfMonth and dayOfWeek together in strict mode!'); + + const second = CronExpressionParser.#parseField('Second', rawFields.second, CronSecond.constraints) as SixtyRange[]; + const minute = CronExpressionParser.#parseField('Minute', rawFields.minute, CronMinute.constraints) as SixtyRange[]; + const hour = CronExpressionParser.#parseField('Hour', rawFields.hour, CronHour.constraints) as HourRange[]; + const month = CronExpressionParser.#parseField('Month', rawFields.month, CronMonth.constraints) as MonthRange[]; + const dayOfMonth = CronExpressionParser.#parseField('DayOfMonth', rawFields.dayOfMonth, CronDayOfMonth.constraints) as DayOfMonthRange[]; + const { dayOfWeek: _dayOfWeek, nthDayOfWeek } = CronExpressionParser.#parseNthDay(rawFields.dayOfWeek); + const dayOfWeek = CronExpressionParser.#parseField('DayOfWeek', _dayOfWeek, CronDayOfTheWeek.constraints) as DayOfWeekRange[]; + + const fields = new CronFieldCollection({ + second: new CronSecond(second, ['*', '?'].includes(rawFields.second)), + minute: new CronMinute(minute, ['*', '?'].includes(rawFields.minute)), + hour: new CronHour(hour, ['*', '?'].includes(rawFields.hour)), + dayOfMonth: new CronDayOfMonth(dayOfMonth, ['*', '?'].includes(rawFields.dayOfMonth)), + month: new CronMonth(month, ['*', '?'].includes(rawFields.month)), + dayOfWeek: new CronDayOfTheWeek(dayOfWeek, ['*', '?'].includes(rawFields.dayOfWeek)), + }); + return new CronExpression(fields, { ...options, expression, currentDate, nthDayOfWeek }); + } + + /** + * Get the raw fields from a cron expression. + * @param {string} expression - The cron expression to parse. + * @param {boolean} strict - If true, will throw an error if the expression contains both dayOfMonth and dayOfWeek. + * @private + * @returns {RawCronFields} The raw fields. + */ + static #getRawFields(expression: string, strict: boolean): RawCronFields { + assert(!strict || expression > '', 'Invalid cron expression'); + expression = expression || '0 * * * * *'; + const atoms = expression.trim().split(/\s+/); + assert(!strict || atoms.length === 6, 'Invalid cron expression, expected 6 fields'); + assert(atoms.length <= 6, 'Invalid cron expression, too many fields'); + const defaults = ['*', '*', '*', '*', '*', '0']; + if (atoms.length < defaults.length) { + atoms.unshift(...defaults.slice(atoms.length)); + } + const [second, minute, hour, dayOfMonth, month, dayOfWeek] = atoms; + return { second, minute, hour, dayOfMonth, month, dayOfWeek }; + } + + /** + * Parse a field from a cron expression. + * @param {string} field - The field to parse. + * @param {string} value - The value of the field. + * @param {CronConstraints} constraints - The constraints for the field. + * @private + * @returns {(number | string)[]} The parsed field. + */ + static #parseField(field: keyof typeof CronUnit, value: string, constraints: CronConstraints): (number | string)[] { + // Replace aliases for month and dayOfWeek + if (field === 'Month' || field === 'DayOfWeek') { + value = value.replace(/[a-z]{3}/gi, (match) => { + match = match.toLowerCase(); + const replacer = Months[ match as keyof typeof Months ] || DayOfWeek[ match as keyof typeof DayOfWeek ]; + assert(replacer != null, `Validation error, cannot resolve alias "${match}"`); + return replacer.toString(); + }); + } + + // Check for valid characters + assert(constraints.validChars.test(value), `Invalid characters, got value: ${value}`); + + // Replace '*' and '?' + value = value.replace(/[*?]/g, constraints.min + '-' + constraints.max); + const parsed = CronExpressionParser.#parseSequence(value, constraints, field); + if (field === 'DayOfWeek') { + if (parsed.includes(0) && !parsed.includes(7)) { + parsed.push(7); + } else if (parsed.includes(7) && !parsed.includes(0)) { + parsed.unshift(0); + } + } + return parsed; + } + + /** + * Parse a sequence from a cron expression. + * @param {string} val - The sequence to parse. + * @param {CronConstraints} constraints - The constraints for the field. + * @param {keyof typeof CronUnit} field - The field to parse. + * @private + */ + static #parseSequence(val: string, constraints: CronConstraints, field: keyof typeof CronUnit): (number | string)[] { + const stack: (number | string)[] = []; + + function handleResult(result: number | string | (number | string)[], constraints: CronConstraints) { + if (Array.isArray(result)) { + result.forEach((value) => { + /* istanbul ignore else - FIXME no idea how this is triggered or what it's purpose is */ + if (!CronExpressionParser.#isValidConstraintChar(constraints, value)) { + const v = parseInt(value.toString(), 10); + const isValid = v >= constraints.min && v <= constraints.max; + assert(isValid, `Constraint error, got value ${value} expected range ${constraints.min}-${constraints.max}`); + stack.push(value); + } else { + /* istanbul ignore next - FIXME no idea how this is triggered or what it's purpose is */ + stack.push(value); + } + }); + } else { + if (CronExpressionParser.#isValidConstraintChar(constraints, result)) { + stack.push(result); + } else { + const v = parseInt(result.toString(), 10); + const isValid = v >= constraints.min && v <= constraints.max; + assert(isValid, `Constraint error, got value ${result} expected range ${constraints.min}-${constraints.max}`); + stack.push(field === 'DayOfWeek' ? v % 7 : result); + } + } + } + + const atoms = val.split(','); + assert(atoms.every((atom) => atom.length > 0), 'Invalid list value format'); + atoms.forEach((atom) => handleResult(CronExpressionParser.#parseRepeat(atom, constraints, field), constraints)); + return stack; + } + + /** + * Parse repeat from a cron expression. + * @param {string} val - The repeat to parse. + * @param {CronConstraints} constraints - The constraints for the field. + * @param {keyof typeof CronUnit} field - The field to parse. + * @private + * @returns {(number | string)[]} The parsed repeat. + */ + static #parseRepeat(val: string, constraints: CronConstraints, field: keyof typeof CronUnit): ParseRageResponse { + const atoms = val.split('/'); + assert(atoms.length <= 2, `Invalid repeat: ${val}`); + if (atoms.length === 2) { + if (!isNaN(parseInt(atoms[ 0 ]))) { + atoms[ 0 ] = `${atoms[ 0 ]}-${constraints.max}`; + } + return CronExpressionParser.#parseRange(atoms[ 0 ], parseInt(atoms[ 1 ]), constraints, field); + } + + return CronExpressionParser.#parseRange(val, 1, constraints, field); + } + + /** + * Validate a cron range. + * @param {number} min - The minimum value of the range. + * @param {number} max - The maximum value of the range. + * @param {CronConstraints} constraints - The constraints for the field. + * @private + * @returns {void} + * @throws {Error} Throws an error if the range is invalid. + */ + static #validateRange(min: number, max: number, constraints: CronConstraints): void { + const isValid = !isNaN(min) && !isNaN(max) && min >= constraints.min && max <= constraints.max; + assert(isValid, `Constraint error, got range ${min}-${max} expected range ${constraints.min}-${constraints.max}`); + assert(min <= max, `Invalid range: ${min}-${max}, min(${min}) > max(${max})`); + } + + /** + * Validate a cron repeat interval. + * @param {number} repeatInterval - The repeat interval to validate. + * @private + * @returns {void} + * @throws {Error} Throws an error if the repeat interval is invalid. + */ + static #validateRepeatInterval(repeatInterval: number): void { + assert(!isNaN(repeatInterval) && repeatInterval > 0, `Constraint error, cannot repeat at every ${repeatInterval} time.`); + } + + /** + * Create a range from a cron expression. + * @param {number} min - The minimum value of the range. + * @param {number} max - The maximum value of the range. + * @param {number} repeatInterval - The repeat interval of the range. + * @param {keyof typeof CronUnit} field - The field to parse. + * @private + * @returns {number[]} The created range. + */ + static #createRange(min: number, max: number, repeatInterval: number, field: keyof typeof CronUnit): number[] { + const stack: number[] = []; + if (field === 'DayOfWeek' && max % 7 === 0) { + stack.push(0); + } + for (let index = min; index <= max; index += repeatInterval) { + if (stack.indexOf(index) === -1) { + stack.push(index); + } + } + return stack; + } + + /** + * Parse a range from a cron expression. + * @param {string} val - The range to parse. + * @param {number} repeatInterval - The repeat interval of the range. + * @param {CronConstraints} constraints - The constraints for the field. + * @param {keyof typeof CronUnit} field - The field to parse. + * @private + * @returns {number[] | string[] | number | string} The parsed range. + */ + static #parseRange(val: string, repeatInterval: number, constraints: CronConstraints, field: keyof typeof CronUnit): ParseRageResponse { + const atoms: string[] = val.split('-'); + if (atoms.length <= 1) { + return isNaN(+val) ? val : +val; + } + const [min, max] = atoms.map((num) => parseInt(num)); + this.#validateRange(min, max, constraints); + this.#validateRepeatInterval(repeatInterval); + + // Create range + return this.#createRange(min, max, repeatInterval, field); + } + + /** + * Parse a cron expression. + * @param {string} val - The cron expression to parse. + * @private + * @returns {string} The parsed cron expression. + */ + static #parseNthDay(val: string): { dayOfWeek: string; nthDayOfWeek?: number; } { + const atoms = val.split('#'); + if (atoms.length <= 1) { + return { dayOfWeek: atoms[ 0 ] }; + } + const nthValue = +atoms[ atoms.length - 1 ]; + const matches = val.match(/([,-/])/); + assert(matches === null, `Constraint error, invalid dayOfWeek \`#\` and \`${matches?.[ 0 ]}\` special characters are incompatible`); + assert(atoms.length <= 2 && !isNaN(nthValue) && nthValue >= 1 && nthValue <= 5, 'Constraint error, invalid dayOfWeek occurrence number (#)'); + return { dayOfWeek: atoms[ 0 ], nthDayOfWeek: nthValue }; + } + + /** + * Checks if a character is valid for a field. + * @param {CronConstraints} constraints - The constraints for the field. + * @param {string | number} value - The value to check. + * @private + * @returns {boolean} Whether the character is valid for the field. + */ + static #isValidConstraintChar(constraints: CronConstraints, value: string | number): boolean { + return constraints.chars.some((char) => value.toString().includes(char)); + } +} diff --git a/src/CronFieldCollection.ts b/src/CronFieldCollection.ts new file mode 100644 index 00000000..23af0dea --- /dev/null +++ b/src/CronFieldCollection.ts @@ -0,0 +1,345 @@ +import assert from 'assert'; +import { CronChars, DayOfMonthRange, CronFieldCollectionOptions, FieldRange, MonthRange, SerializedCronFields } from './types'; +import { CronSecond } from './fields/CronSecond'; +import { CronMinute } from './fields/CronMinute'; +import { CronHour } from './fields/CronHour'; +import { CronDayOfMonth } from './fields/CronDayOfMonth'; +import { CronMonth } from './fields/CronMonth'; +import { CronDayOfTheWeek } from './fields/CronDayOfTheWeek'; +import { CronField } from './fields/CronField'; + +export { CronSecond, CronMinute, CronHour, CronDayOfMonth, CronMonth, CronDayOfTheWeek }; + +/** + * Represents a complete set of cron fields. + * @class CronFieldCollection + */ +export class CronFieldCollection { + readonly #second: CronSecond; + readonly #minute: CronMinute; + readonly #hour: CronHour; + readonly #dayOfMonth: CronDayOfMonth; + readonly #month: CronMonth; + readonly #dayOfWeek: CronDayOfTheWeek; + + /** + * CronFieldCollection constructor. Initializes the cron fields with the provided values. + * @param {CronFieldCollectionOptions} param0 - The cron fields values + * @throws {Error} if validation fails + * @example + * const cronFields = new CronFieldCollection({ + * second: new CronSecond([0]), + * minute: new CronMinute([0, 30]), + * hour: new CronHour([9]), + * dayOfMonth: new CronDayOfMonth([15]), + * month: new CronMonth([1]), + * dayOfWeek: new CronDayOfTheWeek([1, 2, 3, 4, 5]), + * }) + * + * console.log(cronFields.second.values); // [0] + * console.log(cronFields.minute.values); // [0, 30] + * console.log(cronFields.hour.values); // [9] + * console.log(cronFields.dayOfMonth.values); // [15] + * console.log(cronFields.month.values); // [1] + * console.log(cronFields.dayOfWeek.values); // [1, 2, 3, 4, 5] + */ + constructor({ second, minute, hour, dayOfMonth, month, dayOfWeek }: CronFieldCollectionOptions) { + // this is ugly need to separate the logic in #handleMaxDaysInMonth + if (!(dayOfMonth instanceof CronDayOfMonth)) { + /* istanbul ignore next - needs to be refactored */ + if (month instanceof CronMonth) { + /* istanbul ignore next - needs to be refactored */ + throw new Error('Validation error, month must not be an instance of CronMonth when dayOfMonth is not an instance of CronDayOfMonth'); + } + dayOfMonth = CronFieldCollection.#handleMaxDaysInMonth(month, dayOfMonth); + } else { + if (month instanceof CronMonth) { + CronFieldCollection.#handleMaxDaysInMonth(month.values, dayOfMonth.values); + } else { + throw new Error('Validation error, month must be an instance of CronMonth when dayOfMonth is an instance of CronDayOfMonth'); + } + } + assert(second, 'Validation error, Field second is missing'); + assert(minute, 'Validation error, Field minute is missing'); + assert(hour, 'Validation error, Field hour is missing'); + assert(dayOfMonth, 'Validation error, Field dayOfMonth is missing'); + assert(month, 'Validation error, Field month is missing'); + assert(dayOfWeek, 'Validation error, Field dayOfWeek is missing'); + + this.#second = second instanceof CronSecond ? second : new CronSecond(second); + this.#minute = minute instanceof CronMinute ? minute : new CronMinute(minute); + this.#hour = hour instanceof CronHour ? hour : new CronHour(hour); + this.#dayOfMonth = dayOfMonth instanceof CronDayOfMonth ? dayOfMonth : new CronDayOfMonth(dayOfMonth); + this.#month = month instanceof CronMonth ? month : new CronMonth(month); + this.#dayOfWeek = dayOfWeek instanceof CronDayOfTheWeek ? dayOfWeek : new CronDayOfTheWeek(dayOfWeek); + } + + /** + * Returns the second field. + * @returns {CronSecond} + */ + get second(): CronSecond { + return this.#second; + } + + /** + * Returns the minute field. + * @returns {CronMinute} + */ + get minute(): CronMinute { + return this.#minute; + } + + /** + * Returns the hour field. + * @returns {CronHour} + */ + get hour(): CronHour { + return this.#hour; + } + + /** + * Returns the day of the month field. + * @returns {CronDayOfMonth} + */ + get dayOfMonth(): CronDayOfMonth { + return this.#dayOfMonth; + } + + /** + * Returns the month field. + * @returns {CronMonth} + */ + get month(): CronMonth { + return this.#month; + } + + /** + * Returns the day of the week field. + * @returns {CronDayOfTheWeek} + */ + get dayOfWeek(): CronDayOfTheWeek { + return this.#dayOfWeek; + } + + /** + * Returns a string representation of the cron fields. + * @param {(number | CronChars)[]} input - The cron fields values + * @static + * @returns {FieldRange[]} - The compacted cron fields + */ + static compactField(input: (number | CronChars)[]): FieldRange[] { + if (input.length === 0) { + return []; + } + + // Initialize the output array and current IFieldRange + const output: FieldRange[] = []; + let current: FieldRange | undefined = undefined; + + input.forEach((item, i, arr) => { + // If the current FieldRange is undefined, create a new one with the current item as the start. + if (current === undefined) { + current = { start: item, count: 1 }; + return; + } + + // Cache the previous and next items in the array. + const prevItem = arr[i - 1] || current.start; + const nextItem = arr[i + 1]; + + // If the current item is 'L' or 'W', push the current FieldRange to the output and + // create a new FieldRange with the current item as the start. + // 'L' and 'W' characters are special cases that need to be handled separately. + if (item === 'L' || item === 'W') { + output.push(current); + output.push({ start: item, count: 1 }); + current = undefined; + return; + } + + // If the current step is undefined and there is a next item, update the current IFieldRange. + // This block checks if the current step needs to be updated and does so if needed. + if (current.step === undefined && nextItem !== undefined) { + const step = item - (prevItem as number); + const nextStep = (nextItem as number) - item; + + // If the current step is less or equal to the next step, update the current FieldRange to include the current item. + if (step <= nextStep) { + current = { ...current, count: 2, end: item, step }; + return; + } + current.step = 1; + } + + // If the difference between the current item and the current end is equal to the current step, + // update the current IFieldRange's count and end. + // This block checks if the current item is part of the current range and updates the range accordingly. + if (item - (current.end ?? 0) === current.step) { + current.count++; + current.end = item; + } else { + // If the count is 1, push a new FieldRange with the current start. + // This handles the case where the current range has only one element. + if (current.count === 1) { + // If the count is 2, push two separate IFieldRanges, one for each element. + output.push({ start: current.start, count: 1 }); + } else if (current.count === 2) { + output.push({ start: current.start, count: 1 }); + // current.end can never be undefined here but typescript doesn't know that + // this is why we ?? it and then ignore the prevItem in the coverage + output.push({ + start: current.end ?? /* istanbul ignore next - see above */ prevItem, + count: 1, + }); + } else { + // Otherwise, push the current FieldRange to the output. + output.push(current); + } + // Reset the current FieldRange with the current item as the start. + current = { start: item, count: 1 }; + } + }); + + // Push the final IFieldRange, if any, to the output array. + if (current) { + output.push(current); + } + return output; + } + + /** + * Handles a single range. + * @param {MonthRange[]} month The month range. + * @param {DayOfMonthRange[]} dayOfMonth The day of the month range. + * @returns {DayOfMonthRange[]} The day of the month range. + * @private + */ + static #handleMaxDaysInMonth(month: MonthRange[], dayOfMonth: DayOfMonthRange[]): DayOfMonthRange[] { + if (month.length === 1) { + const daysInMonth = CronMonth.daysInMonth[month[0] - 1]; + const v = parseInt(dayOfMonth[0] as string, 10); + assert(v <= daysInMonth, 'Invalid explicit day of month definition'); + + return dayOfMonth.filter((dayOfMonth: number | string) => (dayOfMonth === 'L' ? true : (dayOfMonth as number) <= daysInMonth)); + } + return dayOfMonth; + } + + /** + * Handles a single range. + * @param {FieldRange} range {start: number, end: number, step: number, count: number} The range to handle. + * @param {number} min The minimum value for the field. + * @param {number} max The maximum value for the field. + * @returns {string | null} The stringified range or null if it cannot be stringified. + * @private + */ + static #handleSingleRange(range: FieldRange, min: number, max: number): string | null { + const step = range.step; + if (!step) { + return null; + } + if (step === 1 && range.start === min && range.end && range.end >= max) { + return '*'; + } + if (step !== 1 && range.start === min && range.end && range.end >= max - step + 1) { + return `*/${step}`; + } + return null; + } + + /** + * Handles multiple ranges. + * @param {FieldRange} range {start: number, end: number, step: number, count: number} The range to handle. + * @param {number} max The maximum value for the field. + * @returns {string} The stringified range. + * @private + */ + static #handleMultipleRanges(range: FieldRange, max: number): string { + const step = range.step; + if (step === 1) { + return `${range.start}-${range.end}`; + } + + const multiplier = range.start === 0 ? range.count - 1 : range.count; + assert(step, 'Unexpected range step'); + assert(range.end, 'Unexpected range end'); + if (step * multiplier > range.end) { + const mapFn = (_: number, index: number) => { + assert(typeof range.start === 'number', 'Unexpected range start'); + return index % step === 0 ? range.start + index : null; + }; + assert(typeof range.start === 'number', 'Unexpected range start'); + const seed = { length: range.end - range.start + 1 }; + return Array.from(seed, mapFn) + .filter((value) => value !== null) + .join(','); + } + + return range.end === max - step + 1 ? `${range.start}/${step}` : `${range.start}-${range.end}/${step}`; + } + + /** + * Returns a string representation of the cron fields. + * @param {CronField} field - The cron field to stringify + * @static + * @returns {string} - The stringified cron field + */ + stringifyField(field: CronField): string { + let max = field.max; + let values = field.values; + if (field instanceof CronDayOfTheWeek) { + max = 6; + const dayOfWeek = this.#dayOfWeek.values; + values = dayOfWeek[dayOfWeek.length - 1] === 7 ? dayOfWeek.slice(0, -1) : dayOfWeek; + } + if (field instanceof CronDayOfMonth) { + max = this.#month.values.length === 1 ? CronMonth.daysInMonth[this.#month.values[0] - 1] : field.max; + } + const ranges = CronFieldCollection.compactField(values); + + if (ranges.length === 1) { + const singleRangeResult = CronFieldCollection.#handleSingleRange(ranges[0], field.min, max); + if (singleRangeResult) { + return singleRangeResult; + } + } + return ranges.map((range) => (range.count === 1 ? range.start.toString() : CronFieldCollection.#handleMultipleRanges(range, max))).join(','); + } + + /** + * Returns a string representation of the cron field values. + * @param {boolean} includeSeconds - Whether to include seconds in the output + * @returns {string} The formatted cron string + */ + stringify(includeSeconds = false): string { + const arr = []; + if (includeSeconds) { + arr.push(this.stringifyField(this.#second)); // second + } + + arr.push( + this.stringifyField(this.#minute), // minute + this.stringifyField(this.#hour), // hour + this.stringifyField(this.#dayOfMonth), // dayOfMonth + this.stringifyField(this.#month), // month + this.stringifyField(this.#dayOfWeek), // dayOfWeek + ); + return arr.join(' '); + } + + /** + * Returns a serialized representation of the cron fields values. + * @returns {SerializedCronFields} An object containing the cron field values + */ + serialize(): SerializedCronFields { + return { + second: this.#second.serialize(), + minute: this.#minute.serialize(), + hour: this.#hour.serialize(), + dayOfMonth: this.#dayOfMonth.serialize(), + month: this.#month.serialize(), + dayOfWeek: this.#dayOfWeek.serialize(), + }; + } +} diff --git a/src/CronParser.ts b/src/CronParser.ts new file mode 100644 index 00000000..3d5bdc5c --- /dev/null +++ b/src/CronParser.ts @@ -0,0 +1,116 @@ +import fs from 'fs'; +import { ParseStringResponse } from './types'; +import { CronExpression } from './CronExpression'; +import { CronFieldCollection } from './CronFieldCollection'; +import assert from 'assert'; +import ErrnoException = NodeJS.ErrnoException; + +// noinspection JSUnusedGlobalSymbols +class CronParser { + /** + * Wrapper for CronExpression.parse method + * + * @public + * @param {string} expression Input expression + * @param {object} [options] Parsing options + * @return {object} + */ + static parseExpression(expression: string, options?: object): CronExpression { + return CronExpression.parse(expression, options); + } + + /** + * Wrapper for CronExpression.fieldsToExpression method + * + * @public + * @param {object} fields Input fields + * @param {object} [options] Parsing options + * @return {object} + */ + static fieldsToExpression(fields: CronFieldCollection, options?: object): CronExpression { + return CronExpression.fieldsToExpression(fields, options); + } + + /** + * Parse content string + * + * @public + * @param {string} data Crontab content + * @return {object} + */ + static parseString(data: string) { + const blocks = data.split('\n'); + + const response: ParseStringResponse = { + variables: {}, + expressions: [], + errors: {}, + }; + + for (const block of blocks) { + const entry = block.trim(); // Remove surrounding spaces + + if (entry.length > 0) { + if (entry.match(/^#/)) { + // Comment + // continue; // unnecessary + } else if (entry.match(/^(.*)=(.*)$/)) { + // Variable + const matches = entry.match(/^(.*)=(.*)$/); + assert(matches !== null, 'parseString: matches is null'); + const [, /* unused */ key, value] = matches; + response.variables[key] = value; + } else { + // Expression? + try { + const result = CronParser.#parseEntry('0 ' + entry); + response.expressions.push(result.interval); + } catch (err: unknown) { + response.errors[entry] = err; + } + } + } + } + + return response; + } + + /** + * Parse crontab file + * + * @public + * @param {string} filePath Path to file + * @param {function} callback + */ + static parseFile(filePath: string, callback: (error: ErrnoException | null, data?: ParseStringResponse) => void) { + fs.readFile(filePath, (err, data) => { + if (err) { + return void callback(err); + } + callback(null, CronParser.parseString(data.toString())); + }); + } + + /** + * Parse crontab entry + * + * @private + * @param {string} entry Crontab file entry/line + */ + static #parseEntry(entry: string) { + const atoms = entry.split(' '); + + if (atoms.length === 6) { + return { interval: CronExpression.parse(entry) }; + } else if (atoms.length > 6) { + return { + interval: CronExpression.parse(atoms.slice(0, 6).join(' ')), + command: atoms.slice(6, atoms.length), + }; + } else { + throw new Error(`Invalid entry: ${entry}`); + } + } +} + +export { CronParser }; diff --git a/src/fields/CronDayOfMonth.ts b/src/fields/CronDayOfMonth.ts new file mode 100644 index 00000000..f7f4ca07 --- /dev/null +++ b/src/fields/CronDayOfMonth.ts @@ -0,0 +1,46 @@ +import { CronField } from './CronField'; +import { CronChars, CronMax, CronMin, DayOfMonthRange } from '../types'; + +const MIN_DAY = 1; +const MAX_DAY = 31; +const DAY_CHARS = Object.freeze(['L']) as CronChars[]; + +/** + * Represents the "day of the month" field within a cron expression. + * @class CronDayOfMonth + * @extends CronField + */ +export class CronDayOfMonth extends CronField { + static get min(): CronMin { + return MIN_DAY; + } + + static get max(): CronMax { + return MAX_DAY; + } + + static get chars(): CronChars[] { + return DAY_CHARS; + } + static get validChars(): RegExp { + return /^[?,*\dL/-]+$/; + } + /** + * CronDayOfMonth constructor. Initializes the "day of the month" field with the provided values. + * @param {DayOfMonthRange[]} values - Values for the "day of the month" field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + * @throws {Error} if validation fails + */ + constructor(values: DayOfMonthRange[], wildcard = false) { + super(values, wildcard); + this.validate(); + } + + /** + * Returns an array of allowed values for the "day of the month" field. + * @returns {DayOfMonthRange[]} + */ + get values(): DayOfMonthRange[] { + return super.values as DayOfMonthRange[]; + } +} diff --git a/src/fields/CronDayOfTheWeek.ts b/src/fields/CronDayOfTheWeek.ts new file mode 100644 index 00000000..0c361ef9 --- /dev/null +++ b/src/fields/CronDayOfTheWeek.ts @@ -0,0 +1,47 @@ +import { CronField } from './CronField'; +import { CronChars, CronMax, CronMin, DayOfWeekRange } from '../types'; + +const MIN_DAY = 0; +const MAX_DAY = 7; +const DAY_CHARS: readonly CronChars[] = Object.freeze(['L']) ; + +/** + * Represents the "day of the week" field within a cron expression. + * @class CronDayOfTheWeek + * @extends CronField + */ +export class CronDayOfTheWeek extends CronField { + static get min(): CronMin { + return MIN_DAY; + } + + static get max(): CronMax { + return MAX_DAY; + } + + static get chars(): readonly CronChars[] { + return DAY_CHARS; + } + + static get validChars(): RegExp { + return /^[?,*\dL#/-]+$/; + } + + /** + * CronDayOfTheWeek constructor. Initializes the "day of the week" field with the provided values. + * @param {DayOfWeekRange[]} values - Values for the "day of the week" field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + */ + constructor(values: DayOfWeekRange[], wildcard = false) { + super(values, wildcard); + this.validate(); + } + + /** + * Returns an array of allowed values for the "day of the week" field. + * @returns {DayOfWeekRange[]} + */ + get values(): DayOfWeekRange[] { + return super.values as DayOfWeekRange[]; + } +} diff --git a/src/fields/CronField.ts b/src/fields/CronField.ts new file mode 100644 index 00000000..0108968d --- /dev/null +++ b/src/fields/CronField.ts @@ -0,0 +1,156 @@ +import { CronChars, CronConstraints, CronFieldType, CronMax, CronMin, SerializedCronField } from '../types'; +import assert from 'assert'; + +/** + * Represents a field within a cron expression. + * This is a base class and should not be instantiated directly. + * @class CronField + */ +export abstract class CronField { + readonly #wildcard: boolean = false; + readonly #values: (number | string)[] = []; + + /** + * Returns the minimum value allowed for this field. + */ + /* istanbul ignore next */static get min(): CronMin { + /* istanbul ignore next */ + throw new Error('min must be overridden'); + } + + /** + * Returns the maximum value allowed for this field. + */ + /* istanbul ignore next */static get max(): CronMax { + /* istanbul ignore next */ + throw new Error('max must be overridden'); + } + + /** + * Returns the allowed characters for this field. + */ + /* istanbul ignore next */static get chars(): readonly CronChars[] { + /* istanbul ignore next - this is overridden */ + return Object.freeze([]); + } + + /** + * Returns the regular expression used to validate this field. + */ + static get validChars(): RegExp { + return /^[,*\d/-]+$/; + } + + /** + * Returns the constraints for this field. + */ + static get constraints(): CronConstraints { + return { min: this.min, max: this.max, chars: this.chars, validChars: this.validChars }; + } + + + /** + * CronField constructor. Initializes the field with the provided values. + * @param {number[] | string[]} values - Values for this field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + * @throws {TypeError} if the constructor is called directly + * @throws {Error} if validation fails + */ + protected constructor(values: (number | string)[], /* istanbul ignore next - we always pass a value */ wildcard = false) { + assert(Array.isArray(values), `${this.constructor.name} Validation error, values is not an array`); + assert(values.length > 0, `${this.constructor.name} Validation error, values contains no values`); + this.#values = values.sort(CronField.sorter); + Object.freeze(this.#values); + this.#wildcard = wildcard; + } + + /** + * Returns the minimum value allowed for this field. + * @returns {number} + */ + get min(): number { + // return the static value from the child class + return (this.constructor as typeof CronField).min; + } + + /** + * Returns the maximum value allowed for this field. + * @returns {number} + */ + get max(): number { + // return the static value from the child class + return (this.constructor as typeof CronField).max; + } + + /** + * Returns an array of allowed special characters for this field. + * @returns {string[]} + */ + get chars(): readonly string[] { + // return the frozen static value from the child class + return (this.constructor as typeof CronField).chars; + } + + /** + * Indicates whether this field is a wildcard. + * @returns {boolean} + */ + get isWildcard(): boolean { + return this.#wildcard; + } + + /** + * Returns an array of allowed values for this field. + * @returns {CronFieldType} + */ + get values(): CronFieldType { + // return a copy of the values, so they can't be mutated + return this.#values as CronFieldType; + } + + /** + * Helper function to sort values in ascending order. + * @param {number | string} a - First value to compare + * @param {number | string} b - Second value to compare + * @returns {number} - A negative, zero, or positive value, depending on the sort order + */ + static sorter(a: number | string, b: number | string): number { + const aIsNumber = typeof a === 'number'; + const bIsNumber = typeof b === 'number'; + if (aIsNumber && bIsNumber) return (a as number) - (b as number); + if (!aIsNumber && !bIsNumber) return (a as string).localeCompare(b as string); + return aIsNumber ? /* istanbul ignore next - A will always be a number until L-2 is supported */ -1 : 1; + } + + /** + * Serializes the field to an object. + * @todo This is really only for debugging, should it be removed? + * @returns {SerializedCronField} + */ + serialize(): SerializedCronField { + return { + wildcard: this.#wildcard, + values: this.#values, + }; + } + + /** + * Validates the field values against the allowed range and special characters. + * @throws {Error} if validation fails + */ + validate(): void { + let badValue: number | string | undefined; + const charsString = this.chars.length > 0 ? ` or chars ${this.chars.join('')}` : ''; + + const charTest = (value: string) => (char: string) => (new RegExp(`^\\d{0,2}${char}$`)).test(value); + const rangeTest = (value: number | string) => { + badValue = value; + return typeof value === 'number' ? value >= this.min && value <= this.max : this.chars.some(charTest(value)); + }; + const isValidRange = this.#values.every(rangeTest); + assert(isValidRange, `${this.constructor.name} Validation error, got value ${badValue} expected range ${this.min}-${this.max}${charsString}`); + // check for duplicate value in this.#values array + const duplicate = this.#values.find((value, index) => this.#values.indexOf(value) !== index); + assert(!duplicate,`${this.constructor.name} Validation error, duplicate values found: ${duplicate}`); + } +} diff --git a/src/fields/CronHour.ts b/src/fields/CronHour.ts new file mode 100644 index 00000000..36d904f2 --- /dev/null +++ b/src/fields/CronHour.ts @@ -0,0 +1,43 @@ +import { CronField } from './CronField'; +import { CronChars, CronMax, CronMin, HourRange } from '../types'; + +const MIN_HOUR = 0; +const MAX_HOUR = 23; +const HOUR_CHARS: readonly CronChars[] = Object.freeze([]); + +/** + * Represents the "hour" field within a cron expression. + * @class CronHour + * @extends CronField + */ +export class CronHour extends CronField { + static get min(): CronMin { + return MIN_HOUR; + } + + static get max(): CronMax { + return MAX_HOUR; + } + + static get chars(): readonly CronChars[] { + return HOUR_CHARS; + } + + /** + * CronHour constructor. Initializes the "hour" field with the provided values. + * @param {HourRange[]} values - Values for the "hour" field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + */ + constructor(values: HourRange[], wildcard = false) { + super(values, wildcard); + this.validate(); + } + + /** + * Returns an array of allowed values for the "hour" field. + * @returns {HourRange[]} + */ + get values(): HourRange[] { + return super.values as HourRange[]; + } +} diff --git a/src/fields/CronMinute.ts b/src/fields/CronMinute.ts new file mode 100644 index 00000000..1449b9ed --- /dev/null +++ b/src/fields/CronMinute.ts @@ -0,0 +1,43 @@ +import { CronField } from './CronField'; +import { CronChars, CronMax, CronMin, SixtyRange } from '../types'; + +const MIN_MINUTE = 0; +const MAX_MINUTE = 59; +const MINUTE_CHARS: readonly CronChars[] = Object.freeze([]); + +/** + * Represents the "second" field within a cron expression. + * @class CronSecond + * @extends CronField + */ +export class CronMinute extends CronField { + static get min(): CronMin { + return MIN_MINUTE; + } + + static get max(): CronMax { + return MAX_MINUTE; + } + + static get chars(): readonly CronChars[] { + return MINUTE_CHARS; + } + + /** + * CronSecond constructor. Initializes the "second" field with the provided values. + * @param {SixtyRange[]} values - Values for the "second" field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + */ + constructor(values: SixtyRange[], wildcard = false) { + super(values, wildcard); + this.validate(); + } + + /** + * Returns an array of allowed values for the "second" field. + * @returns {SixtyRange[]} + */ + get values(): SixtyRange[] { + return super.values as SixtyRange[]; + } +} diff --git a/src/fields/CronMonth.ts b/src/fields/CronMonth.ts new file mode 100644 index 00000000..5e2545fd --- /dev/null +++ b/src/fields/CronMonth.ts @@ -0,0 +1,49 @@ +import { CronField } from './CronField'; +import { CronChars, CronMax, CronMin, MonthRange } from '../types'; + +const MIN_MONTH = 1; +const MAX_MONTH = 12; +const MONTH_CHARS: readonly CronChars[] = Object.freeze([]); + +const DAYS_IN_MONTH: readonly number[] = Object.freeze([31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]); + +/** + * Represents the "day of the month" field within a cron expression. + * @class CronDayOfMonth + * @extends CronField + */ +export class CronMonth extends CronField { + static get min(): CronMin { + return MIN_MONTH; + } + + static get max(): CronMax { + return MAX_MONTH; + } + + static get chars(): readonly CronChars[] { + return MONTH_CHARS; + } + + static get daysInMonth(): readonly number[] { + return DAYS_IN_MONTH; + } + + /** + * CronDayOfMonth constructor. Initializes the "day of the month" field with the provided values. + * @param {MonthRange[]} values - Values for the "day of the month" field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + */ + constructor(values: MonthRange[], wildcard = false) { + super(values, wildcard); + this.validate(); + } + + /** + * Returns an array of allowed values for the "day of the month" field. + * @returns {MonthRange[]} + */ + get values(): MonthRange[] { + return super.values as MonthRange[]; + } +} diff --git a/src/fields/CronSecond.ts b/src/fields/CronSecond.ts new file mode 100644 index 00000000..e8827b57 --- /dev/null +++ b/src/fields/CronSecond.ts @@ -0,0 +1,41 @@ +import { CronChars, CronMax, CronMin, SixtyRange } from '../types'; +import { CronField } from './CronField'; + +const MIN_SECOND = 0; +const MAX_SECOND = 59; +const SECOND_CHARS: readonly CronChars[] = Object.freeze([]); + +/** + * Represents the "second" field within a cron expression. + * @class CronSecond + * @extends CronField + */ +export class CronSecond extends CronField { + static get min(): CronMin { + return MIN_SECOND; + } + static get max(): CronMax { + return MAX_SECOND; + } + static get chars(): readonly CronChars[] { + return SECOND_CHARS; + } + + /** + * CronSecond constructor. Initializes the "second" field with the provided values. + * @param {SixtyRange[]} values - Values for the "second" field + * @param {boolean} [wildcard=false] - Whether this field is a wildcard + */ + constructor(values: SixtyRange[], wildcard = false) { + super(values, wildcard); + this.validate(); + } + + /** + * Returns an array of allowed values for the "second" field. + * @returns {SixtyRange[]} + */ + get values(): SixtyRange[] { + return super.values as SixtyRange[]; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..07e58d54 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,49 @@ +/* istanbul ignore file */ +export { CronFieldCollection } from './CronFieldCollection'; +export { CronParser } from './CronParser'; +export { CronDate } from './CronDate'; +export { CronDayOfMonth } from './fields/CronDayOfMonth'; +export { CronDayOfTheWeek } from './fields/CronDayOfTheWeek'; +export { CronField } from './fields/CronField'; +export { CronHour } from './fields/CronHour'; +export { CronMinute } from './fields/CronMinute'; +export { CronMonth } from './fields/CronMonth'; +export { CronSecond } from './fields/CronSecond'; +export { CronExpression } from './CronExpression'; +import { CronParser } from './CronParser'; + +export default CronParser; + +// Exported types +export { + // Enums + DateMathOp, + TimeUnit, + DayOfWeek, + PredefinedExpressions, + + // Interfaces + CronFieldCollectionOptions, + CronExpressionOptions, + CronParseOptions, + FieldRange, + CronExpressionIteratorCallback, + CronExpressionIterator, + + // Types + CronChars, + CronConstraints, + CronFieldType, + CronMax, + CronMin, + DayOfMonthRange, + DayOfWeekRange, + HourRange, + IntRange, + MonthRange, + ParseStringResponse, + RangeFrom, + SerializedCronField, + SerializedCronFields, + SixtyRange, +} from './types'; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 00000000..c11cbda4 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,170 @@ +import { CronDate } from './CronDate'; +import { CronExpression } from './CronExpression'; +import { CronSecond } from './fields/CronSecond'; +import { CronMinute } from './fields/CronMinute'; +import { CronHour } from './fields/CronHour'; +import { CronDayOfMonth } from './fields/CronDayOfMonth'; +import { CronMonth } from './fields/CronMonth'; +import { CronDayOfTheWeek } from './fields/CronDayOfTheWeek'; + +// TS >= 4.5 tail recursion optimization +// https://dev.to/tylim88/typescript-numeric-range-type-15a5 +export type RangeFrom = ACC['length'] extends LENGTH ? ACC : RangeFrom; +export type IntRange = FROM['length'] extends TO + ? ACC | TO + : IntRange<[...FROM, 1], TO, ACC | FROM['length']>; + +export type SixtyRange = IntRange, 59>; // 0-59 - inclusive +export type HourRange = IntRange, 23>; // 0-23 - inclusive +export type DayOfMonthRange = IntRange, 31> | 'L'; // 1-31 - inclusive +export type MonthRange = IntRange, 12>; // 1-12 - inclusive +export type DayOfWeekRange = IntRange, 7>; // 0-7 - inclusive +export type CronFieldType = SixtyRange[] | HourRange[] | DayOfMonthRange[] | MonthRange[] | DayOfWeekRange[]; +export type CronChars = 'L' | 'W'; +export type CronMin = 0 | 1; +export type CronMax = 7 | 12 | 23 | 31 | 59; +export type ParseRageResponse = number[] | string[] | number | string; + +export type SerializedCronField = { + wildcard: boolean; + values: (number | string)[]; +}; + +export type CronConstraints = { + min: CronMin; + max: CronMax; + chars: readonly CronChars[]; + validChars: RegExp; +} + +export type SerializedCronFields = { + second: SerializedCronField; + minute: SerializedCronField; + hour: SerializedCronField; + dayOfMonth: SerializedCronField; + month: SerializedCronField; + dayOfWeek: SerializedCronField; +}; + +export type RawCronFields = { + second: string; + minute: string; + hour: string; + dayOfMonth: string; + month: string; + dayOfWeek: string; +}; + +// these need to be lowercase for the parser to work +export enum Months { + jan = 1, + feb = 2, + mar = 3, + apr = 4, + may = 5, + jun = 6, + jul = 7, + aug = 8, + sep = 9, + oct = 10, + nov = 11, + dec = 12, +} + +// these need to be lowercase for the parser to work +export enum DayOfWeek { + sun = 0, + mon = 1, + tue = 2, + wed = 3, + thu = 4, + fri = 5, + sat = 6, +} + +export enum CronUnit { + Second = 'Second', + Minute = 'Minute', + Hour = 'Hour', + DayOfMonth = 'DayOfMonth', + Month = 'Month', + DayOfWeek = 'DayOfWeek', +} + +export enum TimeUnit { + Second = 'Second', + Minute = 'Minute', + Hour = 'Hour', + Day = 'Day', + Month = 'Month', + Year = 'Year', +} + +export enum DateMathOp { + Add = 'Add', + Subtract = 'Subtract', +} + +export enum PredefinedExpressions { + '@yearly' = '0 0 0 1 1 *', + '@annually' = '0 0 0 1 1 *', + '@monthly' = '0 0 0 1 * *', + '@weekly' = '0 0 0 * * 0', + '@daily' = '0 0 0 * * *', + '@hourly' = '0 0 * * * *', + '@minutely' = '0 * * * * *', + '@secondly' = '* * * * * *', + '@weekdays' = '0 0 0 * * 1-5', + '@weekends' = '0 0 0 * * 0,6', +} + +export interface CronExpressionOptions { + expression?: string; + currentDate?: Date | string | number | CronDate; + endDate?: Date | string | number | CronDate; + startDate?: Date | string | number | CronDate; + iterator?: boolean; + utc?: boolean; + tz?: string; + nthDayOfWeek?: number; +} + +export interface CronParseOptions { + currentDate?: Date | string | number | CronDate; + endDate?: Date | string | number | CronDate; + startDate?: Date | string | number | CronDate; + iterator?: boolean; + tz?: string; + nthDayOfWeek?: number; + expression?: string; + strict?: boolean; +} + +export interface CronFieldCollectionOptions { + second: SixtyRange[] | CronSecond; + minute: SixtyRange[] | CronMinute; + hour: HourRange[] | CronHour; + dayOfMonth: DayOfMonthRange[] | CronDayOfMonth; + month: MonthRange[] | CronMonth; + dayOfWeek: DayOfWeekRange[] | CronDayOfTheWeek; +} + +export interface FieldRange { + start: number | CronChars; + count: number; + end?: number; + step?: number; +} + +export type ParseStringResponse = { + variables: { [key: string]: number | string }; + expressions: CronExpression[]; + errors: { [key: string]: unknown }; +}; + +export interface CronExpressionIterator { + value: CronDate; + done: boolean; +} + +export type CronExpressionIteratorCallback = (item: CronExpressionIterator | CronDate, index: number) => void; diff --git a/test/31_of_month.js b/test/31_of_month.js deleted file mode 100644 index d66275af..00000000 --- a/test/31_of_month.js +++ /dev/null @@ -1,17 +0,0 @@ -var util = require('util'); -var test = require('tap').test; -var expression = require('../lib/expression'); - -test('expression 31 of month', function(t) { - try { - var interval = expression.parse('0 0 31 * *'); - var i; - var d; - for (i = 0; i < 20; ++i) { - d = interval.next(); - } - t.end(); - } catch (err) { - t.error(err, 'Interval parse error'); - } -}); diff --git a/test/bug.js b/test/bug.js deleted file mode 100644 index a44c2a76..00000000 --- a/test/bug.js +++ /dev/null @@ -1,29 +0,0 @@ -var util = require('util'); -var test = require('tap').test; -var CronExpression = require('../lib/expression'); -var CronDate = require('../lib/date'); - - -test('parse expression as UTC', function(t) { - try { - var options = { - utc: true - }; - - var interval = CronExpression.parse('0 0 10 * * *', options); - - var date = interval.next(); - t.equal(date.getUTCHours(), 10, 'Correct UTC hour value'); - - interval = CronExpression.parse('0 */5 * * * *', options); - - var date = interval.next(), now = new Date(); - now.setMinutes(now.getMinutes() + 5 - (now.getMinutes() % 5)); - t.equal(date.getHours(), now.getUTCHours(), 'Correct local time for 5 minute interval'); - - } catch (err) { - t.error(err, 'UTC parse error'); - } - - t.end(); -}); diff --git a/test/crondate.js b/test/crondate.js deleted file mode 100644 index c041aaad..00000000 --- a/test/crondate.js +++ /dev/null @@ -1,16 +0,0 @@ -// empty around comma - -var test = require('tap').test; -var CronDate = require('../lib/date'); - -test('is the last weekday of the month', function (t) { - // Last monday of septhember - var date = new CronDate(new Date(2021, 8, 27)); - t.equal(date.isLastWeekdayOfMonth(), true); - - // Second-to-last monday of septhember - var date = new CronDate(new Date(2021, 8, 20)); - t.equal(date.isLastWeekdayOfMonth(), false); - - t.end(); -}); diff --git a/test/empty_around_comma.js b/test/empty_around_comma.js deleted file mode 100644 index fe184cf0..00000000 --- a/test/empty_around_comma.js +++ /dev/null @@ -1,22 +0,0 @@ -// empty around comma - -var test = require('tap').test; -var CronExpression = require('../lib/expression'); - -const options = { - utc: true -}; - -test('both empty around comma', function (t) { - t.throws(function () { - CronExpression.parse('*/10 * * * * ,', options); - }, new Error('Invalid list value format')); - t.end(); -}); - -test('one side empty around comma', function (t) { - t.throws(function () { - CronExpression.parse('*/10 * * * * ,2', options); - }, new Error('Invalid list value format')); - t.end(); -}); diff --git a/test/expression.js b/test/expression.js deleted file mode 100644 index e50711cf..00000000 --- a/test/expression.js +++ /dev/null @@ -1,1514 +0,0 @@ -var test = require('tap').test; -var CronExpression = require('../lib/expression'); -var CronDate = require('../lib/date'); - -test('empty expression test', function(t) { - try { - var interval = CronExpression.parse(''); - t.ok(interval, 'Interval parsed'); - - var date = new CronDate(); - date.addMinute(); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches'); - - t.end(); - } catch (err) { - t.error(err, 'Interval parse error'); - } -}); - -test('default expression test', function(t) { - try { - var interval = CronExpression.parse('* * * * *'); - t.ok(interval, 'Interval parsed'); - - var date = new CronDate(); - date.addMinute(); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('default expression (tab separate) test', function(t) { - try { - var interval = CronExpression.parse('* * * * *'); - t.ok(interval, 'Interval parsed'); - - var date = new CronDate(); - date.addMinute(); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('default expression (multi-space separated) test 1', function(t) { - try { - var interval = CronExpression.parse('* \t*\t\t *\t * \t\t*'); - t.ok(interval, 'Interval parsed'); - - var date = new CronDate(); - date.addMinute(); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - - -test('default expression (multi-space separated) test 1', function(t) { - try { - var interval = CronExpression.parse('* \t *\t \t * * \t \t *'); - t.ok(interval, 'Interval parsed'); - - var date = new CronDate(); - date.addMinute(); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getMinutes(), date.getMinutes(), 'Schedule matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('61 * * * * *'); - }, new Error('Constraint error, got value 61 expected range 0-59')); - - t.end(); -}); - -test('second value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('-1 * * * * *'); - }, new Error('Constraint error, got value -1 expected range 0-59')); - - t.end(); -}); - -test('invalid range', function(t) { - t.throws(function() { - CronExpression.parse('- * * * * *'); - }, new Error('Invalid range: -')); - - t.end(); -}); - -test('minute value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('* 32,72 * * * *'); - }, new Error('Constraint error, got value 72 expected range 0-59')); - - t.end(); -}); - -test('hour value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('* * 12-36 * * *'); - }, new Error('Constraint error, got range 12-36 expected range 0-23')); - - t.end(); -}); - - -test('day of the month value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('* * * 10-15,40 * *'); - }, ('Constraint error, got value 40 expected range 1-31')); - - t.end(); -}); - -test('month value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('* * * * */10,12-13 *'); - }, new Error('Constraint error, got range 12-13 expected range 1-12')); - - t.end(); -}); - -test('day of the week value out of the range', function(t) { - t.throws(function() { - CronExpression.parse('* * * * * 9'); - }, new Error('Constraint error, got value 9 expected range 0-7')); - - t.end(); -}); - -test('invalid expression that contains too many fields', function (t) { - t.throws(function() { - CronExpression.parse('* * * * * * * *ASD'); - }, new Error('Invalid cron expression')); - - t.end(); -}); - -test('invalid explicit day of month definition', function(t) { - t.throws(function() { - const iter = CronExpression.parse('0 0 31 4 *'); - iter.next(); - }, new Error('Invalid explicit day of month definition')); - - t.end(); -}); - -test('incremental minutes expression test', function(t) { - try { - var interval = CronExpression.parse('*/3 * * * *'); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getMinutes() % 3, 0, 'Schedule matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('fixed expression test', function(t) { - try { - var interval = CronExpression.parse('10 2 12 8 0'); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of Month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - t.equal(next.getHours(), 2, 'Hour matches'); - t.equal(next.getMinutes(), 10, 'Minute matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('invalid characters test - symbol', function(t) { - t.throws(function() { - CronExpression.parse('10 ! 12 8 0'); - }, new Error('Invalid characters, got value: !')); - - t.end(); -}); - -test('invalid characters test - letter', function(t) { - t.throws(function() { - CronExpression.parse('10 x 12 8 0'); - }, new Error('Invalid characters, got value: x')); - - t.end(); -}); - -test('invalid characters test - parentheses', function(t) { - t.throws(function() { - CronExpression.parse('10 ) 12 8 0'); - }, new Error('Invalid characters, got value: )')); - - t.end(); -}); - -test('interval with invalid characters test', function(t) { - t.throws(function() { - CronExpression.parse('10 */A 12 8 0'); - }, new Error('Invalid characters, got value: */A')); - - t.end(); -}); - -test('range with invalid characters test', function(t) { - t.throws(function() { - CronExpression.parse('10 0-z 12 8 0'); - }, new Error('Invalid characters, got value: 0-z')); - - t.end(); -}); - -test('group with invalid characters test', function(t) { - t.throws(function() { - CronExpression.parse('10 0,1,z 12 8 0'); - }, new Error('Invalid characters, got value: 0,1,z')); - - t.end(); -}); - -test('invalid expression which has repeat 0 times', function(t) { - t.throws(function() { - CronExpression.parse('0 */0 * * *'); - }, new Error('Constraint error, cannot repeat at every 0 time.')); - - t.end(); -}); - -test('invalid expression which has repeat negative number times', function(t) { - t.throws(function() { - CronExpression.parse('0 */-5 * * *'); - }, new Error('Constraint error, cannot repeat at every -5 time.')); - - t.end(); -}); - -test('invalid expression which has multiple combined repeat cycles', function(t) { - t.throws(function() { - CronExpression.parse('0 5/5/5 * * *'); - }, new Error('Invalid repeat: 5/5/5')); - - t.end(); -}); - -test('range test with value and repeat (second)', function(t) { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - var interval = CronExpression.parse('0/30 * * * * ?', options); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - t.equal(next.getSeconds(), 0); - - next = interval.next(); - t.equal(next.getSeconds(), 30); - - next = interval.next(); - t.equal(next.getSeconds(), 0); - - t.end(); -}); - -test('range test with value and repeat (minute)', function(t) { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - var interval = CronExpression.parse('6/23 * * * *', options); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - t.equal(next.getMinutes(), 52); - - next = interval.next(); - t.equal(next.getMinutes(), 6); - - next = interval.next(); - t.equal(next.getMinutes(), 29); - - next = interval.next(); - t.equal(next.getMinutes(), 52); - - t.end(); -}); - -test('range test with iterator', function(t) { - try { - var interval = CronExpression.parse('10-30 2 12 8 0'); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(20); - t.ok(intervals, 'Found intervals'); - - for (var i = 0, c = intervals.length; i < c; i++) { - var next = intervals[i]; - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - t.equal(next.getHours(), 2, 'Hour matches'); - t.equal(next.getMinutes(), 10 + i, 'Minute matches'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('incremental range test with iterator', function(t) { - try { - var interval = CronExpression.parse('10-30/2 2 12 8 0'); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(10); - t.ok(intervals, 'Found intervals'); - - for (var i = 0, c = intervals.length; i < c; i++) { - var next = intervals[i]; - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - t.equal(next.getHours(), 2, 'Hour matches'); - t.equal(next.getMinutes(), 10 + (i * 2), 'Minute matches'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('range with the same start and end value', function(t) { - try { - var interval = CronExpression.parse('*/10 2-2 * * *'); - t.ok(interval, 'Interval parsed'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('predefined expression', function(t) { - try { - var interval = CronExpression.parse('@yearly'); - t.ok(interval, 'Interval parsed'); - - var date = new CronDate(); - date.addYear(); - - var next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - - t.equal(next.getFullYear(), date.getFullYear(), 'Year matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('expression limited with start and end date', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), - startDate: new CronDate('Wed, 26 Dec 2012 12:40:00'), - endDate: new CronDate('Wed, 26 Dec 2012 16:40:00') - }; - - var interval = CronExpression.parse('*/20 * * * *', options); - t.ok(interval, 'Interval parsed'); - - var dates = interval.iterate(10); - t.equal(dates.length, 7, 'Dates count matches for positive iteration'); - - interval.reset(); - - var dates = interval.iterate(-10); - t.equal(dates.length, 6, 'Dates count matches for negative iteration'); - - interval.reset(); - - // Forward iteration - var next = interval.next(); - t.equal(next.getHours(), 14, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 15, 'Hour matches'); - t.equal(next.getMinutes(), 0, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 15, 'Hour matches'); - t.equal(next.getMinutes(), 20, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 15, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 16, 'Hour matches'); - t.equal(next.getMinutes(), 0, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 16, 'Hour matches'); - t.equal(next.getMinutes(), 20, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 16, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - try { - interval.next(); - t.ok(false, 'Should fail'); - } catch (e) { - t.ok(true, 'Failed as expected'); - } - - next = interval.prev(); - t.equal(next.getHours(), 16, 'Hour matches'); - t.equal(next.getMinutes(), 20, 'Minute matches'); - - interval.reset(); - - // Backward iteration - var prev = interval.prev(); - t.equal(prev.getHours(), 14, 'Hour matches'); - t.equal(prev.getMinutes(), 20, 'Minute matches'); - - prev = interval.prev(); - t.equal(prev.getHours(), 14, 'Hour matches'); - t.equal(prev.getMinutes(), 0, 'Minute matches'); - - prev = interval.prev(); - t.equal(prev.getHours(), 13, 'Hour matches'); - t.equal(prev.getMinutes(), 40, 'Minute matches'); - - prev = interval.prev(); - t.equal(prev.getHours(), 13, 'Hour matches'); - t.equal(prev.getMinutes(), 20, 'Minute matches'); - - prev = interval.prev(); - t.equal(prev.getHours(), 13, 'Hour matches'); - t.equal(prev.getMinutes(), 0, 'Minute matches'); - - prev = interval.prev(); - t.equal(prev.getHours(), 12, 'Hour matches'); - t.equal(prev.getMinutes(), 40, 'Minute matches'); - - try { - interval.prev(); - t.ok(false, 'Should fail'); - } catch (e) { - t.ok(true, 'Failed as expected'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('reset to given date', function(t){ - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - - var interval = CronExpression.parse('*/20 * * * *', options); - t.ok(interval, 'Interval parsed'); - - // Forward iteration - var next = interval.next(); - t.equal(next.getHours(), 14, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - interval.reset(); // defaults to initial currentDate - - next = interval.next(); - t.equal(next.getHours(), 14, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - interval.reset(new CronDate('Wed, 26 Dec 2012 17:23:53')); - - next = interval.next(); - t.equal(next.getHours(), 17, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - next = interval.next(); - t.equal(next.getHours(), 18, 'Hour matches'); - t.equal(next.getMinutes(), 0, 'Minute matches'); - - interval.reset(new Date('2019-06-18T08:18:36.000')); - - next = interval.prev(); - t.equal(next.getDate(), 18, 'Date matches'); - t.equal(next.getHours(), 8, 'Hour matches'); - t.equal(next.getMinutes(), 0, 'Minute matches'); - - next = interval.prev(); - t.equal(next.getDate(), 18, 'Date matches'); - t.equal(next.getHours(), 7, 'Hour matches'); - t.equal(next.getMinutes(), 40, 'Minute matches'); - - t.end(); - } catch (err) { - t.error(err, 'Reset error'); - } -}); - -test('parse expression as UTC', function(t) { - try { - var options = { - utc: true - }; - - var interval = CronExpression.parse('0 0 10 * * *', options); - - var date = interval.next(); - t.equal(date.getUTCHours(), 10, 'Correct UTC hour value'); - t.equal(date.getHours(), 10, 'Correct UTC hour value'); - - interval = CronExpression.parse('0 */5 * * * *', options); - - var date = interval.next(), now = new Date(); - now.setMinutes(now.getMinutes() + 5 - (now.getMinutes() % 5)); - - t.equal(date.getHours(), now.getUTCHours(), 'Correct local time for 5 minute interval'); - - } catch (err) { - t.error(err, 'UTC parse error'); - } - - t.end(); -}); - -test('expression using days of week strings', function(t) { - try { - var interval = CronExpression.parse('15 10 * * MON-TUE'); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(8); - t.ok(intervals, 'Found intervals'); - - for (var i = 0, c = intervals.length; i < c; i++) { - var next = intervals[i]; - var day = next.getDay(); - - - t.ok(next, 'Found next scheduled interval'); - t.ok(day == 1 || day == 2, 'Day matches'); - t.equal(next.getHours(), 10, 'Hour matches'); - t.equal(next.getMinutes(), 15, 'Minute matches'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('expression using days of week strings - wrong alias', function(t) { - t.throws(function () { - CronExpression.parse('15 10 * * MON-TUR'); - }, new Error('Validation error, cannot resolve alias "tur"')); - - t.end(); -}); - -test('expression using mixed days of week strings', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - - var interval = CronExpression.parse('15 10 * jAn-FeB mOn-tUE', options); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(8); - t.ok(intervals, 'Found intervals'); - - for (var i = 0, c = intervals.length; i < c; i++) { - var next = intervals[i]; - var day = next.getDay(); - var month = next.getMonth(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(month == 0 || month == 2, 'Month Matches'); - t.ok(day == 1 || day == 2, 'Day matches'); - t.equal(next.getHours(), 10, 'Hour matches'); - t.equal(next.getMinutes(), 15, 'Minute matches'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('expression using non-standard second field (wildcard)', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'), - endDate: new CronDate('Wed, 26 Dec 2012 15:40:00') - }; - - var interval = CronExpression.parse('* * * * * *', options); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(10); - t.ok(intervals, 'Found intervals'); - - for (var i = 0, c = intervals.length; i < c; i++) { - var next = intervals[i]; - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getSeconds(), i + 1, 'Second matches'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('expression using non-standard second field (step)', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'), - endDate: new CronDate('Wed, 26 Dec 2012 15:40:00') - }; - - var interval = CronExpression.parse('*/20 * * * * *', options); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(3); - t.ok(intervals, 'Found intervals'); - - t.equal(intervals[0].getSeconds(), 20, 'Second matches'); - t.equal(intervals[1].getSeconds(), 40, 'Second matches'); - t.equal(intervals[2].getSeconds(), 0, 'Second matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('expression using non-standard second field (range)', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'), - endDate: new CronDate('Wed, 26 Dec 2012 15:40:00') - }; - - var interval = CronExpression.parse('20-40/10 * * * * *', options); - t.ok(interval, 'Interval parsed'); - - var intervals = interval.iterate(3); - t.ok(intervals, 'Found intervals'); - - for (var i = 0, c = intervals.length; i < c; i++) { - var next = intervals[i]; - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getSeconds(), 20 + (i * 10), 'Second matches'); - } - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('expression using explicit month definition and */5 day of month step', function(t) { - var firstIterator = CronExpression.parse('0 12 */5 6 *', { - currentDate: '2019-06-01T11:00:00.000' - }); - - var firstExpectedDates = [ - new CronDate('2019-06-01T12:00:00.000'), - new CronDate('2019-06-06T12:00:00.000'), - new CronDate('2019-06-11T12:00:00.000'), - new CronDate('2019-06-16T12:00:00.000'), - new CronDate('2019-06-21T12:00:00.000'), - new CronDate('2019-06-26T12:00:00.000'), - new CronDate('2020-06-01T12:00:00.000') - ]; - - firstExpectedDates.forEach(function(expectedDate) { - t.equal(expectedDate.toISOString(), firstIterator.next().toISOString()); - }); - - var secondIterator = CronExpression.parse('0 15 */5 5 *', { - currentDate: '2019-05-01T11:00:00.000' - }); - - var secondExpectedDates = [ - new CronDate('2019-05-01T15:00:00.000'), - new CronDate('2019-05-06T15:00:00.000'), - new CronDate('2019-05-11T15:00:00.000'), - new CronDate('2019-05-16T15:00:00.000'), - new CronDate('2019-05-21T15:00:00.000'), - new CronDate('2019-05-26T15:00:00.000'), - new CronDate('2019-05-31T15:00:00.000'), - new CronDate('2020-05-01T15:00:00.000') - ]; - - secondExpectedDates.forEach(function(expectedDate) { - t.equal(expectedDate.toISOString(), secondIterator.next().toISOString()); - }); - - t.end(); -}); - -test('day of month and week are both set', function(t) { - try { - var interval = CronExpression.parse('10 2 12 8 0'); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of month is unspecified', function(t) { - try { - var interval = CronExpression.parse('10 2 ? * 3'); - - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok(next.getDay() === 3, 'day of week matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok(next.getDay() === 3, 'day of week matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok(next.getDay() === 3, 'day of week matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok(next.getDay() === 3, 'day of week matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of week is unspecified', function(t) { - try { - var interval = CronExpression.parse('10 2 3,6 * ?'); - - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok(next.getDate() === 3 || next.getDate() === 6, 'date matches'); - var prevDate = next.getDate(); - - next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok((next.getDate() === 3 || next.getDate() === 6) && - next.getDate() !== prevDate, 'date matches and is not previous date'); - prevDate = next.getDate(); - - next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok((next.getDate() === 3 || next.getDate() === 6) && - next.getDate() !== prevDate, 'date matches and is not previous date'); - prevDate = next.getDate(); - - next = interval.next(); - t.ok(next, 'Found next scheduled interal'); - t.ok((next.getDate() === 3 || next.getDate() === 6) && - next.getDate() !== prevDate, 'date matches and is not previous date'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('Summertime bug test', function(t) { - try { - var month = new CronDate().getMonth() + 1; - var interval = CronExpression.parse('0 0 0 1 '+month+' *'); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - // Before fix the bug it was getting a timeout error if you are - // in a timezone that changes the DST to ST in the hour 00:00h. - t.ok(next, 'Found next scheduled interval'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - - -test('day of month and week are both set and dow is 7', function(t) { - try { - var interval = CronExpression.parse('10 2 12 8 7'); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of month is wildcard, month and day of week are both set', function(t) { - try { - var options = { - currentDate: new CronDate('Mon, 31 May 2021 12:00:00') - }; - var interval = CronExpression.parse('0 0 * 6 2', options); - t.ok(interval, 'Interval parsed'); - - var expectedDayMatches = [1, 8, 15, 22, 29]; - expectedDayMatches.forEach(function(dayOfMonth) { - var next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getDay(), 2, 'Day of week matches'); - t.equal(next.getDate(), dayOfMonth, 'Day of month matches'); - t.equal(next.getMonth(), 5, 'Month matches'); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of month contains multiple ranges and day of week is wildcard', function(t) { - try { - var options = { - currentDate: new CronDate('Sat, 1 Dec 2012 14:38:53') - }; - var interval = CronExpression.parse('0 0 0 2-4,7-31 * *', options); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDate() === 2, 'Day of month matches'); - t.equal(next.getMonth(), 11, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDate() === 3, 'Day of month matches'); - t.equal(next.getMonth(), 11, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDate() === 4, 'Day of month matches'); - t.equal(next.getMonth(), 11, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDate() === 7, 'Day of month matches'); - t.equal(next.getMonth(), 11, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDate() === 8, 'Day of month matches'); - t.equal(next.getMonth(), 11, 'Month matches'); - - next = interval.next(); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of month and week are both set and dow is 6,0', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - var interval = CronExpression.parse('10 2 12 8 6,0', options); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 6 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 6 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0 || next.getDate() === 12, 'Day or day of month matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of month and week are both set and dow is 6-7', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - var interval = CronExpression.parse('10 2 12 8 6-7', options); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 6, 'Day of week matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0, 'Day of week matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 6, 'Day of week matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 0, 'Day of week matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDate() === 12, 'Day of month matches'); - t.ok(next.getDay() === 1, 'Day of week matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - - next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - t.ok(next.getDay() === 6, 'Day of week matches'); - t.equal(next.getMonth(), 7, 'Month matches'); - } catch (err) { - t.ifError(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day of month validation should be ignored when day of month is wildcard and month is set', function (t) { - try { - var options = { - currentDate: new CronDate('2020-05-01T15:00:00.000') - }; - var interval = CronExpression.parse('* * * * 2 *', options); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getHours(), 0, 'Hours matches'); - t.equal(next.getDate(), 1, 'Day of month matches'); - t.equal(next.getMonth() + 1, 2, 'Month matches'); - - t.ok(next, 'Found next scheduled interval'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('day and date in week should matches', function(t){ - try { - var interval = CronExpression.parse('0 1 1 1 * 1'); - t.ok(interval, 'Interval parsed'); - - var next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getHours(), 1, 'Hours matches'); - t.ok(next.getDay() === 1 || next.getDate() === 1, 'Day or day of month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getHours(), 1, 'Hours matches'); - t.ok(next.getDay() === 1 || next.getDate() === 1, 'Day or day of month matches'); - - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getHours(), 1, 'Hours matches'); - t.ok(next.getDay() === 1 || next.getDate() === 1, 'Day or day of month matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('should sort ranges and values in ascending order', function(t) { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53') - }; - var interval = CronExpression.parse('0 12,13,10,1-3 * * *', options); - t.ok(interval, 'Interval parsed'); - - var hours = [ 1, 2, 3, 10, 12, 13 ]; - for (var i in hours) { - next = interval.next(); - - t.ok(next, 'Found next scheduled interval'); - t.equal(next.getHours(), hours[i], 'Hours matches'); - } - - t.end(); -}); - -test('valid ES6 iterator should be returned if iterator options is set to true', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), - endDate: new CronDate('Wed, 26 Dec 2012 15:40:00'), - iterator: true - }; - - var val = null; - var interval = CronExpression.parse('*/25 * * * *', options); - t.ok(interval, 'Interval parsed'); - - val = interval.next(); - t.ok(val, 'Next iteration resolved'); - t.ok(val.value, 'Iterator value is set'); - t.notOk(val.done, 'Iterator is not finished'); - - val = interval.next(); - t.ok(val, 'Next iteration resolved'); - t.ok(val.value, 'Iterator value is set'); - t.notOk(val.done, 'Iterator is not finished'); - - val = interval.next(); - t.ok(val, 'Next iteration resolved'); - t.ok(val.value, 'Iterator value is set'); - t.ok(val.done, 'Iterator is finished'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('dow 6,7 6,0 0,6 7,6 should be equivalent', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), - }; - - var expressions = [ - '30 16 * * 6,7', - '30 16 * * 6,0', - '30 16 * * 0,6', - '30 16 * * 7,6' - ]; - - expressions.forEach(function(expression) { - var interval = CronExpression.parse(expression, options); - t.ok(interval, 'Interval parsed'); - - var val = interval.next(); - t.equal(val.getDay(), 6, 'Day matches'); - - val = interval.next(); - t.equal(val.getDay(), 0, 'Day matches'); - - val = interval.next(); - t.equal(val.getDay(), 6, 'Day matches'); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('hour 0 9,11,1 * * * and 0 1,9,11 * * * should be equivalent', function(t) { - try { - var options = { - currentDate: new CronDate('Wed, 26 Dec 2012 00:00:00'), - }; - - var expressions = [ - '0 9,11,1 * * *', - '0 1,9,11 * * *' - ]; - - expressions.forEach(function(expression) { - var interval = CronExpression.parse(expression, options); - t.ok(interval, 'Interval parsed'); - - var val = interval.next(); - t.equal(val.getHours(), 1, 'Hour matches'); - - val = interval.next(); - t.equal(val.getHours(), 9, 'Hour matches'); - - val = interval.next(); - t.equal(val.getHours(), 11, 'Hour matches'); - - val = interval.next(); - t.equal(val.getHours(), 1, 'Hour matches'); - - val = interval.next(); - t.equal(val.getHours(), 9, 'Hour matches'); - - val = interval.next(); - t.equal(val.getHours(), 11, 'Hour matches'); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('it will work with #139 issue case', function(t) { - var options = { - currentDate : new Date('2018-11-15T16:15:33.522Z'), - tz: 'Europe/Madrid' - }; - - var interval = CronExpression.parse('0 0 0 1,2 * *', options); - var date = interval.next(); - - t.equal(date.getFullYear(), 2018); - t.equal(date.getDate(), 1); - t.equal(date.getMonth(), 11); - - t.end(); -}); - -test('should work for valid first/second/third/fourth/fifth occurence dayOfWeek (# char)', function(t) { - try { - var options = { - currentDate: new CronDate('2019-04-30') - }; - - var expectedFirstDates = [ - new CronDate('2019-05-05'), - new CronDate('2019-06-02'), - new CronDate('2019-07-07'), - new CronDate('2019-08-04') - ]; - var expectedSecondDates = [ - new CronDate('2019-05-12'), - new CronDate('2019-06-09'), - new CronDate('2019-07-14'), - new CronDate('2019-08-11') - ]; - var expectedThirdDates = [ - new CronDate('2019-05-19'), - new CronDate('2019-06-16'), - new CronDate('2019-07-21'), - new CronDate('2019-08-18') - ]; - var expectedFourthDates = [ - new CronDate('2019-05-26'), - new CronDate('2019-06-23'), - new CronDate('2019-07-28'), - new CronDate('2019-08-25') - ]; - var expectedFifthDates = [ - new CronDate('2019-06-30'), - new CronDate('2019-09-29'), - new CronDate('2019-12-29'), - new CronDate('2020-03-29') - ]; - - var allExpectedDates = [ - expectedFirstDates, - expectedSecondDates, - expectedThirdDates, - expectedFourthDates, - expectedFifthDates - ]; - var expressions = [ - '0 0 0 ? * 0#1', - '0 0 0 ? * 0#2', - '0 0 0 ? * 0#3', - '0 0 0 ? * 0#4', - '0 0 0 ? * 0#5' - ]; - expressions.forEach(function(expression, index) { - var interval = CronExpression.parse(expression, options); - var expectedDates = allExpectedDates[index]; - - expectedDates.forEach(function(expected) { - var date = interval.next(); - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "' + expression + '" has next() that matches expected: ' + expected.toISOString() - ); - }); - expectedDates - .slice(0, expectedDates.length - 1) - .reverse() - .forEach(function(expected) { - var date = interval.prev(); - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "' + expression + '" has prev() that matches expected: ' + expected.toISOString() - ); - }); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('should work for valid second sunday in may', function(t) { - try { - var options = { - currentDate: new CronDate('2019-01-30') - }; - var expectedDates = [ - new CronDate('2019-05-12'), - new CronDate('2020-05-10'), - new CronDate('2021-05-09'), - new CronDate('2022-05-08') - ]; - - var interval = CronExpression.parse('0 0 0 ? MAY 0#2', options); - expectedDates.forEach(function(expected) { - var date = interval.next(); - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "0 0 0 ? MAY 0#2" has next() that matches expected: ' + expected.toISOString() - ); - }); - expectedDates - .slice(0, expectedDates.length - 1) - .reverse() - .forEach(function(expected) { - var date = interval.prev(); - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "0 0 0 ? MAY 0#2" has prev() that matches expected: ' + expected.toISOString() - ); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('should work for valid second sunday at noon in may', function(t) { - try { - var options = { - currentDate: new CronDate('2019-05-12T11:59:00.000') - }; - var expected = new CronDate('2019-05-12T12:00:00.000'); - - var interval = CronExpression.parse('0 0 12 ? MAY 0#2', options); - var date = interval.next(); - - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "0 0 12 ? MAY 0#2" has next() that matches expected: ' + expected.toISOString() - ); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('should work for valid second sunday at noon in may (UTC+3)', function(t) { - try { - var options = { - currentDate: new CronDate('2019-05-12T11:59:00.000', 'Europe/Sofia') - }; - var expected = new CronDate('2019-05-12T12:00:00.000', 'Europe/Sofia'); - - var interval = CronExpression.parse('0 0 12 ? MAY 0#2', options); - var date = interval.next(); - - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "0 0 12 ? MAY 0#2" has next() that matches expected: ' + expected.toISOString() - ); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('should work with both dayOfMonth and nth occurence of dayOfWeek', function(t) { - try { - var options = { - currentDate: new CronDate('2019-04-01') - }; - - var expectedDates = [ - new CronDate('2019-04-16'), - new CronDate('2019-04-17'), - new CronDate('2019-04-18'), - new CronDate('2019-05-15'), - new CronDate('2019-05-16'), - new CronDate('2019-05-18'), - ]; - - var interval = CronExpression.parse('0 0 0 16,18 * 3#3', options); - - expectedDates.forEach(function(expected) { - var date = interval.next(); - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "0 0 0 16,18 * 3#3" has next() that matches expected: ' + expected.toISOString() - ); - }); - expectedDates - .slice(0, expectedDates.length - 1) - .reverse() - .forEach(function(expected) { - var date = interval.prev(); - t.equal( - date.toISOString(), - expected.toISOString(), - 'Expression "0 0 0 16,18 * 3#3" has prev() that matches expected: ' + expected.toISOString() - ); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('should error when passed invalid occurence value', function(t) { - var expressions = [ - '0 0 0 ? * 1#', - '0 0 0 ? * 1#0', - '0 0 0 ? * 4#6', - '0 0 0 ? * 0##4', - ]; - expressions.forEach(function(expression) { - t.throws(function() { - CronExpression.parse(expression); - }, new Error('Constraint error, invalid dayOfWeek occurrence number (#)'), expression); - }); - - t.end(); -}); - -// The Quartz documentation says that if the # character is used then no other expression can be used in the dayOfWeek term: http://www.quartz-scheduler.org/api/2.3.0/index.html -test('cannot combine `-` range and # occurrence special characters', function(t) { - var expression = '0 0 0 ? * 2-4#2'; - t.throws(function() { - CronExpression.parse(expression); - }, new Error('Constraint error, invalid dayOfWeek `#` and `-` special characters are incompatible')); - - t.end(); -}); - -test('cannot combine `/` repeat interval and # occurrence special characters', function(t) { - var expression = '0 0 0 ? * 1/2#3'; - t.throws(function() { - CronExpression.parse(expression); - }, new Error('Constraint error, invalid dayOfWeek `#` and `/` special characters are incompatible')); - - t.end(); -}); - -test('cannot combine `,` list and # occurrence special characters', function(t) { - var expression = '0 0 0 ? * 0,6#4'; - t.throws(function() { - CronExpression.parse(expression); - }, new Error('Constraint error, invalid dayOfWeek `#` and `,` special characters are incompatible')); - - t.end(); -}); - diff --git a/test/field_compactor.js b/test/field_compactor.js deleted file mode 100644 index 5fcf8959..00000000 --- a/test/field_compactor.js +++ /dev/null @@ -1,250 +0,0 @@ -'use strict'; - -var test = require('tap').test; -var compactField = require('../lib/field_compactor'); - -test('compact field - empty array', function(t) { - try { - var result = compactField([]); - t.same(result, []); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - single element array', function(t) { - try { - var result = compactField([1]); - t.same(result, [{ - start: 1, - count: 1 - }]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - 2 elements array', function(t) { - try { - var result = compactField([1, 2]); - t.same(result, [ - { - start: 1, - count: 1 - }, - { - start: 2, - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - 2 elements array big step', function(t) { - try { - var result = compactField([1, 5]); - t.same(result, [ - { - start: 1, - count: 1 - }, - { - start: 5, - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - 3 elements array 1 step', function(t) { - try { - var result = compactField([1, 2, 3]); - t.same(result, [ - { - start: 1, - end: 3, - count: 3, - step: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - 3 elements array 1 step, dangling extra at end', function(t) { - try { - var result = compactField([1, 2, 3, 5]); - t.same(result, [ - { - start: 1, - end: 3, - count: 3, - step: 1 - }, - { - start: 5, - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - 3 elements array 1 step, dangling extra at end and beginning', function(t) { - try { - var result = compactField([1, 4, 5, 6, 9]); - t.same(result, [ - { - start: 1, - count: 1 - }, - { - start: 4, - end: 6, - count: 3, - step: 1 - }, - { - start: 9, - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - 2 ranges with dangling in the middle', function(t) { - try { - var result = compactField([1, 2, 3, 6, 9, 11, 13]); - t.same(result, [ - { - start: 1, - end: 3, - count: 3, - step: 1 - }, - { - start: 6, - count: 1 - }, - { - start: 9, - end: 13, - count: 3, - step: 2 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - with chars', function(t) { - try { - var result = compactField(['L', 'W']); - t.same(result, [ - { - start: 'L', - count: 1 - }, - { - start: 'W', - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - with chars and range', function(t) { - try { - var result = compactField([1, 'L', 'W']); - t.same(result, [ - { - start: 1, - count: 1, - }, - { - start: 'L', - count: 1 - }, - { - start: 'W', - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - -test('compact field - with chars and range (v2)', function(t) { - try { - var result = compactField([1, 2, 'L', 'W']); - t.same(result, [ - { - start: 1, - count: 1, - }, - { - start: 2, - count: 1, - }, - { - start: 'L', - count: 1 - }, - { - start: 'W', - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); - - -test('compact field - with chars and range (v3)', function(t) { - try { - var result = compactField([1, 2, 3, 'L', 'W']); - t.same(result, [ - { - start: 1, - end: 3, - count: 3, - step: 1 - }, - { - start: 'L', - count: 1 - }, - { - start: 'W', - count: 1 - } - ]); - } catch (err) { - t.error(err, 'compact field error'); - } - t.end(); -}); diff --git a/test/field_stringify.js b/test/field_stringify.js deleted file mode 100644 index 3351da78..00000000 --- a/test/field_stringify.js +++ /dev/null @@ -1,94 +0,0 @@ -'use strict'; - -var test = require('tap').test; -var stringifyField = require('../lib/field_stringify'); - -test('stringify astrix', function (t) { - try { - var str = stringifyField([1, 2, 3, 4], 1, 4); - t.equal(str, '*'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify astrix step', function (t) { - try { - var str = stringifyField([0, 2, 4, 6], 0, 7); - t.equal(str, '*/2'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify single value', function (t) { - try { - var str = stringifyField([2], 0, 7); - t.equal(str, '2'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify multiple single values', function (t) { - try { - var str = stringifyField([2, 5, 9], 0, 9); - t.equal(str, '2,5,9'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify multiple ranged values', function (t) { - try { - var str = stringifyField([1, 3, 5, 6], 0, 9); - t.equal(str, '1,3,5,6'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify range', function (t) { - try { - var str = stringifyField([2, 3, 4], 0, 7); - t.equal(str, '2-4'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify range step', function (t) { - try { - var str = stringifyField([2, 4, 6], 0, 8); - t.equal(str, '2-6/2'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify semi range step', function (t) { - try { - var str = stringifyField([4, 6, 8], 0, 9); - t.equal(str, '4/2'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); - -test('stringify multi types', function (t) { - try { - var str = stringifyField([1, 2, 4, 5, 6, 7, 8, 9, 10, 20, 25, 30, 35, 57], 0, 59); - t.equal(str, '1,2,4-10,20-35/5,57'); - } catch (err) { - t.error(err, 'stringify field error'); - } - t.end(); -}); diff --git a/test/fields.js b/test/fields.js deleted file mode 100644 index 07b43400..00000000 --- a/test/fields.js +++ /dev/null @@ -1,32 +0,0 @@ -var test = require('tap').test; -var CronExpression = require('../lib/expression'); - -test('Fields are exposed', function(t){ - try { - var interval = CronExpression.parse('0 1 2 3 * 1-3,5'); - t.ok(interval, 'Interval parsed'); - - CronExpression.map.forEach(function(field) { - interval.fields[field] = []; - t.throws(function() { - interval.fields[field].push(-1); - }, /Cannot add property .*?, object is not extensible/, field + ' is frozen'); - delete interval.fields[field]; - }); - interval.fields.dummy = []; - t.same(interval.fields.dummy, undefined, 'Fields is frozen'); - - t.same(interval.fields.second, [0], 'Second matches'); - t.same(interval.fields.minute, [1], 'Minute matches'); - t.same(interval.fields.hour, [2], 'Hour matches'); - t.same(interval.fields.dayOfMonth, [3], 'Day of month matches'); - t.same(interval.fields.month, [1,2,3,4,5,6,7,8,9,10,11,12], 'Month matches'); - t.same(interval.fields.dayOfWeek, [1,2,3,5], 'Day of week matches'); - - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - diff --git a/test/increment_on_first_iteration.js b/test/increment_on_first_iteration.js deleted file mode 100644 index 92a0c6db..00000000 --- a/test/increment_on_first_iteration.js +++ /dev/null @@ -1,22 +0,0 @@ -var util = require('util'); -var sinon = require('sinon'); -var test = require('tap').test; -var CronExpression = require('../lib/expression'); - -test('increment_on_first_itereation', function(t) { - try { - var clock = sinon.useFakeTimers(); - var fake_now = new Date('Tue Feb 21 2017 16:45:00'); - clock.tick(fake_now.getTime()); - var interval = CronExpression.parse('* * * * *'); - t.ok(interval, 'Interval parsed'); - var next = interval.next(); - t.ok(next, 'Found next scheduled interval'); - // Make sure next has incremented in 1 minute - t.equal(fake_now.getTime() + 60000, next.getTime()); - clock.restore(); - t.end(); - } catch (err) { - t.error(err, 'Interval parse error'); - } -}); diff --git a/test/index-ts3.test-d.ts b/test/index-ts3.test-d.ts deleted file mode 100644 index 6088c63e..00000000 --- a/test/index-ts3.test-d.ts +++ /dev/null @@ -1,133 +0,0 @@ -import {expectAssignable, expectError, expectNotAssignable, expectType} from 'tsd'; -import { - CronDate, - CronExpression, - CronFields, DateType, - parseExpression, - parseFile, ParserOptions, - parseString, - fieldsToExpression, - StringResult -} from '../types/ts3'; - -const interval = parseExpression('0 1 2 3 * 1-3,5'); -const intervalIterator = parseExpression('0 1 2 3 * 1-3,5', {iterator: true}); - -expectType(interval.fields.second); -expectType(interval.fields.minute); -expectType(interval.fields.hour); -expectType(interval.fields.dayOfMonth); -expectType(interval.fields.month); -expectType(interval.fields.dayOfWeek); - -expectError(interval.fields = interval.fields); - -expectError(interval.fields.second = []); -expectError(interval.fields.second.push(1)); - -expectError(interval.fields.minute = []); -expectError(interval.fields.minute.push(1)); - -expectError(interval.fields.hour = []); -expectError(interval.fields.hour.push(1)); - -expectError(interval.fields.dayOfMonth = []); -expectError(interval.fields.dayOfMonth.push(1)); - -expectError(interval.fields.month = []); -expectError(interval.fields.month.push(1)); - -expectError(interval.fields.dayOfWeek = []); -expectError(interval.fields.dayOfWeek.push(1)); - -expectAssignable(0); -expectAssignable(59); - -expectAssignable(0); -expectAssignable(59); - -expectAssignable(0); -expectAssignable(23); - -expectAssignable(1); -expectAssignable(31); -expectAssignable('L'); - -expectAssignable(1); -expectAssignable(12); - -expectAssignable(0); -expectAssignable(7); - -const parseOptions: ParserOptions = { - currentDate: 'f', - startDate: 4, - endDate: new Date(), - iterator: true, - utc: true, - tz: 'f', - nthDayOfWeek: 5, -} -expectAssignable<{ - currentDate?: string | number | Date - startDate?: string | number | Date - endDate?: string | number | Date - iterator?: boolean - utc?: boolean - tz?: string - nthDayOfWeek?: number -}>(parseOptions) - -expectType(parseExpression('0 1 2 3 * 1-3,5')) -expectType>(parseExpression('0 1 2 3 * 1-3,5', parseOptions)) - -const fields: CronFields = { - second: [1, 1], - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], -} - -expectType(fieldsToExpression(fields)) -expectType>(fieldsToExpression(fields, parseOptions)) - -expectType(fieldsToExpression(fields).stringify()) -expectType(fieldsToExpression(fields, parseOptions).stringify()) -expectType(fieldsToExpression(fields, parseOptions).stringify(true)) - -expectType(parseFile('path', (err: any, data: StringResult) => console.log(data))) - -expectType(parseString('path')) - -const stringResult = parseString('path'); -expectType<{ - variables: Record, - expressions: CronExpression[], - errors: Record, -}>(stringResult) - -expectType(interval.fields) -expectType(interval.next()) -expectType(interval.prev()) -expectType(interval.hasNext()) -expectType(interval.hasPrev()) -expectType(interval.stringify()) -expectType(interval.stringify(true)) -expectType(interval.reset()) -expectType(interval.reset("Sdf")) -expectType(interval.reset(5)) -expectType(interval.reset(new Date())) -expectType(interval.iterate(5)) -expectType(interval.iterate(5, (item: CronDate, i: number) => {})) - -expectAssignable(new Date()) -expectAssignable(5) -expectAssignable("SDf") - - -expectType>(intervalIterator.next()) -expectType>(intervalIterator.prev()) -expectType[]>(intervalIterator.iterate(5)) -expectType[]>(intervalIterator.iterate(5, (item: IteratorResult, i: number) => {})) diff --git a/test/index.test-d.ts b/test/index.test-d.ts deleted file mode 100644 index 09941325..00000000 --- a/test/index.test-d.ts +++ /dev/null @@ -1,138 +0,0 @@ -import {expectAssignable, expectError, expectNotAssignable, expectType} from 'tsd'; -import { - CronDate, - CronExpression, - CronFields, DateType, - parseExpression, - parseFile, ParserOptions, - parseString, - fieldsToExpression, - StringResult -} from '../index'; - -const interval = parseExpression('0 1 2 3 * 1-3,5'); -const intervalIterator = parseExpression('0 1 2 3 * 1-3,5', {iterator: true}); - -expectError(interval.fields = interval.fields); - -expectError(interval.fields.second = []); -expectError(interval.fields.second.push(1)); - -expectError(interval.fields.minute = []); -expectError(interval.fields.minute.push(1)); - -expectError(interval.fields.hour = []); -expectError(interval.fields.hour.push(1)); - -expectError(interval.fields.dayOfMonth = []); -expectError(interval.fields.dayOfMonth.push(1)); - -expectError(interval.fields.month = []); -expectError(interval.fields.month.push(1)); - -expectError(interval.fields.dayOfWeek = []); -expectError(interval.fields.dayOfWeek.push(1)); - -expectAssignable(0); -expectAssignable(59); -expectNotAssignable(-1); -expectNotAssignable(60); - -expectAssignable(0); -expectAssignable(59); -expectNotAssignable(-1); -expectNotAssignable(60); - -expectAssignable(0); -expectAssignable(23); -expectNotAssignable(-1); -expectNotAssignable(24); - -expectAssignable(1); -expectAssignable(31); -expectAssignable('L'); -expectNotAssignable(0); -expectNotAssignable(32); - -expectAssignable(1); -expectAssignable(12); -expectNotAssignable(0); -expectNotAssignable(13); - -expectAssignable(0); -expectAssignable(7); -expectNotAssignable(-1); -expectNotAssignable(8); - -const parseOptions: ParserOptions = { - currentDate: 'f', - startDate: 4, - endDate: new Date(), - iterator: true, - utc: true, - tz: 'f', - nthDayOfWeek: 5, -} -expectAssignable<{ - currentDate?: string | number | Date - startDate?: string | number | Date - endDate?: string | number | Date - iterator?: boolean - utc?: boolean - tz?: string - nthDayOfWeek?: number -}>(parseOptions) - -expectType(parseExpression('0 1 2 3 * 1-3,5')) -expectType>(parseExpression('0 1 2 3 * 1-3,5', parseOptions)) - -const fields: CronFields = { - second: [1, 1], - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], -} - -expectType(fieldsToExpression(fields)) -expectType>(fieldsToExpression(fields, parseOptions)) - -expectType(fieldsToExpression(fields).stringify()) -expectType(fieldsToExpression(fields, parseOptions).stringify()) -expectType(fieldsToExpression(fields, parseOptions).stringify(true)) - -expectType(parseFile('path', (err: any, data: StringResult) => console.log(data))) - -expectType(parseString('path')) - -const stringResult = parseString('path'); -expectType<{ - variables: Record, - expressions: CronExpression[], - errors: Record, -}>(stringResult) - -expectType(interval.fields) -expectType(interval.next()) -expectType(interval.prev()) -expectType(interval.hasNext()) -expectType(interval.hasPrev()) -expectType(interval.stringify()) -expectType(interval.stringify(true)) -expectType(interval.reset()) -expectType(interval.reset("Sdf")) -expectType(interval.reset(5)) -expectType(interval.reset(new Date())) -expectType(interval.iterate(5)) -expectType(interval.iterate(5, (item: CronDate, i: number) => {})) - -expectAssignable(new Date()) -expectAssignable(5) -expectAssignable("SDf") - - -expectType>(intervalIterator.next()) -expectType>(intervalIterator.prev()) -expectType[]>(intervalIterator.iterate(5)) -expectType[]>(intervalIterator.iterate(5, (item: IteratorResult, i: number) => {})) diff --git a/test/leap_year.js b/test/leap_year.js deleted file mode 100644 index c8b9d631..00000000 --- a/test/leap_year.js +++ /dev/null @@ -1,17 +0,0 @@ -var util = require('util'); -var test = require('tap').test; -var expression = require('../lib/expression'); - -test('leap year', function(t) { - try { - var interval = expression.parse('0 0 29 2 *'); - var i; - var d; - for (i = 0; i < 20; ++i) { - d = interval.next(); - } - t.end(); - } catch (err) { - t.error(err, 'Interval parse error'); - } -}); diff --git a/test/parser.js b/test/parser.js deleted file mode 100644 index fae90399..00000000 --- a/test/parser.js +++ /dev/null @@ -1,46 +0,0 @@ -var test = require('tap').test; -var CronParser = require('../lib/parser'); - -// Globals - -test('load crontab file', function(t) { - CronParser.parseFile(__dirname + '/crontab.example', function(err, result) { - t.error(err, 'File read error'); - t.ok(result, 'Crontab parsed parsed'); - - t.equal(Object.keys(result.variables).length, 2, 'variables length matches'); - t.equal(Object.keys(result.errors).length, 0, 'errors length matches'); - t.equal(result.expressions.length, 3, 'expressions length matches'); - - // Parse expressions - var next = null; - - t.equal(result.expressions[0].hasNext(), true); - next = result.expressions[0].next(); - t.ok(next, 'first date'); - - next = result.expressions[1].next(); - t.ok(next, 'second date'); - - next = result.expressions[2].next(); - t.ok(next, 'third date'); - - t.end(); - }); -}); - -test('no next date', function(t) { - var options = { - currentDate: new Date(2014, 0, 1), - endDate: new Date(2014, 0, 1) - }; - - try { - var interval = CronParser.parseExpression('* * 2 * *', options); - t.equal(interval.hasNext(), false); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); diff --git a/test/parser_crondate_formats.js b/test/parser_crondate_formats.js deleted file mode 100644 index 96891c24..00000000 --- a/test/parser_crondate_formats.js +++ /dev/null @@ -1,145 +0,0 @@ -var luxon = require('luxon'); -var test = require('tap').test; -var CronDate = require('../lib/date'); - -test('parse cron date formats with local timezone', (t) => { - // Some tests need the local offset to be compatible without invoking timezone management. - // Local offset is dependent on what the system being tested on is - var offset = new Date().getTimezoneOffset(); - var offsetHours = Math.abs(Math.floor(offset/60)); - var offsetMinutes = offset % 60; - var offsetSign = offset < 0 ? '-' : '+'; - - var expectedTime = new Date(2021, 0, 4, 10, 0, 0).toString(); - - test('undefined date', (t) => { - const realDate = new Date(); - var d = new CronDate(); - - t.equal(d.toDate().toString(), realDate.toString()); - - t.end(); - }); - - test('JS Date', (t) => { - var d = new CronDate(new Date(2021, 0, 4, 10, 0, 0)); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('ISO 8601', (t) => { - var d = new CronDate('2021-01-04T10:00:00'); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('ISO 8601 date', (t) => { - - var d = new CronDate('2021-01-04'); - var expectedTime = new Date(2021, 0, 4, 0, 0, 0).toString(); - - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('RFC2822', (t) => { - var offsetString = offsetSign + String(offsetHours).padStart(2, 0) + String(offsetMinutes).padStart(2, 0); - - var d = new CronDate('Mon, 4 Jan 2021 10:00:00 ' + offsetString); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('RFC2822-like without timezone offset', (t) => { - var d = new CronDate('Mon, 4 Jan 2021 10:00:00'); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('SQL', (t) => { - var d = new CronDate('2021-01-04 10:00:00'); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('milliseconds', (t) => { - var d = new CronDate(new Date('2021-01-04 10:00:00').valueOf()); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('CronDate', (t) => { - var date = new CronDate('Mon, 4 Jan 2021 10:00:00'); - var d = new CronDate(date); - t.equal(d.toDate().toString(), expectedTime); - - t.end(); - }); - - test('invalid', (t) => { - t.throws(() => { - var d = new CronDate('2021-01-4 10:00:00'); - }); - - t.end(); - }); - - t.end(); -}); - -test('parse cron date formats with another timezone', (t) => { - test('ISO 8601 without offset', (t) => { - // implies format already in timezone - var d = new CronDate('2021-01-04T10:00:00', 'Europe/Athens'); - t.equal(d.toISOString(), '2021-01-04T08:00:00.000Z'); - - t.end(); - }); - - test('ISO 8601 with non-local offset', (t) => { - var d = new CronDate('2021-01-04T10:00:00+01:00', 'Europe/Athens'); - t.equal(d.toISOString(), '2021-01-04T09:00:00.000Z'); - - t.end(); - }); - - test('RFC2822 with non-local offset', (t) => { - var d = new CronDate('Mon, 4 Jan 2021 10:00:00 +0100', 'Europe/Athens'); - t.equal(d.toISOString(), '2021-01-04T09:00:00.000Z'); - - t.end(); - }); - - test('milliseconds', (t) => { - var date = luxon.DateTime.fromISO('2021-01-04T11:00:00.000+02:00').valueOf(); - var d = new CronDate(date, 'Europe/Athens'); - t.equal(d.toISOString(), '2021-01-04T09:00:00.000Z'); - - t.end(); - }); - - test('CronDate with same timezone', (t) => { - var date = new CronDate('Mon, 4 Jan 2021 10:00:00', 'Europe/Athens'); - var d = new CronDate(date); - t.equal(d.toISOString(), '2021-01-04T08:00:00.000Z'); - - t.end(); - }); - - test('CronDate with different timezone', (t) => { - var date = new CronDate('Mon, 4 Jan 2021 10:00:00', 'America/New_York'); - var d = new CronDate(date, 'Europe/Athens'); - t.equal(d.toISOString(), '2021-01-04T15:00:00.000Z'); - - t.end(); - }); - - t.end('crondate input should'); -}); diff --git a/test/parser_day_of_month.js b/test/parser_day_of_month.js deleted file mode 100644 index 127a0d75..00000000 --- a/test/parser_day_of_month.js +++ /dev/null @@ -1,169 +0,0 @@ -var test = require('tap').test; -var CronParser = require('../lib/parser'); - -test('parse cron with last day in a month', function(t) { - var options = { - currentDate: new Date(2014, 0, 1), - endDate: new Date(2014, 10, 1) - }; - - try { - var interval = CronParser.parseExpression('0 0 L * *', options); - t.equal(interval.hasNext(), true); - - for (i = 0; i < 10; ++i) { - var next = interval.next(); - t.ok(next, 'has a date'); - } - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('parse cron with last day in feb', function(t) { - var options = { - currentDate: new Date(2016, 0, 1), - endDate: new Date(2016, 10, 1) - }; - - try { - var interval = CronParser.parseExpression('0 0 6-20/2,L 2 *', options); - t.equal(interval.hasNext(), true); - var next = null; - var items = 9; - var i = 0; - while(interval.hasNext()) { - next = interval.next(); - i += 1; - t.ok(next, 'has a date'); - } - //leap year - t.equal(next.getDate(), 29); - t.equal(i, items); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('parse cron with last day in feb', function(t) { - var options = { - currentDate: new Date(2014, 0, 1), - endDate: new Date(2014, 10, 1) - }; - - try { - var interval = CronParser.parseExpression('0 0 1,3,6-10,L 2 *', options); - t.equal(interval.hasNext(), true); - var next = null; - while(interval.hasNext()) { - next = interval.next(); - t.ok(next, 'has a date'); - } - //common year - t.equal(next.getDate(), 28); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('parse cron with last weekday of the month', function(t) { - var options = { - currentDate: new Date(2021, 8, 1), - endDate: new Date(2021, 11, 1) - }; - - var testCases = [ - { expression: '0 0 0 * * 1L', expectedDate: 27 }, - { expression: '0 0 0 * * 2L', expectedDate: 28 }, - { expression: '0 0 0 * * 3L', expectedDate: 29 }, - { expression: '0 0 0 * * 4L', expectedDate: 30 }, - { expression: '0 0 0 * * 5L', expectedDate: 24 }, - { expression: '0 0 0 * * 6L', expectedDate: 25 }, - { expression: '0 0 0 * * 0L', expectedDate: 26 }, - { expression: '0 0 0 * * 7L', expectedDate: 26 } - ]; - - testCases.forEach(function({ expression, expectedDate }) { - t.test(expression, function(t) { - try { - var interval = CronParser.parseExpression(expression, options); - - t.equal(interval.hasNext(), true); - - var next = interval.next(); - - t.equal(next.getDate(), expectedDate); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); - }); - }); - - t.end(); -}); - -test('parses expression that runs on both last monday and friday of the month', function(t) { - var options = { - currentDate: new Date(2021, 8, 1), - endDate: new Date(2021, 11, 1) - }; - - try { - var interval = CronParser.parseExpression('0 0 0 * * 1L,5L', options); - - t.equal(interval.next().getDate(), 24); - t.equal(interval.next().getDate(), 27); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('parses expression that runs on both every monday and last friday of mont', function(t) { - var options = { - currentDate: new Date(2021, 8, 1), - endDate: new Date(2021, 8, 30) - }; - - try { - var interval = CronParser.parseExpression('0 0 0 * * 1,5L', options); - - var dates = []; - - while(true) { - try { - dates.push(interval.next().getDate()); - } catch (e) { - if (e.message !== 'Out of the timespan range') { - throw e; - } - - break; - } - } - - t.same(dates, [6, 13, 20, 24, 27]); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('fails to parse for invalid last weekday of month expression', function(t) { - t.throws(function() { - var interval = CronParser.parseExpression('0 0 0 * * L'); - interval.next(); - }); - - t.end(); -}); diff --git a/test/prev_date.js b/test/prev_date.js deleted file mode 100644 index 1d514cdc..00000000 --- a/test/prev_date.js +++ /dev/null @@ -1,32 +0,0 @@ -var test = require('tap').test; -var CronExpression = require('../lib/expression'); - -test('prev should match correctly (issue #98) when milliseconds are greater than 0', function(t) { - var options = { - currentDate: new Date('2017-06-13T18:21:25.002Z') - }; - - var interval = CronExpression.parse('*/5 * * * * *', options); - var prev = interval.prev(); - t.equal(prev.getSeconds(), 25); - - t.end(); -}); - -test('prev should match correctly (issue #98) when milliseconds are equal to 0', function(t) { - var interval = CronExpression.parse('59 59 23 * * *',{ - currentDate : new Date('2012-12-26 14:38:53') - }); - - [25, 24, 23, 22].forEach(function(date) { - var prev = interval.prev(); - t.equal(prev.getFullYear(), 2012); - t.equal(prev.getMonth(), 11); - t.equal(prev.getDate(), date); - t.equal(prev.getHours(), 23); - t.equal(prev.getMinutes(), 59); - t.equal(prev.getSeconds(), 59); - }); - - t.end(); -}); diff --git a/test/stringify.js b/test/stringify.js deleted file mode 100644 index 3643b827..00000000 --- a/test/stringify.js +++ /dev/null @@ -1,488 +0,0 @@ -'use strict'; - -var test = require('tap').test; -var CronParser = require('../lib/parser'); - -test('stringify cron expression all stars no seconds', function (t) { - try { - var expected = '0 * * * * *'; - var interval = CronParser.parseExpression('* * * * *', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression all stars no seconds (discard seconds)', function (t) { - try { - var expected = '* * * * *'; - var interval = CronParser.parseExpression('* * * * *', {}); - var str = interval.stringify(); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression all stars with seconds', function (t) { - try { - var expected = '* * * * * *'; - var interval = CronParser.parseExpression('* * * * * *', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression all stars with seconds (discard seconds)', function (t) { - try { - var expected = '* * * * *'; - var interval = CronParser.parseExpression('* * * * * *', {}); - var str = interval.stringify(); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression', function (t) { - try { - var expected = '0 1,2,4-10,20-35/5,57 * * * *'; - var interval = CronParser.parseExpression('1,2,4-10,20-35/5,57 * * * *', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression (discard seconds)', function (t) { - try { - var expected = '1,2,4-10,20-35/5,57 * * * *'; - var interval = CronParser.parseExpression('1,2,4-10,20-35/5,57 * * * *', {}); - var str = interval.stringify(); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with star range step', function (t) { - try { - var expected = '0 */5 */2 * * *'; - var interval = CronParser.parseExpression('*/5 */2 */1 * *', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with multiple values and retain original value', function (t) { - try { - var expected = '0 * * * * 1,3,5'; - var interval = CronParser.parseExpression('* * * * 1,3,5', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with multiple values and convert value to range step', function (t) { - try { - var expected = '0 * * * * 0-6/2'; - var interval = CronParser.parseExpression('* * * * 0,2,4,6', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with star range step (discard seconds)', function (t) { - try { - var expected = '*/5 */2 * * *'; - var interval = CronParser.parseExpression('*/5 */2 */1 * *', {}); - var str = interval.stringify(); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with semi range step', function (t) { - try { - var expected = '0 5/5 * * * *'; - var interval = CronParser.parseExpression('5/5 * * * *', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with semi range step (discard seconds)', function (t) { - try { - var expected = '5/5 * * * *'; - var interval = CronParser.parseExpression('5/5 * * * *', {}); - var str = interval.stringify(); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with L', function (t) { - try { - var expected = '0 * * 1,4-10,L * *'; - var interval = CronParser.parseExpression('* * 1,4-10,L * *', {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with L (discard seconds)', function (t) { - try { - var expected = '* * 1,4-10,L * *'; - var interval = CronParser.parseExpression('* * 1,4-10,L * *', {}); - var str = interval.stringify(); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with weekday L', function (t) { - try { - var expected = '0 0 0 * * 1L'; - var interval = CronParser.parseExpression(expected, {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with multiple weekday, one of them with an L', function (t) { - try { - var expected = '0 0 0 * * 4,6L'; - var interval = CronParser.parseExpression(expected, {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with multiple weekday, two of them with an L', function (t) { - try { - var expected = '0 0 0 * * 1L,5L'; - var interval = CronParser.parseExpression(expected, {}); - var str = interval.stringify(true); - t.equal(str, expected); - str = CronParser.fieldsToExpression(interval.fields).stringify(true); - t.equal(str, expected); - - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with wildcard day of month and single month value', function (t) { - try { - var expected = '* * * 4 *'; - var interval = CronParser.parseExpression(expected, {}); - var str = interval.stringify(); - t.equal(str, expected); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with wildcard day of month and month range', function (t) { - try { - var expected = '* * * 4-6 *'; - var interval = CronParser.parseExpression(expected, {}); - var str = interval.stringify(); - t.equal(str, expected); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - - -test('stringify cron expression with day of month range and single month value', function (t) { - try { - var expected = '* * 1-25 4 *'; - var interval = CronParser.parseExpression(expected, {}); - var str = interval.stringify(); - t.equal(str, expected); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify from fields out of order', function (t) { - try { - var expected = '1-5 1 1 1 1 1'; - var str = CronParser.fieldsToExpression({ - second: [5,2,1,4,3], - minute: [1], - hour: [1], - month: [1], - dayOfMonth: [1], - dayOfWeek: [1], - }).stringify(true); - t.equal(str, expected); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify from fields out of order (discard seconds)', function (t) { - try { - var expected = '1 1 1 1 1'; - var str = CronParser.fieldsToExpression({ - second: [5,2,1,4,3], - minute: [1], - hour: [1], - month: [1], - dayOfMonth: [1], - dayOfWeek: [1], - }).stringify(); - t.equal(str, expected); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('stringify cron expression with extended day of week range (0,7)', function (t) { - try { - var expected = '* * * * *'; - var interval = CronParser.parseExpression('* * * * *'); - - var str = CronParser.fieldsToExpression({ - second: interval.fields.second, - minute: interval.fields.minute, - hour: interval.fields.hour, - month: interval.fields.month, - dayOfMonth: interval.fields.dayOfMonth, - dayOfWeek: [0, 1, 2, 3, 4, 5, 6], - }).stringify(); - t.equal(str, expected); - - str = CronParser.fieldsToExpression({ - second: interval.fields.second, - minute: interval.fields.minute, - hour: interval.fields.hour, - month: interval.fields.month, - dayOfMonth: interval.fields.dayOfMonth, - dayOfWeek: [0, 1, 2, 3, 4, 5, 6, 7], - }).stringify(); - t.equal(str, expected); - } catch (err) { - t.error(err, 'Parse read error'); - } - - t.end(); -}); - -test('validation error - missing seconds', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Validation error, Field second is missing')); - - t.end(); -}); - -test('validation error - empty seconds', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - second: [], - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Validation error, Field second contains no values')); - - t.end(); -}); - -test('validation error - missing values - empty array', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - second: [1], - minute: [], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Validation error, Field minute contains no values')); - - t.end(); -}); - -test('validation error - missing values', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - second: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Validation error, Field minute is missing')); - - t.end(); -}); - -test('validation error - range error', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - second: [-1, 1, 0], - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Constraint error, got value -1 expected range 0-59')); - - t.end(); -}); - -test('validation error - bad chars error', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - second: [0, 'R'], - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Constraint error, got value R expected range 0-59')); - - t.end(); -}); - -test('validation error - duplicates', function (t) { - t.throws(function () { - CronParser.fieldsToExpression({ - second: [1, 1], - minute: [1], - hour: [1], - dayOfMonth: [1], - month: [1], - dayOfWeek: [1], - }); - }, new Error('Validation error, Field second contains duplicate values')); - - t.end(); -}); diff --git a/test/timezone.js b/test/timezone.js deleted file mode 100644 index 754e20a0..00000000 --- a/test/timezone.js +++ /dev/null @@ -1,422 +0,0 @@ -var test = require('tap').test; -var CronExpression = require('../lib/expression'); - -test('It works on DST start', function(t) { - try { - var options = { - currentDate: '2016-03-27 02:00:01', - tz: 'Europe/Athens' - }; - - var interval, date; - - interval = CronExpression.parse('0 * * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 5, '5 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - interval = CronExpression.parse('30 2 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 30, '30 Minutes'); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 30, '30 Minutes'); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 28, 'on the 28th'); - - interval = CronExpression.parse('0 3 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 3, '3 on the 28th'); - t.equal(date.getDate(), 28, 'on the 28th'); - - interval = CronExpression.parse('*/20 3 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 20, '20 Minutes'); - t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 40, '20 Minutes'); - t.equal(date.getHours(), 4, 'Due to DST start in Athens, 3 is skipped'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 28, 'on the 28th'); - - options.currentDate = '2016-03-27 00:00:01'; - - interval = CronExpression.parse('0 * 27 * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 1, '1 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 4, '4 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 5, '5 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - options.currentDate = '2016-03-27 00:00:01'; - options.endDate = '2016-03-27 03:00:01'; - - interval = CronExpression.parse('0 * * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 1, '1 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0 Minutes'); - t.equal(date.getHours(), 4, '4 AM'); - t.equal(date.getDate(), 27, 'on the 27th'); - - // Out of the timespan range - t.throws(function() { - date = interval.next(); - }); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('It works on DST end', function(t) { - try { - var options = { - currentDate: '2016-10-30 02:00:01', - tz: 'Europe/Athens' - }; - - var interval, date; - - interval = CronExpression.parse('0 * * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, 'Due to DST end in Athens (4-->3)'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 4, '4 AM'); - t.equal(date.getDate(), 30, '30th'); - - interval = CronExpression.parse('0 3 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 31, '31st'); - - interval = CronExpression.parse('*/20 3 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0'); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getMinutes(), 20, '20'); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getMinutes(), 40, '40'); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getMinutes(), 0, '0'); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 31, '31st'); - - options.currentDate = '2016-10-30 00:00:01'; - - interval = CronExpression.parse('0 * 30 * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 1, '1 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 4, '4 AM'); - t.equal(date.getDate(), 30, '30th'); - - options.currentDate = '2016-10-30 00:00:01'; - // specify the DST offset via ISO 8601 format, as 3am is repeated - options.endDate = '2016-10-30T03:00:01+03'; - - interval = CronExpression.parse('0 * * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 1, '1 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - // Out of the timespan range - t.throws(function() { - date = interval.next(); - }); - - options.endDate = '2016-10-30 04:00:01'; - - interval = CronExpression.parse('0 * * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 1, '1 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 2, '2 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 3, '3 AM'); - t.equal(date.getDate(), 30, '30th'); - - date = interval.next(); - t.equal(date.getHours(), 4, '4 AM'); - t.equal(date.getDate(), 30, '30th'); - - // Out of the timespan range - t.throws(function() { - date = interval.next(); - }); - - options = { - currentDate : new Date('Sun Oct 29 2016 01:00:00 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 29, '29th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - - options = { - currentDate : new Date('Sun Oct 29 2016 02:59:00 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 29, '29th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - - options = { - currentDate : new Date('Sun Oct 29 2016 02:59:59 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 29, '29th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - - options = { - currentDate : new Date('Sun Oct 30 2016 01:00:00 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - - options = { - currentDate : new Date('Sun Oct 30 2016 01:59:00 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - - options = { - currentDate : new Date('Sun Oct 30 2016 01:59:59 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - - options = { - currentDate : new Date('Sun Oct 30 2016 02:59:00 GMT+0200') - }; - - interval = CronExpression.parse('0 12 * * *', options); - t.ok(interval, 'Interval parsed'); - - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 30, '30th'); - date = interval.next(); - t.equal(date.getHours(), 12, '12'); - t.equal(date.getDate(), 31, '31st'); - } catch (err) { - t.error(err, 'Interval parse error'); - } - - t.end(); -}); - -test('it will work with #131 issue case', function(t) { - var options = { - tz: 'America/Sao_Paulo', - currentDate : new Date('Sun Oct 30 2018 02:59:00 GMT+0200') - }; - - var interval = CronExpression.parse('0 9 1 1 *', options); - var date = interval.next(); - - t.equal(date.getFullYear(), 2019); - t.equal(date.getDate(), 1); - t.equal(date.getMonth(), 0); - - date = interval.prev(); - t.equal(date.getFullYear(), 2018); - t.equal(date.getDate(), 1); - t.equal(date.getMonth(), 0); - - date = interval.prev(); - t.equal(date.getFullYear(), 2017); - t.equal(date.getDate(), 1); - t.equal(date.getMonth(), 0); - - t.end(); -}); - -test('it will work with #137 issue case', function(t) { - var options = { - tz: 'America/New_York', - currentDate : new Date('10/28/2018') - }; - - var interval = CronExpression.parse('0 12 * * 3', options); - var date = interval.next(); - - t.equal(date.getFullYear(), 2018); - t.equal(date.getDate(), 31); - t.equal(date.getMonth(), 9); - - t.end(); -}); diff --git a/tests/CronDate.test.ts b/tests/CronDate.test.ts new file mode 100644 index 00000000..3d94bcbb --- /dev/null +++ b/tests/CronDate.test.ts @@ -0,0 +1,468 @@ +import { CronDate } from '../src/index'; +import { TimeUnit } from '../src/types'; +import { DateTime } from 'luxon'; + +describe('CronDate', () => { + test('is the last weekday of the month', () => { + // Last monday of september + const date1 = new CronDate(new Date(2021, 8, 27)); + expect(date1.isLastWeekdayOfMonth()).toBe(true); + + // Second-to-last monday of september + const date2 = new CronDate(new Date(2021, 8, 20)); + expect(date2.isLastWeekdayOfMonth()).toBe(false); + }); + + test('CronDate should handle addSecond correctly', () => { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.addSecond(); + expect(date1.getMonth()).toBe(11); + expect(date1.getDate()).toBe(30); + expect(date1.getMinutes()).toBe(59); + expect(date1.getSeconds()).toBe(59); + + const date2 = new CronDate(new Date('2021-12-31T23:59:59.000-00:00'), 'UTC'); + date2.addSecond(); + expect(date2.getFullYear()).toBe(2022); + expect(date2.getMonth()).toBe(0); + expect(date2.getDate()).toBe(1); + expect(date2.getMinutes()).toBe(0); + expect(date2.getSeconds()).toBe(0); + }); + + test('CronDate should handle addMinute correctly', () => { + const date1 = new CronDate(new Date('2021-12-30T00:58:58.000-00:00'), 'UTC'); + date1.addMinute(); + expect(date1.getMonth()).toBe(11); + expect(date1.getDate()).toBe(30); + expect(date1.getMinutes()).toBe(59); + expect(date1.getSeconds()).toBe(0); + + const date2 = new CronDate(new Date('2021-12-31T23:59:59.000-00:00'), 'UTC'); + date2.addMinute(); + expect(date2.getFullYear()).toBe(2022); + expect(date2.getMonth()).toBe(0); + expect(date2.getDate()).toBe(1); + expect(date2.getMinutes()).toBe(0); + expect(date2.getSeconds()).toBe(0); + }); + + test('CronDate should handle addHour correctly', () => { + const date1 = new CronDate(new Date('2021-12-30T00:58:58.000-00:00'), 'UTC'); + date1.addHour(); + expect(date1.getMonth()).toBe(11); + expect(date1.getDate()).toBe(30); + expect(date1.getHours()).toBe(1); + expect(date1.getMinutes()).toBe(0); + expect(date1.getSeconds()).toBe(0); + + const date2 = new CronDate(new Date('2021-12-31T23:59:59.000-00:00'), 'UTC'); + date2.addHour(); + expect(date2.getFullYear()).toBe(2022); + expect(date2.getMonth()).toBe(0); + expect(date2.getDate()).toBe(1); + expect(date2.getHours()).toBe(0); + expect(date2.getMinutes()).toBe(0); + expect(date2.getSeconds()).toBe(0); + }); + + + test('CronDate should handle addDay correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:58:58.000-00:00'), 'UTC'); + date1.addDay(); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(31); + expect(date1.getHours()).toEqual(0); + expect(date1.getMinutes()).toEqual(0); + expect(date1.getSeconds()).toEqual(0); + + const date2 = new CronDate(new Date('2021-12-31T23:59:59.000-00:00'), 'UTC'); + date2.addDay(); + expect(date2.getFullYear()).toEqual(2022); + expect(date2.getMonth()).toEqual(0); + expect(date2.getDate()).toEqual(1); + expect(date2.getHours()).toEqual(0); + expect(date2.getMinutes()).toEqual(0); + expect(date2.getSeconds()).toEqual(0); + }); + + test('CronDate should handle addMonth correctly', ()=> { + const date1 = new CronDate(new Date('2021-11-30T00:58:58.000-00:00'), 'UTC'); + date1.addMonth(); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(1); + expect(date1.getHours()).toEqual(0); + expect(date1.getMinutes()).toEqual(0); + expect(date1.getSeconds()).toEqual(0); + + const date2 = new CronDate(new Date('2021-12-31T23:59:59.000-00:00'), 'UTC'); + date2.addMonth(); + expect(date2.getFullYear()).toEqual(2022); + expect(date2.getMonth()).toEqual(0); + expect(date2.getDate()).toEqual(1); + expect(date2.getHours()).toEqual(0); + expect(date2.getMinutes()).toEqual(0); + expect(date2.getSeconds()).toEqual(0); + }); + + + test('CronDate should handle addYear correctly', ()=> { + const date1 = new CronDate(new Date('2021-11-30T00:58:58.000-00:00'), 'UTC'); + date1.addYear(); + expect(date1.getFullYear()).toEqual(2022); + expect(date1.getMonth()).toEqual(10); + expect(date1.getDate()).toEqual(30); + expect(date1.getHours()).toEqual(0); + expect(date1.getMinutes()).toEqual(58); + expect(date1.getSeconds()).toEqual(58); + + const date2 = new CronDate(new Date('2020-02-29T23:59:59.000-00:00'), 'UTC'); + date2.addYear(); + expect(date2.getFullYear()).toEqual(2021); + expect(date2.getMonth()).toEqual(1); + expect(date2.getDate()).toEqual(28); + expect(date2.getHours()).toEqual(23); + expect(date2.getMinutes()).toEqual(59); + expect(date2.getSeconds()).toEqual(59); + }); + + test('CronDate should handle subtractSecond correctly', ()=> { + const date1 = new CronDate(new Date('2020-12-30T00:59:59.000-00:00'), 'UTC'); + date1.subtractSecond(); + expect(date1.getFullYear()).toEqual(2020); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(30); + expect(date1.getMinutes()).toEqual(59); + expect(date1.getSeconds()).toEqual(58); + + const date2 = new CronDate(new Date('2020-01-01T00:00:00.000-00:00'), 'UTC'); + date2.subtractSecond(); + expect(date2.getFullYear()).toEqual(2019); + expect(date2.getMonth()).toEqual(11); + expect(date2.getDate()).toEqual(31); + expect(date2.getMinutes()).toEqual(59); + expect(date2.getSeconds()).toEqual(59); + }); + + test('CronDate should handle subtractMinute correctly', ()=> { + const date1 = new CronDate(new Date('2020-12-30T00:59:59.000-00:00'), 'UTC'); + date1.subtractMinute(); + expect(date1.getFullYear()).toEqual(2020); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(30); + expect(date1.getMinutes()).toEqual(58); + expect(date1.getSeconds()).toEqual(59); + + const date2 = new CronDate(new Date('2020-01-01T00:00:00.000-00:00'), 'UTC'); + date2.subtractMinute(); + expect(date2.getFullYear()).toEqual(2019); + expect(date2.getMonth()).toEqual(11); + expect(date2.getDate()).toEqual(31); + expect(date2.getMinutes()).toEqual(59); + expect(date2.getSeconds()).toEqual(59); + }); + + test('CronDate should handle subtractHour correctly', ()=> { + const date1 = new CronDate(new Date('2020-12-30T01:59:59.000-00:00'), 'UTC'); + date1.subtractHour(); + expect(date1.getFullYear()).toEqual(2020); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(30); + expect(date1.getHours()).toEqual(0); + expect(date1.getMinutes()).toEqual(59); + expect(date1.getSeconds()).toEqual(59); + + const date2 = new CronDate(new Date('2020-01-01T00:00:00.000-00:00'), 'UTC'); + date2.subtractHour(); + expect(date2.getFullYear()).toEqual(2019); + expect(date2.getMonth()).toEqual(11); + expect(date2.getDate()).toEqual(31); + expect(date2.getHours()).toEqual(23); + expect(date2.getMinutes()).toEqual(59); + expect(date2.getSeconds()).toEqual(59); + + }); + + test('CronDate should handle subtractDay correctly', ()=> { + const date1 = new CronDate(new Date('2020-12-30T01:59:59.000-00:00'), 'UTC'); + date1.subtractDay(); + expect(date1.getFullYear()).toEqual(2020); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(29); + expect(date1.getHours()).toEqual(23); + expect(date1.getMinutes()).toEqual(59); + expect(date1.getSeconds()).toEqual(59); + + const date2 = new CronDate(new Date('2020-01-01T00:00:00.000-00:00'), 'UTC'); + date2.subtractDay(); + expect(date2.getFullYear()).toEqual(2019); + expect(date2.getMonth()).toEqual(11); + expect(date2.getDate()).toEqual(31); + expect(date2.getHours()).toEqual(23); + expect(date2.getMinutes()).toEqual(59); + expect(date2.getSeconds()).toEqual(59); + + }); + + test('CronDate should handle subtractYear correctly', ()=> { + const date1 = new CronDate(new Date('2020-12-30T01:59:59.000-00:00'), 'UTC'); + date1.subtractYear(); + expect(date1.getFullYear()).toEqual(2019); + expect(date1.getMonth()).toEqual(11); + expect(date1.getDate()).toEqual(30); + expect(date1.getHours()).toEqual(1); + expect(date1.getMinutes()).toEqual(59); + expect(date1.getSeconds()).toEqual(59); + + const date2 = new CronDate(new Date('2020-02-29T00:00:00.000-00:00'), 'UTC'); + date2.subtractYear(); + expect(date2.getFullYear()).toEqual(2019); + expect(date2.getMonth()).toEqual(1); + expect(date2.getDate()).toEqual(28); + expect(date2.getHours()).toEqual(0); + expect(date2.getMinutes()).toEqual(0); + expect(date2.getSeconds()).toEqual(0); + + }); + + + test('CronDate should handle addUnit correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date1.addUnit(TimeUnit.Year); + expect(date1.getFullYear()).toEqual(2021); + const date2 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date2.addUnit(TimeUnit.Month); + expect(date2.getMonth()).toEqual(11); + const date3 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date3.addUnit(TimeUnit.Day); + expect(date3.getDate()).toEqual(1); + const date4 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date4.addUnit(TimeUnit.Hour); + expect(date4.getHours()).toEqual(2); + const date5 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date5.addUnit(TimeUnit.Minute); + expect(date5.getMinutes()).toEqual(2); + const date6 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date6.addUnit(TimeUnit.Second); + expect(date6.getSeconds()).toEqual(2); + }); + + test('CronDate should handle subtractUnit correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date1.subtractUnit(TimeUnit.Year); + expect(date1.getFullYear()).toEqual(2019); + const date2 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date2.subtractUnit(TimeUnit.Month); + expect(date2.getMonth()).toEqual(9); + const date3 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date3.subtractUnit(TimeUnit.Day); + expect(date3.getDate()).toEqual(29); + const date4 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date4.subtractUnit(TimeUnit.Hour); + expect(date4.getHours()).toEqual(0); + const date5 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date5.subtractUnit(TimeUnit.Minute); + expect(date5.getMinutes()).toEqual(0); + const date6 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + date6.subtractUnit(TimeUnit.Second); + expect(date6.getSeconds()).toEqual(0); + }); + + test('CronDate should handle getUTCDate correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCDate()).toEqual(30); + }); + + test('CronDate should handle getUTCDay correctly', ()=> { + // Day of week starts at 0 for Sunday + const date1 = new CronDate(new Date('2020-11-28T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCDay()).toEqual(6); + const date2 = new CronDate(new Date('2020-11-22T01:01:01.000-00:00'), 'UTC'); + expect(date2.getUTCDay()).toEqual(0); + const date3 = new CronDate(new Date('2020-11-29T01:01:01.000-00:00'), 'UTC'); + expect(date3.getUTCDay()).toEqual(0); + }); + + + test('CronDate should handle getUTCFullYear correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCFullYear()).toEqual(2020); + }); + + test('CronDate should handle getUTCMonth correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCMonth()).toEqual(10); + }); + + test('CronDate should handle getUTCHours correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCHours()).toEqual(1); + }); + + test('CronDate should handle getUTCMinutes correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCMinutes()).toEqual(1); + }); + + test('CronDate should handle getUTCSeconds correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + expect(date1.getUTCSeconds()).toEqual(1); + }); + + test('CronDate should handle toJSON correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + // not sure how this is JSON? + expect(date1.toJSON()).toEqual('2020-11-30T01:01:01.000Z'); + }); + + test('CronDate should handle toString correctly', ()=> { + const date1 = new CronDate(new Date('2020-11-30T01:01:01.000-00:00'), 'UTC'); + const expected = new Date('2020-11-30T01:01:01.000-00:00').toString(); + expect(date1.toString()).toEqual(expected); + }); + + + test('CronDate should handle setDate correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setDate(1); + expect(date1.getDate()).toEqual(1); + }); + + test('CronDate should handle setFullYear correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setFullYear(2222); + expect(date1.getFullYear()).toEqual(2222); + }); + + test('CronDate should handle setDay correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setDay(3); + expect(date1.getDay()).toEqual(3); + }); + + test('CronDate should handle setMonth correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setMonth(3); + expect(date1.getMonth()).toEqual(3); + }); + + test('CronDate should handle setHours correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setHours(3); + expect(date1.getHours()).toEqual(3); + }); + + test('CronDate should handle setMinutes correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setMinutes(30); + expect(date1.getMinutes()).toEqual(30); + }); + + test('CronDate should handle setSeconds correctly', ()=> { + const date1 = new CronDate(new Date('2021-12-30T00:59:58.000-00:00'), 'UTC'); + date1.setSeconds(30); + expect(date1.getSeconds()).toEqual(30); + }); + + describe('parse cron date formats with local timezone', () => { + const offset = new Date().getTimezoneOffset(); + const offsetHours = Math.abs(Math.floor(offset / 60)); + const offsetMinutes = offset % 60; + const offsetSign = offset < 0 ? '-' : '+'; + const expectedTime = new Date(2021, 0, 4, 10, 0, 0).toString(); + const typeCheckCronDate = (date: unknown) => { + if (!(date instanceof CronDate)) { + throw new Error('date is not instance of CronDate'); + } + }; + + test('undefined date', () => { + const realDate = new Date(); + const d = new CronDate(); + typeCheckCronDate(d); + expect(d.toDate().toString()).toBe(realDate.toString()); + }); + + test('JS Date', () => { + const d = new CronDate(new Date(2021, 0, 4, 10, 0, 0)); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('ISO 8601', () => { + const d = new CronDate('2021-01-04T10:00:00'); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('ISO 8601 date', () => { + const d = new CronDate('2021-01-04'); + const expectedTime = new Date(2021, 0, 4, 0, 0, 0).toString(); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('RFC2822', () => { + const offsetString = offsetSign + String(offsetHours).padStart(2, '0') + String(offsetMinutes).padStart(2, '0'); + const d = new CronDate('Mon, 4 Jan 2021 10:00:00 ' + offsetString); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('RFC2822-like without timezone offset', () => { + const d = new CronDate('Mon, 4 Jan 2021 10:00:00'); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('SQL', () => { + const d = new CronDate('2021-01-04 10:00:00'); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('milliseconds', () => { + const d = new CronDate(new Date('2021-01-04 10:00:00').valueOf()); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('CronDate', () => { + const date = new CronDate('Mon, 4 Jan 2021 10:00:00'); + const d = new CronDate(date); + expect(d.toDate().toString()).toBe(expectedTime); + }); + + test('invalid', () => { + expect(() => new CronDate('2021-01-4 10:00:00')).toThrow(); + }); + }); + + describe('parse cron date formats with another timezone', () => { + test('ISO 8601 without offset', () => { + const d = new CronDate('2021-01-04T10:00:00', 'Europe/Athens'); + expect(d.toISOString()).toBe('2021-01-04T08:00:00.000Z'); + }); + + test('ISO 8601 with non-local offset', () => { + const d = new CronDate('2021-01-04T10:00:00+01:00', 'Europe/Athens'); + expect(d.toISOString()).toBe('2021-01-04T09:00:00.000Z'); + }); + + test('RFC2822 with non-local offset', () => { + const d = new CronDate('Mon, 4 Jan 2021 10:00:00 +0100', 'Europe/Athens'); + expect(d.toISOString()).toBe('2021-01-04T09:00:00.000Z'); + }); + + test('milliseconds', () => { + const date = DateTime.fromISO('2021-01-04T11:00:00.000+02:00').valueOf(); + const d = new CronDate(date, 'Europe/Athens'); + expect(d.toISOString()).toBe('2021-01-04T09:00:00.000Z'); + }); + + test('CronDate with same timezone', () => { + const date = new CronDate('Mon, 4 Jan 2021 10:00:00', 'Europe/Athens'); + const d = new CronDate(date); + expect(d.toISOString()).toBe('2021-01-04T08:00:00.000Z'); + }); + + test('CronDate with different timezone', () => { + const date = new CronDate('Mon, 4 Jan 2021 10:00:00', 'America/New_York'); + const d = new CronDate(date, 'Europe/Athens'); + expect(d.toISOString()).toBe('2021-01-04T15:00:00.000Z'); + }); + }); +}); diff --git a/tests/CronExpression.test.ts b/tests/CronExpression.test.ts new file mode 100644 index 00000000..ce997bc8 --- /dev/null +++ b/tests/CronExpression.test.ts @@ -0,0 +1,2211 @@ +import { CronDate, CronExpression, CronFieldCollection, PredefinedExpressions } from '../src/index'; +import { CronParseOptions } from '../src/types'; + +const typeCheckCronDateObject = (date: CronDate | { value: CronDate; done: boolean }): date is { value: CronDate; done: boolean } => { + return typeof date === 'object' && 'value' in date && 'done' in date; +}; + +describe('CronExpression', () => { + const cronDateTypedTest = (date: unknown, testFn: (date: CronDate) => void): void => { + if (!(date instanceof CronDate)) { + throw new Error('date is not instance of CronDate'); + } + testFn(date); + }; + + test('empty expression test', function () { + const interval = CronExpression.parse(''); + const date = new CronDate(); + date.addMinute(); + const next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(date.getMinutes())); // 'Schedule matches' + }); + + test('default expression test', function () { + const interval = CronExpression.parse('* * * * *'); + const date = new CronDate(); + date.addMinute(); + const next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(date.getMinutes())); // 'Schedule matches' + }); + + test('default expression (tab separate) test', function () { + const interval = CronExpression.parse('* * * * *'); + const date = new CronDate(); + date.addMinute(); + const next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(date.getMinutes())); // 'Schedule matches' + }); + + test('default expression (multi-space separated) test 1', function () { + const interval = CronExpression.parse('* \t*\t\t *\t * \t\t*'); + const date = new CronDate(); + date.addMinute(); + const next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(date.getMinutes())); // 'Schedule matches' + }); + + + test('default expression (multi-space separated) test 1', function () { + const interval = CronExpression.parse('* \t *\t \t * * \t \t *'); + const date = new CronDate(); + date.addMinute(); + const next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(date.getMinutes())); // 'Schedule matches' + }); + + test('value out of the range', function () { + expect(() => CronExpression.parse('61 * * * * *')).toThrow('Constraint error, got value 61 expected range 0-59'); + }); + + test('second value out of the range', function () { + // expect(() => CronExpression.parse('-1 * * * * *')).toThrow('Constraint error, got value -1 expected range 0-59'); + expect(() => CronExpression.parse('-1 * * * * *')).toThrow('Constraint error, got range NaN-1 expected range 0-59'); + }); + + test('invalid range', function () { + // expect(() => CronExpression.parse('- * * * * *')).toThrow('Invalid range: -'); + expect(() => CronExpression.parse('- * * * * *')).toThrow('Constraint error, got range NaN-NaN expected range 0-59'); + }); + + test('minute value out of the range', function () { + expect(() => CronExpression.parse('* 32,72 * * * *')).toThrow('Constraint error, got value 72 expected range 0-59'); + }); + + test('hour value out of the range', function () { + expect(() => CronExpression.parse('* * 12-36 * * *')).toThrow('Constraint error, got range 12-36 expected range 0-23'); + }); + + + test('day of the month value out of the range', function () { + expect(() => CronExpression.parse('* * * 10-15,40 * *')).toThrow('Constraint error, got value 40 expected range 1-31'); + }); + + test('month value out of the range', function () { + expect(() => CronExpression.parse('* * * * */10,12-13 *')).toThrow('Constraint error, got range 12-13 expected range 1-12'); + }); + + test('day of the week value out of the range', function () { + expect(() => CronExpression.parse('* * * * * 9')).toThrow('Constraint error, got value 9 expected range 0-7'); + }); + + test('invalid expression that contains too many fields', function () { + expect(() => CronExpression.parse('* * * * * * * *ASD')).toThrow('Invalid cron expression'); + }); + + test('invalid explicit day of month definition', function () { + expect(() => { + const iter = CronExpression.parse('0 0 31 4 *'); + iter.next(); + }).toThrow('Invalid explicit day of month definition'); + }); + + test('incremental minutes expression test', function () { + const interval = CronExpression.parse('*/3 * * * *'); + const next = interval.next(); + // expect(next.getMinutes() % 3).toEqual(0); // 'Schedule matches' + cronDateTypedTest(next, (date) => expect(date.getMinutes() % 3).toEqual(0)); // 'Schedule matches' + }); + + test('fixed expression test', function () { + const interval = CronExpression.parse('10 2 12 8 0'); + const next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of Month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + expect(date.getHours()).toEqual(2); // 'Hour matches' + expect(date.getMinutes()).toEqual(10); // 'Minute matches' + }); + }); + + test('invalid characters test - symbol', function () { + expect(() => CronExpression.parse('10 ! 12 8 0')).toThrow('Invalid characters, got value: !'); + }); + + test('invalid characters test - letter', function () { + expect(() => CronExpression.parse('10 x 12 8 0')).toThrow('Invalid characters, got value: x'); + }); + + test('invalid characters test - parentheses', function () { + expect(() => CronExpression.parse('10 ) 12 8 0')).toThrow('Invalid characters, got value: )'); + }); + + test('interval with invalid characters test', function () { + expect(() => CronExpression.parse('10 */A 12 8 0')).toThrow('Invalid characters, got value: */A'); + + }); + + test('range with invalid characters test', function () { + expect(() => CronExpression.parse('10 0-z 12 8 0')).toThrow('Invalid characters, got value: 0-z'); + }); + + test('group with invalid characters test', function () { + expect(() => CronExpression.parse('10 0,1,z 12 8 0')).toThrow('Invalid characters, got value: 0,1,z'); + }); + + test('invalid expression which has repeat 0 times', function () { + expect(() => CronExpression.parse('0 */0 * * *')).toThrow('Constraint error, cannot repeat at every 0 time.'); + }); + + test('invalid expression which has repeat negative number times', function () { + expect(() => CronExpression.parse('0 */-5 * * *')).toThrow('Constraint error, cannot repeat at every -5 time.'); + }); + + test('invalid expression which has multiple combined repeat cycles', function () { + expect(() => CronExpression.parse('0 5/5/5 * * *')).toThrow('Invalid repeat: 5/5/5'); + }); + + test('range test with value and repeat (second)', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + const interval = CronExpression.parse('0/30 * * * * ?', options); + + let next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getSeconds()).toEqual(0)); + + next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getSeconds()).toEqual(30)); + + next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getSeconds()).toEqual(0)); + + }); + + test('range test with value and repeat (minute)', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + const interval = CronExpression.parse('6/23 * * * *', options); + + let next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(52)); + + next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(6)); + + next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(29)); + + next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getMinutes()).toEqual(52)); + }); + + test('range test with iterator', function () { + const interval = CronExpression.parse('10-30 2 12 8 0'); + + const intervals = interval.iterate(20); + + for (let i = 0, c = intervals.length; i < c; i++) { + const next = intervals[i]; + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + expect(date.getHours()).toEqual(2); // 'Hour matches' + expect(date.getMinutes()).toEqual(10 + i); // 'Minute matches' + }); + } + }); + + test('incremental range test with iterator', function () { + const interval = CronExpression.parse('10-30/2 2 12 8 0'); + const intervals = interval.iterate(10); + + for (let i = 0, c = intervals.length; i < c; i++) { + const next = intervals[i]; + expect(next).toBeTruthy(); + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + expect(date.getHours()).toEqual(2); // 'Hour matches' + expect(date.getMinutes()).toEqual(10 + (i * 2)); // 'Minute matches' + }); + } + }); + + test('range with the same start and end value', function () { + const interval = CronExpression.parse('*/10 2-2 * * *'); + expect(interval).toBeTruthy(); + }); + + test('predefined expression', function () { + const interval = CronExpression.parse('@yearly'); + const date = new CronDate(); + date.addYear(); + const next = interval.next(); + cronDateTypedTest(next, (date) => expect(date.getFullYear()).toEqual(date.getFullYear())); // 'Year matches' + }); + + test('expression limited with start and end date', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + startDate: new CronDate('Wed, 26 Dec 2012 12:40:00'), + endDate: new CronDate('Wed, 26 Dec 2012 16:40:00'), + }; + + const interval = CronExpression.parse('*/20 * * * *', options); + + const dates1 = interval.iterate(10); + expect(dates1.length).toEqual(7); // 'Dates count matches for positive iteration' + + interval.reset(); + + const dates2 = interval.iterate(-10); + expect(dates2.length).toEqual(6); // 'Dates count matches for negative iteration' + + interval.reset(); + + // Forward iteration + let next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(14); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + + next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(15); // 'Hour matches' + expect(date.getMinutes()).toEqual(0); // 'Minute matches' + }); + + next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(15); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + + next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(15); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + + next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(16); // 'Hour matches' + expect(date.getMinutes()).toEqual(0); // 'Minute matches' + }); + next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(16); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + next = interval.next(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(16); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + expect(() => interval.next()).toThrow(); // 'Should fail' + + next = interval.prev(); + cronDateTypedTest(next, (date) => { + expect(date.getHours()).toEqual(16); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + + interval.reset(); + + // Backward iteration + let prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(14); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(14); // 'Hour matches' + expect(date.getMinutes()).toEqual(0); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(13); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(13); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(13); // 'Hour matches' + expect(date.getMinutes()).toEqual(0); // 'Minute matches' + }); + expect(interval.hasPrev()).toBe(true); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(12); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + expect(interval.hasPrev()).toBe(false); + expect(() => interval.prev()).toThrow(); // 'Should fail' + }); + + test('expression limited with start and end date with prev', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + startDate: new CronDate('Wed, 26 Dec 2012 12:40:00'), + endDate: new CronDate('Wed, 26 Dec 2012 16:40:00'), + }; + + const interval = CronExpression.parse('*/20 * * * *', options); + + // Backward iteration + let prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(14); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(14); // 'Hour matches' + expect(date.getMinutes()).toEqual(0); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(13); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(13); // 'Hour matches' + expect(date.getMinutes()).toEqual(20); // 'Minute matches' + }); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(13); // 'Hour matches' + expect(date.getMinutes()).toEqual(0); // 'Minute matches' + }); + expect(interval.hasPrev()).toBe(true); + prev = interval.prev(); + cronDateTypedTest(prev, (date) => { + expect(date.getHours()).toEqual(12); // 'Hour matches' + expect(date.getMinutes()).toEqual(40); // 'Minute matches' + }); + expect(interval.hasPrev()).toBe(false); + expect(() => interval.prev()).toThrow(); // 'Should fail' + }); + + test('iterate', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + startDate: new CronDate('Wed, 26 Dec 2012 12:40:00'), + endDate: new CronDate('Wed, 26 Dec 2012 16:40:00'), + tz: 'UTC', + }; + + const interval = CronExpression.parse('*/20 * * * *', options); + const expected1 = [ + '2012-12-26T19:40:00.000Z', + '2012-12-26T20:00:00.000Z', + '2012-12-26T20:20:00.000Z', + '2012-12-26T20:40:00.000Z', + '2012-12-26T21:00:00.000Z', + ]; + + interval.iterate(5, (date) => { + cronDateTypedTest(date, (date) => { + expect(date.toISOString()).toEqual(expected1.shift()); + }); + }); + }); + + test('predefined expression should be valid', () => { + expect(PredefinedExpressions).toEqual({ + '@daily': '0 0 0 * * *', + '@hourly': '0 0 * * * *', + '@minutely': '0 * * * * *', + '@monthly': '0 0 0 1 * *', + '@secondly': '* * * * * *', + '@weekdays': '0 0 0 * * 1-5', + '@weekends': '0 0 0 * * 0,6', + '@weekly': '0 0 0 * * 0', + '@yearly': '0 0 0 1 1 *', + '@annually': '0 0 0 1 1 *', + }); + }); + + test('reset to given date', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + + const interval = CronExpression.parse('*/20 * * * *', options); + + // Forward iteration + let next = interval.next(); + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(14); // 'Hour matches' + expect(next.getMinutes()).toEqual(40); // 'Minute matches' + }); + + interval.reset(); // defaults to initial currentDate + + next = interval.next(); + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(14); // 'Hour matches' + expect(next.getMinutes()).toEqual(40); // 'Minute matches' + }); + + interval.reset(new CronDate('Wed, 26 Dec 2012 17:23:53')); + + next = interval.next(); + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(17); // 'Hour matches' + expect(next.getMinutes()).toEqual(40); // 'Minute matches' + }); + + next = interval.next(); + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(18); // 'Hour matches' + expect(next.getMinutes()).toEqual(0); // 'Minute matches' + }); + + interval.reset(new Date('2019-06-18T08:18:36.000')); + + next = interval.prev(); + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(18); // 'Date matches' + expect(next.getHours()).toEqual(8); // 'Hour matches' + expect(next.getMinutes()).toEqual(0); // 'Minute matches' + }); + + next = interval.prev(); + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(18); // 'Date matches' + expect(next.getHours()).toEqual(7); // 'Hour matches' + expect(next.getMinutes()).toEqual(40); // 'Minute matches' + }); + }); + + test('parse expression as UTC', function () { + const options = { + + }; + + let interval = CronExpression.parse('0 0 10 * * *', options); + const date1 = interval.next(); + cronDateTypedTest(date1, (date) => { + expect(date.getUTCHours()).toEqual(10); // 'Correct UTC hour value' + expect(date.getHours()).toEqual(10); // 'Correct UTC hour value' + }); + + interval = CronExpression.parse('0 */5 * * * *', options); + + const date2 = interval.next(), now = new Date(); + now.setMinutes(now.getMinutes() + 5 - (now.getMinutes() % 5)); + + cronDateTypedTest(date2, (date) => { + expect(date.getHours()).toEqual(now.getUTCHours()); // 'Correct local time for 5 minute interval' + }); + }); + + test('expression using days of week strings', function () { + const interval = CronExpression.parse('15 10 * * MON-TUE'); + const intervals = interval.iterate(8); + expect(intervals).toBeTruthy(); + + for (let i = 0, c = intervals.length; i < c; i++) { + const next = intervals[i]; + if (!(next instanceof CronDate)) { + throw new Error('Expected CronDate instance'); + } + const day = next.getDay(); + expect(next).toBeTruthy(); // 'Found next scheduled interval' + expect(day === 1 || day === 2).toBeTruthy(); // 'Day matches' + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(10); // 'Hour matches' + expect(next.getMinutes()).toEqual(15); // 'Minute matches' + }); + } + }); + + test('expression using days of week strings - wrong alias', function () { + expect(() => CronExpression.parse('15 10 * * MON-TUR')).toThrow('Validation error, cannot resolve alias "tur"'); + }); + + test('expression using mixed days of week strings', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + + const interval = CronExpression.parse('15 10 * jAn-FeB mOn-tUE', options); + + const intervals = interval.iterate(8); + expect(intervals).toBeTruthy(); + + for (let i = 0, c = intervals.length; i < c; i++) { + const next = intervals[i]; + if (!(next instanceof CronDate)) { + throw new Error('Expected CronDate instance'); + } + const day = next.getDay(); + const month = next.getMonth(); + + expect(next).toBeTruthy(); // 'Found next scheduled interval' + expect(month === 0 || month === 1).toBeTruthy(); // 'Month Matches' + expect(day === 1 || day === 2).toBeTruthy(); // 'Day matches' + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(10); // 'Hour matches' + expect(next.getMinutes()).toEqual(15); // 'Minute matches' + }); + } + }); + + test('expression using non-standard second field (wildcard)', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'), + endDate: new CronDate('Wed, 26 Dec 2012 15:40:00'), + }; + + const interval = CronExpression.parse('* * * * * *', options); + + const intervals = interval.iterate(10); + expect(intervals).toBeTruthy(); + + for (let i = 0, c = intervals.length; i < c; i++) { + const next = intervals[i]; + // t.ok(next, 'Found next scheduled interval'); + expect(next).toBeTruthy(); + cronDateTypedTest(next, (next) => { + expect(next.getSeconds()).toEqual(i + 1); // 'Second matches' + }); + } + }); + + test('expression using non-standard second field (step)', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'), + endDate: new CronDate('Wed, 26 Dec 2012 15:40:00'), + }; + + const interval = CronExpression.parse('*/20 * * * * *', options); + + const intervals = interval.iterate(3); + expect(intervals).toBeTruthy(); + + cronDateTypedTest(intervals[0], (date) => { + expect(date.getSeconds()).toEqual(20); // 'first matches' + }); + cronDateTypedTest(intervals[1], (date) => { + expect(date.getSeconds()).toEqual(40); // 'Second matches' + }); + cronDateTypedTest(intervals[2], (date) => { + expect(date.getSeconds()).toEqual(0); // 'third matches' + }); + }); + + test('expression using non-standard second field (range)', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:00'), + endDate: new CronDate('Wed, 26 Dec 2012 15:40:00'), + }; + + const interval = CronExpression.parse('20-40/10 * * * * *', options); + + const intervals = interval.iterate(3); + expect(intervals).toBeTruthy(); + + for (let i = 0, c = intervals.length; i < c; i++) { + const next = intervals[i]; + expect(next).toBeTruthy(); + cronDateTypedTest(next, (next) => { + expect(next.getSeconds()).toEqual(20 + (i * 10)); // 'Second matches' + }); + } + }); + + test('expression using explicit month definition and */5 day of month step', function () { + const firstIterator = CronExpression.parse('0 12 */5 6 *', { + currentDate: '2019-06-01T11:00:00.000', + }); + + const firstExpectedDates = [ + new CronDate('2019-06-01T12:00:00.000'), + new CronDate('2019-06-06T12:00:00.000'), + new CronDate('2019-06-11T12:00:00.000'), + new CronDate('2019-06-16T12:00:00.000'), + new CronDate('2019-06-21T12:00:00.000'), + new CronDate('2019-06-26T12:00:00.000'), + new CronDate('2020-06-01T12:00:00.000'), + ]; + + firstExpectedDates.forEach(function (expectedDate) { + cronDateTypedTest(firstIterator.next(), (date) => { + expect(expectedDate.toISOString()).toEqual(date.toISOString()); + }); + }); + + const secondIterator = CronExpression.parse('0 15 */5 5 *', { + currentDate: '2019-05-01T11:00:00.000', + }); + + const secondExpectedDates = [ + new CronDate('2019-05-01T15:00:00.000'), + new CronDate('2019-05-06T15:00:00.000'), + new CronDate('2019-05-11T15:00:00.000'), + new CronDate('2019-05-16T15:00:00.000'), + new CronDate('2019-05-21T15:00:00.000'), + new CronDate('2019-05-26T15:00:00.000'), + new CronDate('2019-05-31T15:00:00.000'), + new CronDate('2020-05-01T15:00:00.000'), + ]; + + secondExpectedDates.forEach(function (expectedDate) { + cronDateTypedTest(secondIterator.next(), (date) => { + expect(expectedDate.toISOString()).toEqual(date.toISOString()); + }); + }); + + }); + + test('day of month and week are both set', function () { + const interval = CronExpression.parse('10 2 12 8 0'); + let next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + }); + + test('day of month is unspecified', function () { + // At 02:10:00am, on every Wednesday, every month + const expected = [ + '2023-05-03T02:10:00.000Z', + '2023-05-10T02:10:00.000Z', + '2023-05-17T02:10:00.000Z', + '2023-05-24T02:10:00.000Z', + '2023-05-31T02:10:00.000Z', + '2023-06-07T02:10:00.000Z', + '2023-06-14T02:10:00.000Z', + '2023-06-21T02:10:00.000Z', + '2023-06-28T02:10:00.000Z', + '2023-07-05T02:10:00.000Z', + ]; + + const options = { + currentDate: '2023-04-29T00:00:00.000', + tz: 'UTC', + }; + const interval = CronExpression.parse('10 2 ? * 3', options); + + expected.forEach((expectedDate) => { + cronDateTypedTest(interval.next(), (date) => { + expect(date.toISOString()).toEqual(expectedDate); + }); + }); + + }); + + test('day of week is unspecified', function () { + const interval = CronExpression.parse('10 2 3,6 * ?'); + let next = interval.next(); + + expect(next).toBeTruthy(); + cronDateTypedTest(next, (date) => expect(date.getDate() === 3 || date.getDate() === 6).toBeTruthy()); // 'date matches' + + if (!(next instanceof CronDate)) { + throw new Error('next is not a CronDate'); + } + + let prevDate = next.getDate(); + next = interval.next(); + + expect(next).toBeTruthy(); + // 'date matches and is not previous date' + cronDateTypedTest(next, (date) => expect((date.getDate() === 3 || date.getDate() === 6) && date.getDate() !== prevDate).toBeTruthy()); + + if (!(next instanceof CronDate)) { + throw new Error('next is not a CronDate'); + } + + prevDate = next.getDate(); + + next = interval.next(); + expect(next).toBeTruthy(); + // 'date matches and is not previous date' + cronDateTypedTest(next, (date) => expect((date.getDate() === 3 || date.getDate() === 6) && date.getDate() !== prevDate).toBeTruthy()); + + if (!(next instanceof CronDate)) { + throw new Error('next is not a CronDate'); + } + + prevDate = next.getDate(); + + next = interval.next(); + expect(next).toBeTruthy(); + // 'date matches and is not previous date' + cronDateTypedTest(next, (date) => expect((date.getDate() === 3 || date.getDate() === 6) && date.getDate() !== prevDate).toBeTruthy()); + }); + + test('Summertime bug test', function () { + const month = new CronDate().getMonth() + 1; + const interval = CronExpression.parse('0 0 0 1 ' + month + ' *'); + + const next = interval.next(); + expect(next).toBeTruthy(); + // TODO - should this test do something more than just check that next is truthy? + // Before fix the bug it was getting a timeout error if you are + // in a timezone that changes the DST to ST in the hour 00:00h. + }); + + + test('day of month and week are both set and dow is 7', function () { + const interval = CronExpression.parse('10 2 12 8 7'); + let next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (date) => { + expect(date.getDay() === 0 || date.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(date.getMonth()).toEqual(7); // 'Month matches' + }); + }); + + test('day of month is wildcard, month and day of week are both set', function () { + const options = { + currentDate: new CronDate('Mon, 31 May 2021 12:00:00'), + }; + const interval = CronExpression.parse('0 0 * 6 2', options); + const expectedDayMatches = [1, 8, 15, 22, 29]; + + expectedDayMatches.forEach(function (dayOfMonth) { + const next = interval.next(); + expect(next).toBeTruthy(); + cronDateTypedTest(next, (next) => { + expect(next.getDay()).toEqual(2); // 'Day of week matches' + expect(next.getDate()).toEqual(dayOfMonth); // 'Day of month matches' + expect(next.getMonth()).toEqual(5); // 'Month matches' + }); + }); + }); + + test('day of month contains multiple ranges and day of week is wildcard', function () { + const options = { + currentDate: new CronDate('Sat, 1 Dec 2012 14:38:53'), + }; + const interval = CronExpression.parse('0 0 0 2-4,7-31 * *', options); + let next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(2); // 'Day of month matches' + expect(next.getMonth()).toEqual(11); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(3); // 'Day of month matches' + expect(next.getMonth()).toEqual(11); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(4); // 'Day of month matches' + expect(next.getMonth()).toEqual(11); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(7); // 'Day of month matches' + expect(next.getMonth()).toEqual(11); // 'Month matches' + }); + + next = interval.next(); + + // t.ok(next.getDate() === 8, 'Day of month matches'); + // expect(next.getMonth()).toEqual(11); // 'Month matches' + cronDateTypedTest(next, (next) => { + expect(next.getDate()).toEqual(8); // 'Day of month matches' + expect(next.getMonth()).toEqual(11); // 'Month matches' + }); + + expect(() => interval.next()).not.toThrow(); + }); + + test('day of month and week are both set and dow is 6,0', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + const interval = CronExpression.parse('10 2 12 8 6,0', options); + let next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDay() === 6 || next.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(next.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDay() === 0 || next.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(next.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDay() === 6 || next.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(next.getMonth()).toEqual(7); // 'Month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getDay() === 0 || next.getDate() === 12).toBeTruthy(); // 'Day or day of month matches' + expect(next.getMonth()).toEqual(7); // 'Month matches' + }); + }); + + test('day of month and week are both set and dow is 6-7', function () { + // if both "day of month" (field 3) and "day of week" (field 5) are restricted (not contain "*"), then one or both must match the current day. + // At 02:10 AM, on day 12 of the month, Saturday through Sunday, only in August + + const expected = [ + '2013-08-03T02:10:00.000Z', // - Saturday + '2013-08-04T02:10:00.000Z', // - Sunday + '2013-08-10T02:10:00.000Z', // - Saturday + '2013-08-11T02:10:00.000Z', // - Sunday + '2013-08-12T02:10:00.000Z', // - Monday - 12th of month + '2013-08-17T02:10:00.000Z', // - Saturday + '2013-08-18T02:10:00.000Z', // - Sunday + '2013-08-24T02:10:00.000Z', // - Saturday + '2013-08-25T02:10:00.000Z', // - Sunday + '2013-08-31T02:10:00.000Z', // - Saturday + '2014-08-02T02:10:00.000Z', // - Saturday + '2014-08-03T02:10:00.000Z', // - Sunday + '2014-08-09T02:10:00.000Z', // - Saturday + '2014-08-10T02:10:00.000Z', // - Sunday + '2014-08-12T02:10:00.000Z', // - Tuesday - 12th of month + ]; + + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + tz: 'UTC', + }; + const interval = CronExpression.parse('10 2 12 8 6-7', options); + + let next = interval.next(); + expected.forEach((expectedDate, i) => { + cronDateTypedTest(next, (next) => { + expect(`${i}:${next.toISOString()}`).toEqual(`${i}:${expectedDate}`); + }); + next = interval.next(); + }); + }); + + test('day of month validation should be ignored when day of month is wildcard and month is set', function () { + const options = { + currentDate: new CronDate('2020-05-01T15:00:00.000'), + }; + const interval = CronExpression.parse('* * * * 2 *', options); + + const next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(0); // 'Hours matches' + expect(next.getDate()).toEqual(1); // 'Day of month matches' + expect(next.getMonth() + 1).toEqual(2); // 'Month matches' + }); + + }); + + test('day and date in week should match', function () { + const interval = CronExpression.parse('0 1 1 1 * 1'); + + let next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(1); // 'Hours matches' + expect(next.getDay() === 1 || next.getDate() === 1).toBeTruthy(); // 'Day or day of month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(1); // 'Hours matches' + expect(next.getDay() === 1 || next.getDate() === 1).toBeTruthy(); // 'Day or day of month matches' + }); + + next = interval.next(); + + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(1); // 'Hours matches' + expect(next.getDay() === 1 || next.getDate() === 1).toBeTruthy(); // 'Day or day of month matches' + }); + }); + + test('should sort ranges and values in ascending order', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + const interval = CronExpression.parse('0 12,13,10,1-3 * * *', options); + const hours = [1, 2, 3, 10, 12, 13]; + + for (const i in hours) { + const next = interval.next(); + cronDateTypedTest(next, (next) => { + expect(next.getHours()).toEqual(hours[i]); // 'Hours matches' + }); + } + }); + + test('valid ES6 iterator should be returned if iterator options is set to true', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + endDate: new CronDate('Wed, 26 Dec 2012 15:40:00'), + iterator: true, + }; + + let val: CronDate | { value: CronDate; done: boolean }; + const interval = CronExpression.parse('*/25 * * * *', options); + + val = interval.next(); + if (!typeCheckCronDateObject(val)) { + throw new Error('Expected CronDate object or iterator result'); + } + expect(val?.value).toBeTruthy(); + expect(val.done).toBeFalsy(); + + val = interval.next(); + if (!typeCheckCronDateObject(val)) { + throw new Error('Expected CronDate object or iterator result'); + } + expect(val?.value).toBeTruthy(); + expect(val.done).toBeFalsy(); + + val = interval.next(); + if (!typeCheckCronDateObject(val)) { + throw new Error('Expected CronDate object or iterator result'); + } + expect(val?.value).toBeTruthy(); + expect(val.done).toBeTruthy(); + }); + + test('dow 6,7 6,0 0,6 7,6 should be equivalent', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 14:38:53'), + }; + + const expressions = [ + '30 16 * * 6,7', + '30 16 * * 6,0', + '30 16 * * 0,6', + '30 16 * * 7,6', + ]; + + expressions.forEach(function (expression) { + const interval = CronExpression.parse(expression, options); + let val = interval.next(); + cronDateTypedTest(val, (val) => { + expect(val.getDay() === 6).toBeTruthy(); // 'Day matches' + }); + + val = interval.next(); + cronDateTypedTest(val, (val) => { + expect(val.getDay() === 0).toBeTruthy(); // 'Day matches' + }); + + val = interval.next(); + cronDateTypedTest(val, (val) => { + expect(val.getDay() === 6).toBeTruthy(); // 'Day matches' + }); + }); + }); + + test('hour 0 9,11,1 * * * and 0 1,9,11 * * * should be equivalent', function () { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 00:00:00'), + }; + + const expressions = [ + '0 9,11,1 * * *', + '0 1,9,11 * * *', + ]; + + expressions.forEach(function (expression) { + const interval = CronExpression.parse(expression, options); + + let val = interval.next(); + cronDateTypedTest(val, (val) => expect(val.getHours()).toEqual(1)); // 'Hour matches' + + val = interval.next(); + cronDateTypedTest(val, (val) => expect(val.getHours()).toEqual(9)); // 'Hour matches' + + val = interval.next(); + cronDateTypedTest(val, (val) => expect(val.getHours()).toEqual(11)); // 'Hour matches' + + val = interval.next(); + cronDateTypedTest(val, (val) => expect(val.getHours()).toEqual(1)); // 'Hour matches' + + val = interval.next(); + cronDateTypedTest(val, (val) => expect(val.getHours()).toEqual(9)); // 'Hour matches' + + val = interval.next(); + cronDateTypedTest(val, (val) => expect(val.getHours()).toEqual(11)); // 'Hour matches' + }); + }); + + test('it will work with #139 issue case', function () { + const options = { + currentDate: new Date('2018-11-15T16:15:33.522Z'), + tz: 'Europe/Madrid', + }; + + const interval = CronExpression.parse('0 0 0 1,2 * *', options); + const date = interval.next(); + + cronDateTypedTest(date, (date) => { + expect(date.getFullYear()).toEqual(2018); + expect(date.getDate()).toEqual(1); + expect(date.getMonth()).toEqual(11); + }); + }); + + test('should work for valid first/second/third/fourth/fifth occurrence dayOfWeek (# char)', function () { + const options = { + currentDate: new CronDate('2019-04-30'), + }; + + const expectedFirstDates = [ + new CronDate('2019-05-05'), + new CronDate('2019-06-02'), + new CronDate('2019-07-07'), + new CronDate('2019-08-04'), + ]; + const expectedSecondDates = [ + new CronDate('2019-05-12'), + new CronDate('2019-06-09'), + new CronDate('2019-07-14'), + new CronDate('2019-08-11'), + ]; + const expectedThirdDates = [ + new CronDate('2019-05-19'), + new CronDate('2019-06-16'), + new CronDate('2019-07-21'), + new CronDate('2019-08-18'), + ]; + const expectedFourthDates = [ + new CronDate('2019-05-26'), + new CronDate('2019-06-23'), + new CronDate('2019-07-28'), + new CronDate('2019-08-25'), + ]; + const expectedFifthDates = [ + new CronDate('2019-06-30'), + new CronDate('2019-09-29'), + new CronDate('2019-12-29'), + new CronDate('2020-03-29'), + ]; + + const allExpectedDates = [ + expectedFirstDates, + expectedSecondDates, + expectedThirdDates, + expectedFourthDates, + expectedFifthDates, + ]; + const expressions = [ + '0 0 0 ? * 0#1', + '0 0 0 ? * 0#2', + '0 0 0 ? * 0#3', + '0 0 0 ? * 0#4', + '0 0 0 ? * 0#5', + ]; + expressions.forEach(function (expression, index) { + const interval = CronExpression.parse(expression, options); + const expectedDates = allExpectedDates[index]; + + expectedDates.forEach(function (expected) { + const date = interval.next(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + + expectedDates + .slice(0, expectedDates.length - 1) + .reverse() + .forEach(function (expected) { + const date = interval.prev(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + }); + }); + + test('should work for valid second sunday in May', function () { + const options = { + currentDate: new CronDate('2023-05-06T00:00:00.000Z'), + tz: 'UTC', + }; + const expectedDates = [ + new CronDate('2023-05-14T00:00:00.000Z'), + new CronDate('2024-05-12T00:00:00.000Z'), + new CronDate('2025-05-11T00:00:00.000Z'), + new CronDate('2026-05-10T00:00:00.000Z'), + new CronDate('2027-05-09T00:00:00.000Z'), + new CronDate('2028-05-14T00:00:00.000Z'), + ]; + + const interval = CronExpression.parse('0 0 0 ? MAY 0#2', options); + expectedDates.forEach(function (expected) { + const date = interval.next(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + expectedDates + .slice(0, expectedDates.length - 1) + .reverse() + .forEach(function (expected) { + const date = interval.prev(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + }); + + test('should work for valid second sunday at noon in May', function () { + const options = { + currentDate: new CronDate('2019-05-12T11:59:00.000'), + }; + const expected = new CronDate('2019-05-12T12:00:00.000'); + + const interval = CronExpression.parse('0 0 12 ? MAY 0#2', options); + const date = interval.next(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + + test('should work for valid second sunday at noon in May (UTC+3)', function () { + const options = { + currentDate: new CronDate('2019-05-12T11:59:00.000', 'Europe/Sofia'), + }; + const expected = new CronDate('2019-05-12T12:00:00.000', 'Europe/Sofia'); + + const interval = CronExpression.parse('0 0 12 ? MAY 0#2', options); + const date = interval.next(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + + test('should work with both dayOfMonth and nth occurrence of dayOfWeek', function () { + const options = { + currentDate: new CronDate('2019-04-01'), + }; + + const expectedDates = [ + new CronDate('2019-04-16'), + new CronDate('2019-04-17'), + new CronDate('2019-04-18'), + new CronDate('2019-05-15'), + new CronDate('2019-05-16'), + new CronDate('2019-05-18'), + ]; + + const interval = CronExpression.parse('0 0 0 16,18 * 3#3', options); + + expectedDates.forEach(function (expected) { + const date = interval.next(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + expectedDates + .slice(0, expectedDates.length - 1) + .reverse() + .forEach(function (expected) { + const date = interval.prev(); + cronDateTypedTest(date, (date) => expect(date.toISOString()).toEqual(expected.toISOString())); // 'Date matches' + }); + }); + + test('should error when passed invalid occurrence value', function () { + const expressions = [ + '0 0 0 ? * 1#', + '0 0 0 ? * 1#0', + '0 0 0 ? * 4#6', + '0 0 0 ? * 0##4', + ]; + expressions.forEach(function (expression) { + expect(() => CronExpression.parse(expression)).toThrow('Constraint error, invalid dayOfWeek occurrence number (#)'); + }); + + }); + + // The Quartz documentation says that if the # character is used then no other expression can be used in the dayOfWeek term: + // http://www.quartz-scheduler.org/api/2.3.0/index.html + test('cannot combine `-` range and # occurrence special characters', function () { + const expression = '0 0 0 ? * 2-4#2'; + expect(() => CronExpression.parse(expression)).toThrow('Constraint error, invalid dayOfWeek `#` and `-` special characters are incompatible'); + }); + + test('cannot combine `/` repeat interval and # occurrence special characters', function () { + const expression = '0 0 0 ? * 1/2#3'; + expect(() => CronExpression.parse(expression)).toThrow('Constraint error, invalid dayOfWeek `#` and `/` special characters are incompatible'); + }); + + test('cannot combine `,` list and # occurrence special characters', function () { + const expression = '0 0 0 ? * 0,6#4'; + expect(() => CronExpression.parse(expression)).toThrow('Constraint error, invalid dayOfWeek `#` and `,` special characters are incompatible'); + + }); + + it('should correctly determine if a given expression includes a Date (#153 and #299)', () => { + const expression = '* * 1-6 ? * *'; // 1am to 6am every day + const goodDate = new CronDate('2019-01-01T00:00:00.000'); + const badDate = new CronDate('2019-01-01T07:00:00.000'); + const interval = CronExpression.parse(expression); + expect(interval.includesDate(goodDate)).toBe(false); + expect(interval.includesDate(badDate)).toBe(false); + // TODO - add more tests cases + }); + + it('should correctly determine if a given expression includes a CronDate (#153 and #299)', () => { + const expression = '* * 1-6 ? * *'; // 1am to 6am every day + const goodDate = new CronDate('2019-01-01T01:00:00.000'); + const badDate = new CronDate('2019-01-01T07:00:00.000'); + const interval = CronExpression.parse(expression); + expect(interval.includesDate(goodDate)).toBe(true); + expect(interval.includesDate(badDate)).toBe(false); + // TODO - add more tests cases + }); + + it('should correctly handle */2 * * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '*/2 * * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 2; i < 120; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getSeconds()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 1/2 * * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '1/2 * * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 1; i < 120; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getSeconds()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 1-59/2 * * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '1-59/2 * * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 1; i < 120; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getSeconds()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 0 */2 * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '0 */2 * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 2; i < 120; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getMinutes()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 0 0/2 * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '0 0/2 * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 2; i < 120; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getMinutes()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 0 1/2 * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '0 1/2 * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 1; i < 121; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getMinutes()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 0 1-59/2 * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '0 1-59/2 * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 1; i < 121; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getMinutes()).toEqual(i % 60)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 0 1-40/2 * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + }; + const expression = '0 1-40/2 * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 1; i < 121; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getMinutes()).toEqual(i % 40)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 10/2 * * ? * * (#156)', () => { + const options = { + currentDate: new CronDate('Wed, 26 Dec 2012 01:00:00'), + strict: false, // this is for coverage + }; + const expression = '10/2 * * ? * *'; + const interval = CronExpression.parse(expression, options); + for (let i = 10; i < 60; i += 2) { + cronDateTypedTest(interval.next(), (date) => expect(date.getSeconds()).toEqual(i)); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should throw error for expression missing fields when in strict mode (#244)', () => { + const expression = '20 15 * *'; + expect(() => CronExpression.parse(expression, { strict: true })).toThrow(); + }); + + it('should correctly handle 0 12 1-31 * 1 strict (#284)', () => { + // At 12:00 on every day-of-month from 1 through 31 and on Monday. + const options = { + currentDate: new CronDate('Mon, 12 Sep 2022 14:00:00', 'UTC'), + strict: true, + }; + // 1 2 3 4 5 6 + const expression = '0 0 12 1-31 * 1'; + expect(() => CronExpression.parse(expression, options)).toThrow('Cannot use both dayOfMonth and dayOfWeek together in strict mode!'); + }); + + it('should correctly handle 0 12 1-31 * 1 non-strict (#284)', () => { + // At 12:00 on Monday. + const options = { + currentDate: new CronDate('Sun, 30 Oct 2022 14:00:00', 'UTC'), + }; + const expression = '0 12 1-31 * 1'; + const interval = CronExpression.parse(expression, options); + const expected = [31, 1, 2, 3, 4, 5, 6, 7]; + for (let i = 0; i < expected.length; i++) { + cronDateTypedTest(interval.next(), (date) => expect(date.getUTCDate()).toEqual(expected[i])); + } + expect(interval.toString()).toEqual(expression); + }); + + it('should correctly handle 0 12 * * 1 (#284)', () => { + // At 12:00 on Monday. + const options = { + currentDate: new CronDate('Sun, 30 Oct 2022 14:00:00', 'UTC'), + }; + const expression = '0 12 * * 1'; + const interval = CronExpression.parse(expression, options); + const expected = [31, 7, 14, 21, 28]; + for (let i = 0; i < expected.length; i++) { + cronDateTypedTest(interval.next(), (date) => expect(date.getUTCDate()).toEqual(expected[i])); + } + expect(interval.toString()).toEqual(expression); + }); + + describe('CronExpression - empty around comma tests', () => { + const options = { + tz: 'UTC', + }; + + test('both empty around comma', () => { + expect(() => { + CronExpression.parse('*/10 * * * * ,', options); + }).toThrow(new Error('Invalid list value format')); + }); + + test('one side empty around comma', () => { + expect(() => { + CronExpression.parse('*/10 * * * * ,2', options); + }).toThrow(new Error('Invalid list value format')); + }); + }); + + describe('CronExpression - mutation tests', () => { + test('Fields are exposed', () => { + const interval = CronExpression.parse('0 1 2 3 * 1-3,5'); + expect(interval).toBeTruthy(); + expect(interval.fields['dummy' as keyof CronFieldCollection]).toBeUndefined(); + expect(interval.fields.second.values).toEqual([0]); + expect(interval.fields.minute.values).toEqual([1]); + expect(interval.fields.hour.values).toEqual([2]); + expect(interval.fields.dayOfMonth.values).toEqual([3]); + expect(interval.fields.month.values).toEqual([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + ]); + expect(interval.fields.dayOfWeek.values).toEqual([1, 2, 3, 5]); + }); + }); + + describe('Leap Year', () => { + const cronDateTypedTest = (date: unknown, testFn: (date: CronDate) => void): void => { + if (!(date instanceof CronDate)) { + throw new Error('date is not instance of CronDate'); + } + testFn(date); + }; + + it('should handle leap year with starting date 0 0 29 2 *', function () { + const options = { + currentDate: new Date(2020, 0, 1), + }; + const interval = CronExpression.parse('0 0 29 2 *', options); + // let d; + for (let i = 0; i < 20; ++i) { + cronDateTypedTest(interval.next(), (date) => expect(date.getDate()).toEqual(29)); + } + }); + it('should handle leap year without starting date 0 0 29 2 *', function () { + // note if you use console.log to check the date, it will show yyyy-mm-dd hh:mm:ss where dd will likely be 28 + // as the date will log out in local time, not UTC + const interval = CronExpression.parse('0 0 29 2 *'); + for (let i = 0; i < 20; ++i) { + cronDateTypedTest(interval.next(), (date) => expect(date.getDate()).toEqual(29)); + } + }); + }); + + describe('prev date', () => { + test('prev should match correctly (issue #98) when milliseconds are greater than 0', function () { + const options = { + currentDate: new Date('2017-06-13T18:21:25.002Z'), + }; + + const interval = CronExpression.parse('*/5 * * * * *', options); + const prev = interval.prev(); + if (!(prev instanceof CronDate)) { + throw new Error('Expected prev to be an instance of CronDate'); + } + expect(prev.getSeconds()).toEqual(25); + }); + + test('prev should match correctly (issue #98) when milliseconds are equal to 0', function () { + const interval = CronExpression.parse('59 59 23 * * *', { + currentDate: new Date('2012-12-26 14:38:53'), + }); + + [25, 24, 23, 22].forEach(function (date) { + const prev = interval.prev(); + if (!(prev instanceof CronDate)) { + throw new Error('Expected prev to be an instance of CronDate'); + } + expect(prev.getFullYear()).toEqual(2012); + expect(prev.getMonth()).toEqual(11); + expect(prev.getDate()).toEqual(date); + expect(prev.getHours()).toEqual(23); + expect(prev.getMinutes()).toEqual(59); + expect(prev.getSeconds()).toEqual(59); + }); + }); + }); + + describe('timezones and DST tests', () => { + test('It works on DST start', () => { + const options: CronParseOptions = { + currentDate: '2016-03-27 02:00:01', + endDate: undefined, + tz: 'Europe/Athens', + }; + + let interval: CronExpression; + let date: CronDate | { value: CronDate; done: boolean }; + + interval = CronExpression.parse('0 * * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(4); // Due to DST start in Athens, 3 is skipped + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(5); // 5 AM + expect(date.getDate()).toEqual(27); // on the 27th + + interval = CronExpression.parse('30 2 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(30); // 30 Minutes + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(30); // 30 Minutes + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(28); // on the 28th + + interval = CronExpression.parse('0 3 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(4); // Due to DST start in Athens, 3 is skipped + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(3); // 3 on the 28th + expect(date.getDate()).toEqual(28); // on the 28th + + interval = CronExpression.parse('*/20 3 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(4); // Due to DST start in Athens, 3 is skipped + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(20); // 20 Minutes + expect(date.getHours()).toEqual(4); // Due to DST start in Athens, 3 is skipped + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(40); // 20 Minutes + expect(date.getHours()).toEqual(4); // Due to DST start in Athens, 3 is skipped + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(3); // 3 AM + expect(date.getDate()).toEqual(28); // on the 28th + + options.currentDate = '2016-03-27 00:00:01'; + + interval = CronExpression.parse('0 * 27 * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(1); // 1 AM + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(4); // 4 AM + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(5); // 5 AM + expect(date.getDate()).toEqual(27); // on the 27th + + options.currentDate = '2016-03-27 00:00:01'; + options.endDate = '2016-03-27 03:00:01'; + + interval = CronExpression.parse('0 * * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(1); // 1 AM + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(27); // on the 27th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); // 0 Minutes + expect(date.getHours()).toEqual(4); // 4 AM + expect(date.getDate()).toEqual(27); // on the 27th + + // Out of the timespan range + expect(() => interval.next()).toThrow(); + }); + + test('It works on DST end 2016-10-30 02:00:01 - 0 * * * *', function () { + const options: CronParseOptions = { + currentDate: '2016-10-30 02:00:01', + endDate: undefined, + tz: 'Europe/Athens', + }; + + const interval: CronExpression = CronExpression.parse('0 * * * *', options); + let date: CronDate | { value: CronDate; done: boolean }; + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(30); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); // Due to DST end in Athens (4-->3) + expect(date.getDate()).toEqual(30); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(4); + expect(date.getDate()).toEqual(30); + }); + + test('It works on DST end 2016-10-30 02:00:01 - 0 3 * * *', function () { + const options: CronParseOptions = { + currentDate: '2016-10-30 02:00:01', + endDate: undefined, + tz: 'Europe/Athens', + }; + + const interval: CronExpression = CronExpression.parse('0 3 * * *', options); + let date: CronDate | { value: CronDate; done: boolean }; + + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(30); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(31); + }); + + test('It works on DST end 2016-10-30 02:00:01 - */20 3 * * *', function () { + const options: CronParseOptions = { + currentDate: '2016-10-30 02:00:01', + endDate: undefined, + tz: 'Europe/Athens', + }; + + const interval: CronExpression = CronExpression.parse('*/20 3 * * *', options); + let date: CronDate | { value: CronDate; done: boolean }; + + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(30); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(20); + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(30); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(40); + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(30); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getMinutes()).toEqual(0); + expect(date.getHours()).toEqual(3); + expect(date.getDate()).toEqual(31); + }); + + test('It works on DST end 2016-10-30 00:00:01 - 0 * 30 * *', function () { + const options: CronParseOptions = { + currentDate: '2016-10-30 00:00:01', + endDate: undefined, + tz: 'Europe/Athens', + }; + + const interval: CronExpression = CronExpression.parse('0 * 30 * *', options); + let date: CronDate | { value: CronDate; done: boolean }; + + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(1); // 1 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); // 3 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); // 3 AM (DST end) + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(4); // 4 AM + expect(date.getDate()).toEqual(30); // on the 30th + }); + + test('It works on DST end 2016-10-30 00:00:01 - 0 * * * * DST offset via ISO 8601 format', function () { + // specify the DST offset via ISO 8601 format, as 3am is repeated + const options: CronParseOptions = { + currentDate: '2016-10-30 00:00:01', + endDate: '2016-10-30T03:00:01+03', + tz: 'Europe/Athens', + }; + + let interval: CronExpression = CronExpression.parse('0 * * * *', options); + let date: CronDate | { value: CronDate; done: boolean }; + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(1); // 1 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); // 3 AM + expect(date.getDate()).toEqual(30); // on the 30th + + // Out of the timespan range + expect(() => interval.next()).toThrow(); + + options.endDate = '2016-10-30 04:00:01'; + + interval = CronExpression.parse('0 * * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(1); // 1 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(2); // 2 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); // 3 AM + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(3); // 3 AM (DST end) + expect(date.getDate()).toEqual(30); // on the 30th + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(4); // 4 AM + expect(date.getDate()).toEqual(30); // on the 30th + + // Out of the timespan range + expect(() => interval.next()).toThrow(); + + options.currentDate = new Date('Sun Oct 29 2016 01:00:00 GMT+0200'); + options.endDate = undefined; + // options.tz = undefined; + + interval = CronExpression.parse('0 12 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(29); // on the 29th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + + options.currentDate = new Date('Sun Oct 29 2016 02:59:00 GMT+0200'); + + + interval = CronExpression.parse('0 12 * * *', options); + // t.ok(interval, 'Interval parsed'); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(29); // on the 29th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + + options.currentDate = new Date('Sun Oct 29 2016 02:59:59 GMT+0200'); + + interval = CronExpression.parse('0 12 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(29); // on the 29th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + + options.currentDate = new Date('Sun Oct 30 2016 01:00:00 GMT+0200'); + + interval = CronExpression.parse('0 12 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + + options.currentDate = new Date('Sun Oct 30 2016 01:59:00 GMT+0200'); + + interval = CronExpression.parse('0 12 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + + options.currentDate = new Date('Sun Oct 30 2016 01:59:59 GMT+0200'); + + interval = CronExpression.parse('0 12 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + + options.currentDate = new Date('Sun Oct 30 2016 02:59:00 GMT+0200'); + + interval = CronExpression.parse('0 12 * * *', options); + expect(interval).toBeTruthy(); + + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(30); // on the 30th + date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getHours()).toEqual(12); // 12 PM + expect(date.getDate()).toEqual(31); // on the 31st + }, 10000); + + test('it will work with #131 issue case', function () { + const options: CronParseOptions = { + tz: 'America/Sao_Paulo', + currentDate: new Date('Sun Oct 30 2018 02:59:00 GMT+0200'), + endDate: undefined, + }; + + const interval = CronExpression.parse('0 9 1 1 *', options); + let date = interval.next(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + + expect(date.getFullYear()).toEqual(2019); + expect(date.getDate()).toEqual(1); + expect(date.getMonth()).toEqual(0); + + date = interval.prev(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getFullYear()).toEqual(2018); + expect(date.getDate()).toEqual(1); + expect(date.getMonth()).toEqual(0); + + date = interval.prev(); + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getFullYear()).toEqual(2017); + expect(date.getDate()).toEqual(1); + expect(date.getMonth()).toEqual(0); + }, 10000); + + test('it will work with #137 issue case', function () { + const options: CronParseOptions = { + tz: 'America/New_York', + currentDate: new Date('10/28/2018'), + endDate: undefined, + }; + + const interval = CronExpression.parse('0 12 * * 3', options); + const date = interval.next(); + + if (!(date instanceof CronDate)) { + throw new Error('date is not a CronDate'); + } + expect(date.getFullYear()).toEqual(2018); + expect(date.getDate()).toEqual(31); + expect(date.getMonth()).toEqual(9); + + }, 10000); + }); + + describe('expression 31 of month', () => { + test('should correctly iterate through the next 20 occurrences', () => { + const options = { + currentDate: new CronDate('2100-10-31T00:00:00', 'UTC'), + }; + const expected = (new Date('2103-08-31T00:00:00-0000')).toString(); + + const interval = CronExpression.parse('0 0 31 * *', options); + let d: CronDate | { value: CronDate; done: boolean }; + let result = ''; + for (let i = 0; i < 20; ++i) { + d = interval.next(); + result = d.toString(); + } + expect(result).toBe(expected); + }); + }); + + describe('bugs', () => { + test('bug # ? - parse expression as UTC', () => { + try { + const options = { tz: 'UTC' }; + + const interval = CronExpression.parse('0 0 10 * * *', options); + + const date = interval.next(); + expect(date).toBeInstanceOf(CronDate); + if (date instanceof CronDate) { + expect(date.getUTCHours()).toEqual(10); + } + + const interval2 = CronExpression.parse('0 */5 * * * *', options); + + const date2 = interval2.next(); + const now = new Date(); + now.setMinutes(now.getMinutes() + 5 - (now.getMinutes() % 5)); + expect(date2).toBeInstanceOf(CronDate); + if (date2 instanceof CronDate) { + expect(date2.getHours()).toEqual(now.getUTCHours()); + } + + } catch (err) { + expect(err).toBeNull(); + } + }); + }); +}); diff --git a/tests/CronExpressionParser.test.ts b/tests/CronExpressionParser.test.ts new file mode 100644 index 00000000..a33ca729 --- /dev/null +++ b/tests/CronExpressionParser.test.ts @@ -0,0 +1,68 @@ +import { CronExpression, PredefinedExpressions } from '../src/index'; +import { CronExpressionParser } from '../src/CronExpressionParser'; + +describe('CronExpressionParser', () => { + describe('parse', () => { + it('should parse the expression correctly', () => { + const expression = '* * * * *'; + const cronExpression = CronExpressionParser.parse(expression); + expect(cronExpression).toBeInstanceOf(CronExpression); + }); + + it('should parse predefined expressions correctly', () => { + Object.entries(PredefinedExpressions).forEach(([key, value]) => { + const cronExpression = CronExpressionParser.parse(key); + expect(cronExpression.stringify(true)).toBe(value); + }); + }); + + it('should throw an error when using both dayOfMonth and dayOfWeek together in strict mode', () => { + const expression = '0 0 * * 1-5'; + expect(() => CronExpressionParser.parse(expression, { strict: true })).toThrow(); + }); + + it('should parse expressions with aliases correctly', () => { + const expression = '0 0 1 JAN SUN'; + const cronExpression = CronExpressionParser.parse(expression); + expect(cronExpression.stringify()).toBe('0 0 1 1 0'); + }); + + it('should throw an error when an invalid character is encountered', () => { + const expression = '0 0 1 JAN SUNDAY'; + expect(() => CronExpressionParser.parse(expression)).toThrow(); + }); + + it('should parse expressions with L correctly', () => { + const expression = '0 0 L * *'; + const cronExpression = CronExpressionParser.parse(expression); + expect(cronExpression.stringify()).toBe('0 0 L * *'); + }); + + it('should throw an error when an invalid range is encountered', () => { + const expression = '0 0 32 * *'; + expect(() => CronExpressionParser.parse(expression)).toThrow(); + }); + }); + + describe('stringify and debug', () => { + it('should return the correct string representation and debug object', () => { + const expression = '0 0 1,15 * 1'; + const cronExpression = CronExpressionParser.parse(expression); + expect(cronExpression.stringify()).toBe('0 0 1,15 * 1'); + }); + it('should handle complex expressions correctly', () => { + const expression = '*/15 10-20,22 1-7,15,31 1,3,5,7-11 1-5'; + const cronExpression = CronExpressionParser.parse(expression); + expect(cronExpression.stringify()).toBe('*/15 10-20,22 1-7,15,31 1,3,5,7,8-11 1-5'); + }); + + it('should throw an error when an invalid character is encountered in a specific field', () => { + expect(() => CronExpressionParser.parse('65 * * * *')).toThrow(); + expect(() => CronExpressionParser.parse('* 70 * * *')).toThrow(); + expect(() => CronExpressionParser.parse('* * 32 * *')).toThrow(); + expect(() => CronExpressionParser.parse('* * * 14 *')).toThrow(); + expect(() => CronExpressionParser.parse('* * * * 8')).toThrow(); + }); + }); +}); + diff --git a/tests/CronField.test.ts b/tests/CronField.test.ts new file mode 100644 index 00000000..d2f5d274 --- /dev/null +++ b/tests/CronField.test.ts @@ -0,0 +1,249 @@ +import { + CronDayOfMonth, + CronDayOfTheWeek, + CronFieldCollection, + CronHour, + CronMinute, + CronMonth, + CronSecond, + DayOfMonthRange, + DayOfWeekRange, + HourRange, + MonthRange, + SixtyRange, +} from '../src'; + +// var a = { +// 'second': { +// 'wildcard': false, +// 'values': [ +// 0 +// ] +// }, +// 'minute': { +// 'wildcard': false, +// 'values': [ +// 0, +// 30 +// ] +// }, +// 'hour': { +// 'wildcard': false, +// 'values': [ +// 9 +// ] +// }, +// 'dayOfMonth': { +// 'wildcard': false, +// 'values': [ +// 15 +// ] +// }, +// 'month': { +// 'wildcard': false, +// 'values': [ +// 1 +// ] +// }, +// 'dayOfWeek': { +// 'wildcard': false, +// 'values': [ +// 1, +// 2, +// 3, +// 4, +// 5 +// ] +// } +// }; + +describe('CronFields', () => { + // an array of numbers from 0 to 59 + const sixtyRange: number[] = Array.from(Array(60).keys()); + test('stringify() and debug() methods', () => { + const expected = { + second: { + wildcard: false, + values: sixtyRange, + }, + minute: { + wildcard: false, + values: [0, 30], + }, + hour: { + wildcard: false, + values: [9, 11, 13, 15, 17], + }, + dayOfMonth: { + wildcard: false, + values: [1, 15], + }, + month: { + wildcard: false, + values: [1, 3, 5, 7, 9, 11], + }, + dayOfWeek: { + wildcard: false, + values: [1, 2, 3, 4, 5], + }, + }; + const cronFields = new CronFieldCollection({ + second: new CronSecond(expected.second.values), + minute: new CronMinute(expected.minute.values), + hour: new CronHour(expected.hour.values), + dayOfMonth: new CronDayOfMonth(expected.dayOfMonth.values), + month: new CronMonth(expected.month.values), + dayOfWeek: new CronDayOfTheWeek(expected.dayOfWeek.values), + }); + + expect(cronFields.stringify()).toEqual('0,30 9-17/2 1,15 */2 1-5'); + expect(cronFields.stringify(true)).toEqual('* 0,30 9-17/2 1,15 */2 1-5'); + expect(cronFields.serialize()).toEqual(expected); + }); + + test('invalid constructor parameters', () => { + expect(() => { + + new CronFieldCollection({ + second: new CronSecond([0]), + minute: new CronMinute([0, 30]), + hour: new CronHour([9]), + dayOfMonth: new CronDayOfMonth([15]), + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + month: '*/2', // Should be an instance of CronMonth + dayOfWeek: new CronDayOfTheWeek([1, 2, 3, 4, 5]), + }); + }).toThrow('Validation error, month must be an instance of CronMonth when dayOfMonth is an instance of CronDayOfMonth'); + }); + + test('getters', () => { + const cronFields = new CronFieldCollection({ + second: new CronSecond([0]), + minute: new CronMinute([0, 30]), + hour: new CronHour([9]), + dayOfMonth: new CronDayOfMonth([15]), + month: new CronMonth([1]), + dayOfWeek: new CronDayOfTheWeek([1, 2, 3, 4, 5]), + }); + + expect(cronFields.second).toBeInstanceOf(CronSecond); + expect(cronFields.minute).toBeInstanceOf(CronMinute); + expect(cronFields.hour).toBeInstanceOf(CronHour); + expect(cronFields.dayOfMonth).toBeInstanceOf(CronDayOfMonth); + expect(cronFields.month).toBeInstanceOf(CronMonth); + expect(cronFields.dayOfWeek).toBeInstanceOf(CronDayOfTheWeek); + }); + + test('serialize', () => { + const cronFields = new CronFieldCollection({ + second: new CronSecond([0]), + minute: new CronMinute([0, 30]), + hour: new CronHour([9]), + dayOfMonth: new CronDayOfMonth([15]), + month: new CronMonth([1]), + dayOfWeek: new CronDayOfTheWeek([1, 2, 3, 4, 5]), + }); + + expect(cronFields.dayOfMonth.serialize()).toEqual({ + 'values': [15], + 'wildcard': false, + }); + }); + + describe('CronFieldCollection.compactField', () => { + test('compact field - empty array', () => { + const result = CronFieldCollection.compactField([]); + expect(result).toEqual([]); + }); + + test('compact field - single element array', () => { + const result = CronFieldCollection.compactField([1]); + expect(result).toEqual([{ start: 1, count: 1 }]); + }); + + test('compact field - 2 elements array', function () { + const result = CronFieldCollection.compactField([1, 2]); + expect(result).toEqual([{ start: 1, count: 1 }, { start: 2, count: 1 }]); + }); + + test('compact field - 2 elements array big step', function () { + const result = CronFieldCollection.compactField([1, 5]); + expect(result).toEqual([{ start: 1, count: 1 }, { start: 5, count: 1 }]); + }); + + + test('compact field - 3 elements array 1 step', function () { + const result = CronFieldCollection.compactField([1, 2, 3]); + expect(result).toEqual([{ start: 1, end: 3, count: 3, step: 1 }]); + }); + + + test('compact field - 3 elements array 1 step, dangling extra at end', function () { + const result = CronFieldCollection.compactField([1, 2, 3, 5]); + expect(result).toEqual([{ start: 1, end: 3, count: 3, step: 1 }, { start: 5, count: 1 }]); + }); + + + test('compact field - 3 elements array 1 step, dangling extra at end and beginning', function () { + const result = CronFieldCollection.compactField([1, 4, 5, 6, 9]); + expect(result).toEqual([ + { start: 1, count: 1 }, + { start: 4, end: 6, count: 3, step: 1 }, + { start: 9, count: 1 }, + ]); + }); + + + test('compact field - 2 ranges with dangling in the middle', function () { + + const result = CronFieldCollection.compactField([1, 2, 3, 6, 9, 11, 13]); + expect(result).toEqual([ + { start: 1, end: 3, count: 3, step: 1 }, + { start: 6, count: 1 }, + { start: 9, end: 13, count: 3, step: 2 }, + ]); + + }); + + test('compact field - with chars', function () { + + const result = CronFieldCollection.compactField(['L', 'W']); + expect(result).toEqual([ + { start: 'L', count: 1 }, + { start: 'W', count: 1 }, + ]); + + }); + + test('compact field - with chars and range', function () { + + const result = CronFieldCollection.compactField([1, 'L', 'W']); + expect(result).toEqual([ + { start: 1, count: 1 }, + { start: 'L', count: 1 }, + { start: 'W', count: 1 }, + ]); + + }); + + test('compact field - with chars and range (v2)', function () { + const result = CronFieldCollection.compactField([1, 2, 'L', 'W']); + expect(result).toEqual([ + { start: 1, count: 1 }, + { start: 2, count: 1 }, + { start: 'L', count: 1 }, + { start: 'W', count: 1 }, + ]); + }); + + test('compact field - with chars and range (v3)', () => { + const result = CronFieldCollection.compactField([1, 2, 3, 'L', 'W']); + expect(result).toEqual([ + { start: 1, end: 3, count: 3, step: 1 }, + { start: 'L', count: 1 }, + { start: 'W', count: 1 }, + ]); + }); + }); +}); diff --git a/tests/CronParser.test.ts b/tests/CronParser.test.ts new file mode 100644 index 00000000..5ce5e882 --- /dev/null +++ b/tests/CronParser.test.ts @@ -0,0 +1,626 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { CronParser, CronExpression, CronFieldCollection, CronFieldCollectionOptions, ParseStringResponse } from '../src'; +import { CronDate } from '../src/CronDate'; +import ErrnoException = NodeJS.ErrnoException; + +describe('CronParser', () => { + describe('parseExpression', () => { + it('should parse a valid cron expression', () => { + const expression = '*/5 * * * *'; + const result = CronParser.parseExpression(expression); + expect(result).toBeInstanceOf(CronExpression); + }); + + it('should throw an error for an invalid cron expression', () => { + const expression = 'invalid_expression'; + expect(() => CronParser.parseExpression(expression)).toThrow(); + }); + }); + + describe('fieldsToExpression', () => { + it('should create a CronExpression from fields', () => { + const fields = new CronFieldCollection({ + second: [0], + minute: [0], + hour: [0], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }); + const result = CronParser.fieldsToExpression(fields); + expect(result).toBeInstanceOf(CronExpression); + }); + }); + + describe('parseString', () => { + it('should parse a valid crontab string', () => { + const data = ` + # This is a comment + FOO=bar + */5 * * * * some-command + * * * * * another-command + # Another comment + `; + const result = CronParser.parseString(data); + expect(result.variables).toEqual({ FOO: 'bar' }); + expect(result.expressions).toHaveLength(2); + expect(result.errors).toEqual({}); + }); + + it('should include errors for invalid expressions', () => { + const data = ` + # This is a comment + FOO=bar + */5 * * * * some-command + invalid_expression another-command + `; + const result = CronParser.parseString(data); + expect(result.variables).toEqual({ FOO: 'bar' }); + expect(result.expressions).toHaveLength(1); + expect(result.errors).toHaveProperty('invalid_expression another-command'); + }); + }); + + describe('parseFile', () => { + const filePath = './test-crontab.txt'; + const crontabExamplePath = path.join(process.cwd(), 'tests/crontab.example'); + + beforeAll(() => { + const data = ` + # This is a comment + FOO=bar + */5 * * * * some-command + * * * * * another-command + * * * * * + `; + fs.writeFileSync(filePath, data); + }); + + afterAll(() => { + fs.unlinkSync(filePath); + }); + + it('should read and parse a valid crontab file', (done) => { + CronParser.parseFile(filePath, (err, data) => { + if (err) { + done(err); + return; + } + + expect(data).toHaveProperty('variables', { FOO: 'bar' }); + expect(data).toHaveProperty('expressions'); + expect(data?.expressions).toHaveLength(3); + expect(data).toHaveProperty('errors', {}); + done(); + }); + }); + + it('should return an error for a non-existing file', (done) => { + CronParser.parseFile('./nonexistent.txt', (err: ErrnoException | null, data?: ParseStringResponse | undefined) => { + if (err) { + expect(err.code).toBe('ENOENT'); + } else { + throw new Error('Expected an error'); + } + expect(data).toBeUndefined(); + done(); + }); + }); + + test('load crontab file', function () { + + CronParser.parseFile(crontabExamplePath, (err, result) => { + if (err) { + err.message = 'File read error: ' + err.message; + throw err; + } + if (!(result && 'variables' in result && 'expressions' in result && 'errors' in result)) { + throw new Error('result is not ParseStringResponse'); + } + // t.ok(result, 'Crontab parsed parsed'); + expect(Object.keys(result.variables).length).toEqual(2); // variables length matches + expect(Object.keys(result.errors).length).toEqual(0); // errors length matches + expect(result.expressions.length).toEqual(3); // expressions length matches + + // Parse expressions + let next; + expect(result.expressions[0].hasNext()).toEqual(true); + next = result.expressions[0].next(); + expect(next).toBeInstanceOf(CronDate); // first date + + next = result.expressions[1].next(); + expect(next).toBeInstanceOf(CronDate); // second date + + next = result.expressions[2].next(); + expect(next).toBeInstanceOf(CronDate); // third date + }); + }); + + test('no next date', function () { + const options = { + currentDate: new Date(2014, 0, 1), + endDate: new Date(2014, 0, 1), + }; + + const interval = CronParser.parseExpression('* * 2 * *', options); + expect(interval.hasNext()).toEqual(false); + }); + }); + + describe('test expressions with "L" last of flag', () => { + const testCasesLastWeekdayOfMonth = [ + { expression: '0 0 0 * * 1L', expectedDate: 27 }, + { expression: '0 0 0 * * 2L', expectedDate: 28 }, + { expression: '0 0 0 * * 3L', expectedDate: 29 }, + { expression: '0 0 0 * * 4L', expectedDate: 30 }, + { expression: '0 0 0 * * 5L', expectedDate: 24 }, + { expression: '0 0 0 * * 6L', expectedDate: 25 }, + { expression: '0 0 0 * * 0L', expectedDate: 26 }, + { expression: '0 0 0 * * 7L', expectedDate: 26 }, + ]; + + test('parse cron with last day in a month', () => { + const options = { + currentDate: new Date(2014, 0, 1), + endDate: new Date(2014, 10, 1), + }; + + const interval = CronParser.parseExpression('0 0 L * *', options); + expect(interval.hasNext()).toBe(true); + + for (let i = 0; i < 10; ++i) { + const next = interval.next(); + expect(next).toBeDefined(); + } + }); + + test('parse cron with last day in feb', () => { + const options = { + currentDate: new Date(2016, 0, 1), + endDate: new Date(2016, 10, 1), + }; + + const interval = CronParser.parseExpression('0 0 6-20/2,L 2 *', options); + expect(interval.hasNext()).toBe(true); + let next = null; + const items = 9; + let i = 0; + while (interval.hasNext()) { + next = interval.next(); + i += 1; + expect(next).toBeDefined(); + } + if (!(next instanceof CronDate)) { + throw new Error('next is not instance of CronDate'); + } + //leap year + expect(next.getDate()).toBe(29); + expect(i).toBe(items); + + }); + + test('parse cron with last day in feb', () => { + const options = { + currentDate: new Date(2014, 0, 1), + endDate: new Date(2014, 10, 1), + }; + + const interval = CronParser.parseExpression('0 0 1,3,6-10,L 2 *', options); + expect(interval.hasNext()).toBe(true); + let next = null; + while (interval.hasNext()) { + next = interval.next(); + expect(next).toBeDefined(); + } + if (!(next instanceof CronDate)) { + throw new Error('next is not instance of CronDate'); + } + //common year + expect(next.getDate()).toBe(28); + }); + + + testCasesLastWeekdayOfMonth.forEach(({ expression, expectedDate }) => { + const options = { + currentDate: new Date(2021, 8, 1), + endDate: new Date(2021, 11, 1), + }; + + test(`parse cron with last weekday of the month: ${expression}`, () => { + const interval = CronParser.parseExpression(expression, options); + + expect(interval.hasNext()).toBe(true); + + const next = interval.next(); + if (!(next instanceof CronDate)) { + throw new Error('next is not instance of CronDate'); + } + expect(next.getDate()).toBe(expectedDate); + }); + }); + + + test('parses expression that runs on both last monday and friday of the month', () => { + const options = { + currentDate: new Date(2021, 8, 1), + endDate: new Date(2021, 11, 1), + }; + const interval = CronParser.parseExpression('0 0 0 * * 1L,5L', options); + let next = interval.next(); + if (!(next instanceof CronDate)) { + throw new Error('next is not instance of CronDate'); + } + expect(next.getDate()).toBe(24); + next = interval.next(); + if (!(next instanceof CronDate)) { + throw new Error('next is not instance of CronDate'); + } + expect(next.getDate()).toBe(27); + }); + + test('parses expression that runs on both every monday and last friday of month', () => { + const options = { + currentDate: new Date(2021, 8, 1), + endDate: new Date(2021, 8, 30), + }; + const interval = CronParser.parseExpression('0 0 0 * * 1,5L', options); + + const dates = []; + + let isNotDone = true; + while (isNotDone) { + try { + const next = interval.next(); + if (!(next instanceof CronDate)) { + throw new Error('next is not instance of CronDate'); + } + dates.push(next.getDate()); + } catch (e) { + if (e instanceof Error && e.message !== 'Out of the timespan range') { + throw e; + } + isNotDone = false; + break; + } + } + + expect(dates).toEqual([6, 13, 20, 24, 27]); + }); + + test('throw new Errors to parse for invalid last weekday of month expression', () => { + expect(() => { + const interval = CronParser.parseExpression('0 0 0 * * L'); + interval.next(); + }).toThrow(); + }); + }); + + describe('stringify', () => { + it('should stringify cron expression all stars no seconds 0 * * * * *', function () { + const expected = '0 * * * * *'; + const interval = CronParser.parseExpression('* * * * *', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); // `expected: ${expected}, actual: ${str}`; + }); + + it('should stringify cron expression all stars no seconds (discard seconds)', function () { + + const expected = '* * * * *'; + const interval = CronParser.parseExpression('* * * * *', {}); + let str = interval.stringify(); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression all stars with seconds', function () { + const expected = '* * * * * *'; + const interval = CronParser.parseExpression('* * * * * *', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression all stars with seconds (discard seconds)', function () { + const expected = '* * * * *'; + const interval = CronParser.parseExpression('* * * * * *', {}); + let str = interval.stringify(); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression', function () { + const expected = '0 1,2,4-10,20-35/5,57 * * * *'; + const interval = CronParser.parseExpression('1,2,4-10,20-35/5,57 * * * *', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression (discard seconds)', function () { + const expected = '1,2,4-10,20-35/5,57 * * * *'; + const interval = CronParser.parseExpression('1,2,4-10,20-35/5,57 * * * *', {}); + let str = interval.stringify(); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with star range step', function () { + const expected = '0 */5 */2 * * *'; + const interval = CronParser.parseExpression('*/5 */2 */1 * *', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with multiple values and retain original value', function () { + const expected = '0 * * * * 1,3,5'; + const interval = CronParser.parseExpression('* * * * 1,3,5', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should correctly stringify cron expression * * * * 0,2,4 and convert value to range step', function () { + const expected = '0 * * * * 0-4/2'; + const interval = CronParser.parseExpression('* * * * 0,2,4', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should correctly stringify cron expression * * * * 0,2,4,6 convert value to */2 step', function () { + const expected = '0 * * * * */2'; + const interval = CronParser.parseExpression('* * * * 0,2,4,6', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should correctly stringify cron expression * * * * */2', function () { + const expected = '0 * * * * */2'; + const interval = CronParser.parseExpression('* * * * */2', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with star range step (discard seconds)', function () { + const expected = '*/5 */2 * * *'; + const interval = CronParser.parseExpression('*/5 */2 */1 * *', {}); + let str = interval.stringify(); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with semi range step', function () { + const expected = '0 5/5 * * * *'; + const interval = CronParser.parseExpression('5/5 * * * *', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with semi range step (discard seconds)', function () { + const expected = '5/5 * * * *'; + const interval = CronParser.parseExpression('5/5 * * * *', {}); + let str = interval.stringify(); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with L', function () { + const expected = '0 * * 1,4-10,L * *'; + const interval = CronParser.parseExpression('* * 1,4-10,L * *', {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with L (discard seconds)', function () { + const expected = '* * 1,4-10,L * *'; + const interval = CronParser.parseExpression('* * 1,4-10,L * *', {}); + let str = interval.stringify(); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with weekday L', function () { + const expected = '0 0 0 * * 1L'; + const interval = CronParser.parseExpression(expected, {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with multiple weekday, one of them with an L', function () { + const expected = '0 0 0 * * 4,6L'; + const interval = CronParser.parseExpression(expected, {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with multiple weekday, two of them with an L', function () { + const expected = '0 0 0 * * 1L,5L'; + const interval = CronParser.parseExpression(expected, {}); + let str = interval.stringify(true); + expect(str).toEqual(expected); + str = CronParser.fieldsToExpression(interval.fields).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with wildcard day of month and single month value', function () { + const expected = '* * * 4 *'; + const interval = CronParser.parseExpression(expected, {}); + const str = interval.stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with wildcard day of month and month range', function () { + const expected = '* * * 4-6 *'; + const interval = CronParser.parseExpression(expected, {}); + const str = interval.stringify(); + expect(str).toEqual(expected); + }); + it('should stringify cron expression with day of month range and single month value', function () { + const expected = '* * 1-25 4 *'; + const interval = CronParser.parseExpression(expected, {}); + const str = interval.stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify from fields out of order', function () { + const expected = '1-5 1 1 1 1 1'; + const str = CronParser.fieldsToExpression(new CronFieldCollection({ + second: [5, 2, 1, 4, 3], + minute: [1], + hour: [1], + month: [1], + dayOfMonth: [1], + dayOfWeek: [1], + })).stringify(true); + expect(str).toEqual(expected); + }); + + it('should stringify from fields out of order (discard seconds)', function () { + const expected = '1 1 1 1 1'; + const str = CronParser.fieldsToExpression(new CronFieldCollection({ + second: [5, 2, 1, 4, 3], + minute: [1], + hour: [1], + month: [1], + dayOfMonth: [1], + dayOfWeek: [1], + })).stringify(); + expect(str).toEqual(expected); + }); + + it('should stringify cron expression with extended day of week range (0,7)', function () { + const expected = '* * * * *'; + const interval = CronParser.parseExpression('* * * * *'); + + let str = CronParser.fieldsToExpression(new CronFieldCollection({ + second: interval.fields.second, + minute: interval.fields.minute, + hour: interval.fields.hour, + month: interval.fields.month, + dayOfMonth: interval.fields.dayOfMonth, + dayOfWeek: [0, 1, 2, 3, 4, 5, 6], + })).stringify(); + expect(str).toEqual(expected); + + str = CronParser.fieldsToExpression(new CronFieldCollection({ + second: interval.fields.second, + minute: interval.fields.minute, + hour: interval.fields.hour, + month: interval.fields.month, + dayOfMonth: interval.fields.dayOfMonth, + dayOfWeek: [0, 1, 2, 3, 4, 5, 6, 7], + })).stringify(); + expect(str).toEqual(expected); + }); + + it('should throw validation error - missing seconds', function () { + const input = { + minute: [1], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('Validation error, Field second is missing'); + }); + + it('should throw validation error - empty seconds', function () { + const input = { + second: [], + minute: [1], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('CronSecond Validation error, values contains no values'); + }); + + it('should throw validation error - missing values - empty array', function () { + const input = { + second: [1], + minute: [], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('CronMinute Validation error, values contains no values'); + }); + + it('should throw validation error - missing values', function () { + const input = { + second: [1], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('Validation error, Field minute is missing'); + }); + + it('should throw validation error - range error', function () { + const input = { + second: [-1, 1, 0], + minute: [1], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('CronSecond Validation error, got value -1 expected range 0-59'); + }); + + it('should throw validation error - bad chars error', function () { + const input = { + second: [0, 'R'], + minute: [1], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('CronSecond Validation error, got value R expected range 0-59'); + }); + + + it('should throw validation error - duplicates', function () { + const input = { + second: [1, 1], + minute: [1], + hour: [1], + dayOfMonth: [1], + month: [1], + dayOfWeek: [1], + }; + expect(() => CronParser.fieldsToExpression(new CronFieldCollection(input))).toThrowError('CronSecond Validation error, duplicate values found: 1'); + }); + }); +}); diff --git a/test/crontab.example b/tests/crontab.example similarity index 100% rename from test/crontab.example rename to tests/crontab.example diff --git a/tests/types.d.ts b/tests/types.d.ts new file mode 100644 index 00000000..11b85141 --- /dev/null +++ b/tests/types.d.ts @@ -0,0 +1,76 @@ +import { expectAssignable, expectNotAssignable } from 'tsd'; +import { DayOfMonthRange, DayOfWeekRange, HourRange, MonthRange, SixtyRange } from '../src'; +import { Months } from '../src/types'; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +expectAssignable(5); + + +// Assert that SixtyRange includes 0 and 59 +expectAssignable(0); +expectAssignable(59); + +// Assert that SixtyRange does not include -1 and 60 +expectNotAssignable(-1); +expectNotAssignable(60); + +// Assert that SixtyRange does not include 0.5 and 58.5 +expectNotAssignable(0.5); +expectNotAssignable(58.5); + + +// Assert that HourRange includes 0 and 23 +expectAssignable(0); +expectAssignable(23); + +// Assert that HourRange does not include -1 and 24 +expectNotAssignable(-1); +expectNotAssignable(24); + +// Assert that HourRange does not include 0.5 and 22.5 +expectNotAssignable(0.5); +expectNotAssignable(22.5); + +// Assert that DayOfMonthRange includes 1, 31, and 'L' +expectAssignable(1); +expectAssignable(31); +expectAssignable('L'); + +// Assert that DayOfMonthRange does not include 0 and 32 +expectNotAssignable(0); +expectNotAssignable(32); + +// Assert that DayOfMonthRange does not include 0.5 and 30.5 +expectNotAssignable(0.5); +expectNotAssignable(30.5); + +// Assert that DayOfMonthRange does not include 'l' +expectNotAssignable('l'); + +// Assert that MonthRange includes 1 and 12 +expectAssignable(1); +expectAssignable(12); + +// Assert that MonthRange does not include 0 and 13 +expectNotAssignable(0); +expectNotAssignable(13); + +// Assert that MonthRange does not include 0.5 and 11.5 +expectNotAssignable(0.5); +expectNotAssignable(11.5); + +// Assert that DayOfWeekRange includes 0 and 7 +expectAssignable(0); +expectAssignable(7); + +// Assert that DayOfWeekRange does not include -1 and 8 +expectNotAssignable(-1); +expectNotAssignable(8); + +// Assert that DayOfWeekRange does not include 0.5 and 6.5 +expectNotAssignable(0.5); +expectNotAssignable(6.5); + +// Assert the MonthsEnum +expectAssignable('jan'); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..89718451 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "commonjs", + "allowJs": true, + "declaration": true, + "strict": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "Node", + "outDir": "./dist", + "declarationDir": "./dist/types" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] +} + diff --git a/types/common.d.ts b/types/common.d.ts deleted file mode 100644 index a937304a..00000000 --- a/types/common.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -export type DateType = Date | number | string - -export interface CronDate { - addYear(): void - - addMonth(): void - - addDay(): void - - addHour(): void - - addMinute(): void - - addSecond(): void - - subtractYear(): void - - subtractMonth(): void - - subtractDay(): void - - subtractHour(): void - - subtractMinute(): void - - subtractSecond(): void - - getDate(): number - - getFullYear(): number - - getDay(): number - - getMonth(): number - - getHours(): number - - getMinutes(): number - - getSeconds(): number - - getMilliseconds(): number - - getTime(): number - - getUTCDate(): number - - getUTCFullYear(): number - - getUTCDay(): number - - getUTCMonth(): number - - getUTCHours(): number - - getUTCMinutes(): number - - getUTCSeconds(): number - - toISOString(): string - - toJSON(): string - - setDate(d: number): void - - setFullYear(y: number): void - - setDay(d: number): void - - setMonth(m: number): void - - setHours(h: number): void - - setMinutes(m: number): void - - setSeconds(s: number): void - - setMilliseconds(s: number): void - - getTime(): number - - toString(): string - - toDate(): Date - - isLastDayOfMonth(): boolean -} - -export interface ParserOptions { - currentDate?: DateType - startDate?: DateType - endDate?: DateType - utc?: boolean - tz?: string - nthDayOfWeek?: number - iterator?: IsIterable -} - -type IteratorResultOrCronDate = IsIterable extends true - ? IteratorResult - : CronDate; - -export interface ICronExpression { - readonly fields: CronFields; - - /** Find next suitable date */ - next(): IteratorResultOrCronDate - - /** Find previous suitable date */ - prev(): IteratorResultOrCronDate - - /** Check if next suitable date exists */ - hasNext(): boolean - - /** Check if previous suitable date exists */ - hasPrev(): boolean - - /** Iterate over expression iterator */ - iterate(steps: number, callback?: (item: IteratorResultOrCronDate, i: number) => void): IteratorResultOrCronDate[] - - /** Reset expression iterator state */ - reset(resetDate?: string | number | Date): void - - stringify(includeSeconds?: boolean): string -} - -export interface IStringResult { - variables: Record, - expressions: ICronExpression[], - errors: Record, -} diff --git a/types/index.d.ts b/types/index.d.ts deleted file mode 100644 index c771c481..00000000 --- a/types/index.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - CronDate, - DateType, - ICronExpression, - IStringResult, - ParserOptions, -} from './common'; - -type BuildRangeTuple = - Current["length"] extends Count - ? Current - : BuildRangeTuple<[number, ...Current], Count> -type RangeTuple = BuildRangeTuple<[], Count> -type BuildRange = - Accu["length"] extends End - ? Current - : BuildRange -type Range = BuildRange> - -export type SixtyRange = Range<0, 30> | Range<30, 60>; // Typescript restriction on recursion depth -export type HourRange = Range<0, 24>; -export type DayOfTheMonthRange = Range<1, 32> | 'L'; -export type MonthRange = Range<1, 13>; -export type DayOfTheWeekRange = Range<0, 8>; - -export type CronFields = { - readonly second: readonly SixtyRange[]; - readonly minute: readonly SixtyRange[]; - readonly hour: readonly HourRange[]; - readonly dayOfMonth: readonly DayOfTheMonthRange[]; - readonly month: readonly MonthRange[]; - readonly dayOfWeek: readonly DayOfTheWeekRange[]; -} - -export {ParserOptions, CronDate, DateType} -export type CronExpression = ICronExpression -export type StringResult = IStringResult - -export function parseExpression(expression: string, options?: ParserOptions): CronExpression; - -export function fieldsToExpression(fields: CronFields, options?: ParserOptions): CronExpression; - -export function parseFile(filePath: string, callback: (err: any, data: StringResult) => any): void; - -export function parseString(data: string): StringResult; diff --git a/types/ts3/index.d.ts b/types/ts3/index.d.ts deleted file mode 100644 index cd800887..00000000 --- a/types/ts3/index.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { - CronDate, - DateType, - ICronExpression, - IStringResult, - ParserOptions, -} from '../common'; - -export type CronFields = { - readonly second: readonly number[]; - readonly minute: readonly number[]; - readonly hour: readonly number[]; - readonly dayOfMonth: readonly (number | 'L')[]; - readonly month: readonly number[]; - readonly dayOfWeek: readonly number[]; -} - -export {ParserOptions, CronDate, DateType} -export type CronExpression = ICronExpression -export type StringResult = IStringResult - -export function parseExpression(expression: string, options?: ParserOptions): CronExpression; - -export function fieldsToExpression(fields: CronFields, options?: ParserOptions): CronExpression; - -export function parseFile(filePath: string, callback: (err: any, data: StringResult) => any): void; - -export function parseString(data: string): StringResult;