diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..ed362369 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +dist/ +coverage/ +webpack.config.js +.eslintrc.js +jest.config.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..66f39300 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,138 @@ +module.exports = { + env: { + browser: true, + node: true, + }, + extends: [ + 'prettier', + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + plugins: [ + 'eslint-plugin-import', + 'eslint-plugin-jsdoc', + '@typescript-eslint', + ], + root: true, + rules: { + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/member-delimiter-style': [ + 'error', + { + multiline: { + delimiter: 'none', + requireLast: true, + }, + singleline: { + delimiter: 'semi', + requireLast: false, + }, + }, + ], + '@typescript-eslint/naming-convention': 'off', + '@typescript-eslint/no-empty-function': 'error', + '@typescript-eslint/no-extra-semi': 'off', + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-unnecessary-qualifier': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-unused-expressions': [ + 'error', + { + allowTaggedTemplates: true, + allowShortCircuit: true, + }, + ], + '@typescript-eslint/prefer-namespace-keyword': 'error', + '@typescript-eslint/quotes': [ + 'error', + 'single', + { + avoidEscape: true, + }, + ], + '@typescript-eslint/semi': 'off', + '@typescript-eslint/triple-slash-reference': [ + 'error', + { + path: 'always', + types: 'prefer-import', + lib: 'always', + }, + ], + '@typescript-eslint/type-annotation-spacing': 'error', + '@typescript-eslint/unified-signatures': 'error', + 'brace-style': ['error', '1tbs'], + 'comma-dangle': 'off', + curly: ['error', 'multi-line'], + 'eol-last': 'error', + eqeqeq: ['error', 'smart'], + 'id-denylist': [ + 'error', + 'any', + 'Number', + 'String', + 'string', + 'Boolean', + 'boolean', + 'Undefined', + 'undefined', + ], + 'id-match': 'error', + 'import/no-deprecated': 'error', + 'jsdoc/check-alignment': 'error', + 'jsdoc/check-indentation': 'error', + 'jsdoc/newline-after-description': 'error', + 'new-parens': 'error', + 'no-caller': 'error', + 'no-case-declarations': 'off', + 'no-cond-assign': 'error', + 'no-constant-condition': 'error', + 'no-control-regex': 'error', + 'no-duplicate-imports': 'error', + 'no-empty': 'error', + 'no-empty-function': 'error', + 'no-eval': 'error', + 'no-fallthrough': 'error', + 'no-invalid-regexp': 'error', + 'no-multiple-empty-lines': 'error', + 'no-redeclare': 'error', + 'no-regex-spaces': 'error', + 'no-return-await': 'error', + 'no-throw-literal': 'error', + 'no-trailing-spaces': 'error', + 'no-underscore-dangle': 'off', + 'no-unexpected-multiline': 'off', + 'no-unused-expressions': 'off', + 'no-unused-labels': 'error', + 'no-var': 'error', + 'one-var': ['error', 'never'], + quotes: 'off', + radix: 'error', + semi: 'off', + 'space-in-parens': ['error', 'never'], + 'spaced-comment': [ + 'error', + 'always', + { + markers: ['/'], + }, + ], + 'use-isnan': 'error', + }, + overrides: [ + { + files: ['*.test.*'], + rules: { + '@typescript-eslint/no-unused-expressions': 'off', + }, + }, + ], +} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5fe1a8c6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [jakubroztocil, davidgoli] diff --git a/.github/issue_template.md b/.github/issue_template.md index 01d88ca4..cc75e8a7 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -4,12 +4,12 @@ Thank you for taking an interest in `rrule`! Please include the following in your report: - [ ] Verify that you've looked through existing issues for duplicates before - creating a new one + creating a new one - [ ] Code sample reproducing the issue. Be sure to include all input values you - are using such as the exact RRule string and dates. + are using such as the exact RRule string and dates. - [ ] Expected output - [ ] Actual output - [ ] The version of `rrule` you are using - [ ] Your operating system - [ ] Your local timezone (run `$ date` from the command line - of the machine showing the bug) + of the machine showing the bug) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 00000000..7cf0f750 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,22 @@ +name: Node CI +on: [push, pull_request] +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [14.x, 16.x, 18.x] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm install -g codecov nyc + - run: yarn install + - run: yarn build + - run: LANG=en_CA TZ=America/Vancouver yarn test + - run: LANG=en_US TZ=America/Los_Angeles yarn test + - run: LANG=sw_KE TZ=Africa/Nairobi yarn test + - run: LANG=en_KI TZ=Pacific/Kiritimati yarn test + - run: LANG=jp_JP TZ=Asia/Tokyo yarn test-ci + - run: nyc report --reporter=json && codecov -t ${{ secrets.CODECOV_REPO_TOKEN }} -f coverage/*.json diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..b946a2c5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn lint-staged \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..0e9e8106 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules/ +bower_components/ +.idea +.vscode +*.log +coverage +.nyc_output +dist/ \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000..f3c020ec --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "semi": false, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index cb25e1b3..00000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: node_js -node_js: - - "6" - - "8" - - "10" -script: - - npm install -g codecov nyc - - yarn build - - TZ=America/Vancouver yarn test - - TZ=America/Los_Angeles yarn test - - TZ=Africa/Nairobi yarn test - - TZ=Asia/Tokyo yarn test-ci -after_success: - - nyc report --reporter=json && codecov -f coverage/*.json -sudo: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 09f91e51..bfaae2ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,67 @@ ### Changelog +- 2.8.0 (2023-11-10) + + - Bugfixes: + - Don't minify `rrule.js` (minified version is still at `rrule.min.js`) ([#606](https://github.com/jkbrzt/rrule/pull/606)) + - Ignore tzid in NLP ([#528](https://github.com/jkbrzt/rrule/pull/528)) + - Remove unnecessary offset in daysBetween() ([#539](https://github.com/jkbrzt/rrule/pull/539)) + - Convert test suite from mocha to jest ([#605](https://github.com/jkbrzt/rrule/pull/605)) + - Export `ALL_WEEKDAYS` ([#591](https://github.com/jkbrzt/rrule/pull/591)) + - Support weekly by hour texts ([#590](https://github.com/jkbrzt/rrule/pull/590)) + +- 2.7.2 (2023-02-10) + + - Bugfixes: + - Fix rezonedDate ([#523](https://github.com/jakubroztocil/rrule/issues/523)) + - Export datetime ([#551](https://github.com/jakubroztocil/rrule/issues/551)) + - Fixes types for `before()` and `after()` ([#560](https://github.com/jakubroztocil/rrule/issues/560)) + - Update README (https://github.com/jakubroztocil/rrule/pull/543) + +- 2.7.1 (2022-07-10) + + - Internal: + - Upgrade build dependencies (#515) + - Migrate from tslint to eslint (#514) + - Fix precommit & lint warnings (#519) + - Fix invalid date formats in tests (#517) + - Remove default exports (#513) + - Point to esm correctly (#516) + +- 2.7.0 (2022-06-05) + + - Features: + - **BREAKING CHANGE** Removes default export in favor of named exports + - Removes Luxon dependency (#508) + +- 2.6.8 (2021-02-04) + + - Bugfixes: + - Solve circular imports (#444) + +- 2.6.6 (2020-08-23) + + - Bugfixes: + - Fixed broken npm package (#417) + +- 2.6.5 (2020-08-23) + - Bugfixes: + - `luxon`-less binary should not contain any `luxon` imports (#410) + - Fixed `toText` pluralization of “minutes“ (#415) +- 2.6.4 (2019-12-18) + - Bugfixes: + - Calculating series with unknown timezones will produce infinite loop (#320) + - Internal: + - Upgrade build dependencies +- 2.6.3 (2019-11-24) + - Features + - Allow passing `WeekdayStr` to `byweekday` like the types suggest is possible (#371) +- 2.6.2 (2019-06-08) + - Features + - Allow two digits for `BYDAY` (#330) + - Add a quick way to format `until` in `toText` (#313) + - Add support for parsing an rrule string without frequency (#339) + - Add getters for `rrules`, `exrules`, `rdates`, `exdates` (#347) - 2.6.0 (2019-01-03) - Bugfixes: - Fix sourcemap structure (#303) diff --git a/README.md b/README.md index 963ab7b6..344bcc5c 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ -rrule.js -======== +# rrule.js **Library for working with recurrence rules for calendar dates.** [![NPM version][npm-image]][npm-url] -[![Build Status][travis-image]][travis-url] +[![Build Status][ci-image]][ci-url] [![js-standard-style][js-standard-image]][js-standard-url] [![Downloads][downloads-image]][downloads-url] [![Gitter][gitter-image]][gitter-url] -[![codecov.io](http://codecov.io/github/jakubroztocil/rrule/coverage.svg?branch=master)](http://codecov.io/github/jakubroztocil/rrule?branch=master) +[![codecov.io](http://codecov.io/github/jkbrzt/rrule/coverage.svg?branch=master)](http://codecov.io/github/jkbrzt/rrule?branch=master) rrule.js supports recurrence rules as defined in the [iCalendar RFC](https://tools.ietf.org/html/rfc5545), with a few important @@ -18,12 +17,12 @@ RFC](https://tools.ietf.org/html/rfc5545), with a few important that, it supports parsing and serialization of recurrence rules from and to natural language. -* * * * * - +--- ### Quick Start -- [Demo app](http://jakubroztocil.github.io/rrule/) +- [Demo app](http://jkbrzt.github.io/rrule/) +- # For contributors and maintainers: the code for the demo app is only on `gh-pages` branch #### Client Side @@ -31,17 +30,6 @@ to natural language. $ yarn add rrule ``` -Alternatively, download manually: - - * [rrule.min.js](https://jakubroztocil.github.io/rrule/dist/es5/rrule.min.js) (bundled, minified) - * [rrule.js](https://jakubroztocil.github.io/rrule/dist/es5/rrule.js) (bundled, not minified) - * [rrule-tz.min.js](https://jakubroztocil.github.io/rrule/dist/es5/rrule-tz.min.js) (with timezone support, bundled, minified) - * [rrule-tz.js](https://jakubroztocil.github.io/rrule/dist/es5/rrule-tz.js) (with timezone support, bundled, not minified) - -```html - -``` - #### Server Side Includes optional TypeScript types @@ -55,16 +43,17 @@ $ npm install rrule #### Usage **RRule:** + ```es6 -import { RRule, RRuleSet, rrulestr } from 'rrule' +import { datetime, RRule, RRuleSet, rrulestr } from 'rrule' // Create a rule: const rule = new RRule({ freq: RRule.WEEKLY, interval: 5, byweekday: [RRule.MO, RRule.FR], - dtstart: new Date(Date.UTC(2012, 1, 1, 10, 30)), - until: new Date(Date.UTC(2012, 12, 31)) + dtstart: datetime(2012, 2, 1, 10, 30), + until: datetime(2012, 12, 31) }) // Get all occurrence dates (Date instances): @@ -80,7 +69,7 @@ rule.all() /* … */] // Get a slice: -rule.between(new Date(Date.UTC(2012, 7, 1)), new Date(Date.UTC(2012, 8, 1))) +rule.between(datetime(2012, 8, 1), datetime(2012, 9, 1)) ['2012-08-27T10:30:00.000Z', '2012-08-31T10:30:00.000Z'] @@ -96,68 +85,79 @@ rule.toText() ``` **RRuleSet:** + ```js const rruleSet = new RRuleSet() // Add a rrule to rruleSet -rruleSet.rrule(new RRule({ - freq: RRule.MONTHLY, - count: 5, - dtstart: new Date(Date.UTC(2012, 1, 1, 10, 30)) -})) +rruleSet.rrule( + new RRule({ + freq: RRule.MONTHLY, + count: 5, + dtstart: datetime(2012, 2, 1, 10, 30), + }) +) // Add a date to rruleSet -rruleSet.rdate(new Date(Date.UTC(2012, 6, 1, 10, 30))) +rruleSet.rdate(datetime(2012, 7, 1, 10, 30)) // Add another date to rruleSet -rruleSet.rdate(new Date(Date.UTC(2012, 6, 2, 10, 30))) +rruleSet.rdate(datetime(2012, 7, 2, 10, 30)) // Add a exclusion rrule to rruleSet -rruleSet.exrule(new r.RRule({ - freq: RRule.MONTHLY, - count: 2, - dtstart: new Date(Date.UTC(2012, 2, 1, 10, 30)) -})) +rruleSet.exrule( + new RRule({ + freq: RRule.MONTHLY, + count: 2, + dtstart: datetime(2012, 3, 1, 10, 30), + }) +) // Add a exclusion date to rruleSet -rruleSet.exdate(new Date(Date.UTC(2012, 5, 1, 10, 30))) +rruleSet.exdate(datetime(2012, 5, 1, 10, 30)) // Get all occurrence dates (Date instances): -rruleSet.all() -[ '2012-02-01T10:30:00.000Z', +rruleSet.all()[ + ('2012-02-01T10:30:00.000Z', '2012-05-01T10:30:00.000Z', '2012-07-01T10:30:00.000Z', - '2012-07-02T10:30:00.000Z' ] + '2012-07-02T10:30:00.000Z') +] // Get a slice: -rruleSet.between(new Date(Date.UTC(2012, 2, 1)), new Date(Date.UTC(2012, 6, 2))) -[ '2012-05-01T10:30:00.000Z', '2012-07-01T10:30:00.000Z' ] +rruleSet.between(datetime(2012, 2, 1), datetime(2012, 6, 2))[ + ('2012-05-01T10:30:00.000Z', '2012-07-01T10:30:00.000Z') +] - - // To string -rruleSet.valueOf() -['DTSTART:20120201T023000Z', - 'RRULE:FREQ=MONTHLY;COUNT=5', - 'RDATE:20120701T023000Z,20120702T023000Z', - 'EXRULE:FREQ=MONTHLY;COUNT=2', - 'EXDATE:20120601T023000Z'] +// To string +rruleSet.valueOf()[ + ('DTSTART:20120201T023000Z', + 'RRULE:FREQ=MONTHLY;COUNT=5', + 'RDATE:20120701T023000Z,20120702T023000Z', + 'EXRULE:FREQ=MONTHLY;COUNT=2', + 'EXDATE:20120601T023000Z') +] // To string rruleSet.toString() -'["DTSTART:20120201T023000Z","RRULE:FREQ=MONTHLY;COUNT=5","RDATE:20120701T023000Z,20120702T023000Z","EXRULE:FREQ=MONTHLY;COUNT=2","EXDATE:20120601T023000Z"]' +;('["DTSTART:20120201T023000Z","RRULE:FREQ=MONTHLY;COUNT=5","RDATE:20120701T023000Z,20120702T023000Z","EXRULE:FREQ=MONTHLY;COUNT=2","EXDATE:20120601T023000Z"]') ``` **rrulestr:** + ```js // Parse a RRule string, return a RRule object rrulestr('DTSTART:20120201T023000Z\nRRULE:FREQ=MONTHLY;COUNT=5') // Parse a RRule string, return a RRuleSet object -rrulestr('DTSTART:20120201T023000Z\nRRULE:FREQ=MONTHLY;COUNT=5', {forceset: true}) +rrulestr('DTSTART:20120201T023000Z\nRRULE:FREQ=MONTHLY;COUNT=5', { + forceset: true, +}) // Parse a RRuleSet string, return a RRuleSet object -rrulestr('DTSTART:20120201T023000Z\nRRULE:FREQ=MONTHLY;COUNT=5\nRDATE:20120701T023000Z,20120702T023000Z\nEXRULE:FREQ=MONTHLY;COUNT=2\nEXDATE:20120601T023000Z') - +rrulestr( + 'DTSTART:20120201T023000Z\nRRULE:FREQ=MONTHLY;COUNT=5\nRDATE:20120701T023000Z,20120702T023000Z\nEXRULE:FREQ=MONTHLY;COUNT=2\nEXDATE:20120601T023000Z' +) ``` ### Important: Use UTC dates @@ -166,9 +166,10 @@ Dates in JavaScript are tricky. `RRule` tries to support as much flexibility as By default, `RRule` deals in ["floating" times or UTC timezones](https://tools.ietf.org/html/rfc5545#section-3.2.19). If you want results in a specific timezone, `RRule` also provides [timezone support](#timezone-support). Either way, JavaScript's built-in "timezone" offset tends to just get in the way, so this library simply doesn't use it at all. All times are returned with zero offset, as though it didn't exist in JavaScript. -**The bottom line is the returned "UTC" dates are always meant to be interpreted as dates in your local timezone. This may mean you have to do additional conversion to get the "correct" local time with offset applied.** +**THE BOTTOM LINE: Returned "UTC" dates are always meant to be interpreted as dates in your local timezone. This may mean you have to do additional conversion to get the "correct" local time with offset applied.** -For this reason, it is highly recommended to use timestamps in UTC eg. `new Date(Date.UTC(...))`. Returned dates will likewise be in UTC (except on Chrome, which always returns dates with a timezone offset). +For this reason, it is highly recommended to use timestamps in UTC eg. `new Date(Date.UTC(...))`. Returned dates will likewise be in UTC (except on Chrome, which always returns dates with a timezone offset). It's recommended to use the provided `datetime()` helper, which +creates dates in the correct format using a 1-based month. For example: @@ -192,7 +193,7 @@ date.getUTCDate() // --> 1 date.getUTCHours() // --> 18 ``` -If you want to get the same times in true UTC, you may do so eg. using Luxon: +If you want to get the same times in true UTC, you may do so (e.g., using [Luxon](https://moment.github.io/luxon/#/)): ```ts rule.all().map(date => @@ -211,27 +212,27 @@ DateTime.fromJSDate(date) For more examples see [python-dateutil](http://labix.org/python-dateutil/) documentation. -* * * * * +--- ### Timezone Support -Optionally, it also supports use of the `TZID` parameter in the -[RFC](https://tools.ietf.org/html/rfc5545#section-3.2.19) -when the [Luxon](https://github.com/moment/luxon) library is provided. The -[specification](https://moment.github.io/luxon/docs/manual/zones.html#specifying-a-zone) -and [support matrix](https://moment.github.io/luxon/docs/manual/matrix.html) for Luxon apply. +Rrule also supports use of the `TZID` parameter in the +[RFC](https://tools.ietf.org/html/rfc5545#section-3.2.19) using the +[Intl API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl). +Support matrix for the Intl API applies. If you need to support additional environments, +please consider using a [polyfill](https://formatjs.io/docs/polyfills/). Example with `TZID`: ```js new RRule({ - dtstart: new Date(Date.UTC(2018, 1, 1, 10, 30)), + dtstart: datetime(2018, 2, 1, 10, 30), count: 1, - tzid: 'Asia/Tokyo' -}).all() - -// assuming the system timezone is set to America/Los_Angeles, you get: -[ '2018-01-31T17:30:00.000Z' ] + tzid: 'Asia/Tokyo', +}).all()[ + // assuming the system timezone is set to America/Los_Angeles, you get: + '2018-01-31T17:30:00.000Z' +] // which is the time in Los Angeles when it's 2018-02-01T10:30:00 in Tokyo. ``` @@ -243,19 +244,15 @@ represented in UTC to avoid unexpected timezone offsets being applied, for examp new RRule({ freq: RRule.MONTHLY, dtstart: new Date(2018, 1, 1, 10, 30), - until: new Date(2018, 2, 31) -}).all() - -[ '2018-02-01T18:30:00.000Z' ] + until: new Date(2018, 2, 31), +}).all()[('2018-02-01T18:30:00.000Z', '2018-03-01T18:30:00.000Z')] // RIGHT: Will produce dates with recurrences at the correct time new RRule({ freq: RRule.MONTHLY, - dtstart: new Date(Date.UTC(2018, 1, 1, 10, 30)), - until: new Date(Date.UTC(2018, 2, 31)) -}).all() - -[ '2018-02-01T10:30:00.000Z' ] + dtstart: datetime(2018, 2, 1, 10, 30), + until: datetime(2018, 3, 31), +}).all()[('2018-02-01T10:30:00.000Z', '2018-03-01T10:30:00.000Z')] ``` ### API @@ -276,7 +273,7 @@ iCalendar RFC. Only `freq` is required. Option Description - + freq @@ -336,8 +333,7 @@ iCalendar RFC. Only `freq` is required. tzid - If given, this must be a string supported - by Luxon, and the Luxon library must be provided. See + If given, this must be a IANA string recognized by the Intl API. See discussion under Timezone support. @@ -430,7 +426,6 @@ iCalendar RFC. Only `freq` is required. - `noCache`: Set to `true` to disable caching of results. If you will use the same rrule instance multiple times, enabling caching will improve the performance considerably. Enabled by default. @@ -438,9 +433,7 @@ performance considerably. Enabled by default. See also [python-dateutil](http://labix.org/python-dateutil/) documentation. - -* * * * * - +--- #### Instance properties @@ -456,9 +449,7 @@ documentation. the constructor. - -* * * * * - +--- #### Occurrence Retrieval Methods @@ -476,21 +467,22 @@ returns `true`. If a `false`-y value is returned, `date` isn't added to the result and the iteration is interrupted (possibly prematurely). ```javascript -rule.all() -[ '2012-02-01T10:30:00.000Z', +rule.all()[ + ('2012-02-01T10:30:00.000Z', '2012-05-01T10:30:00.000Z', '2012-07-01T10:30:00.000Z', - '2012-07-02T10:30:00.000Z' ] + '2012-07-02T10:30:00.000Z') +] -rule.all(function (date, i){return i < 2}) -[ '2012-02-01T10:30:00.000Z', - '2012-05-01T10:30:00.000Z' ] +rule.all(function (date, i) { + return i < 2 +})[('2012-02-01T10:30:00.000Z', '2012-05-01T10:30:00.000Z')] ``` ##### `RRule.prototype.between(after, before, inc=false [, iterator])` Returns all the occurrences of the rrule between `after` and `before`. -The inc keyword defines what happens if `after` and/or `before` are +The `inc` keyword defines what happens if `after` and/or `before` are themselves occurrences. With `inc == true`, they will be included in the list, if they are found in the recurrence set. @@ -498,9 +490,9 @@ Optional `iterator` has the same function as it has with `RRule.prototype.all()`. ```javascript -rule.between(new Date(Date.UTC(2012, 7, 1)), new Date(Date.UTC(2012, 8, 1))) -['2012-08-27T10:30:00.000Z', - '2012-08-31T10:30:00.000Z'] +rule.between(datetime(2012, 8, 1), datetime(2012, 9, 1))[ + ('2012-08-27T10:30:00.000Z', '2012-08-31T10:30:00.000Z') +] ``` ##### `RRule.prototype.before(dt, inc=false)` @@ -509,7 +501,6 @@ Returns the last recurrence before the given `Date` instance. The `inc` argument defines what happens if `dt` is an occurrence. With `inc == true`, if `dt` itself is an occurrence, it will be returned. - ##### `RRule.prototype.after(dt, inc=false)` Returns the first recurrence @@ -520,9 +511,7 @@ occurrence, it will be returned. See also [python-dateutil](http://labix.org/python-dateutil/) documentation. - -* * * * * - +--- #### iCalendar RFC String Methods @@ -533,7 +522,7 @@ Only properties explicitly specified in `options` are included: ```javascript rule.toString() -"DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;INTERVAL=5;UNTIL=20130130T230000Z;BYDAY=MO,FR" +;('DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;INTERVAL=5;UNTIL=20130130T230000Z;BYDAY=MO,FR') rule.toString() == RRule.optionsToString(rule.origOptions) true @@ -547,14 +536,14 @@ Converts `options` to iCalendar RFC `RRULE` string: // Get full a string representation of all options, // including the default and inferred ones. RRule.optionsToString(rule.options) -"DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;INTERVAL=5;WKST=0;UNTIL=20130130T230000Z;BYDAY=MO,FR;BYHOUR=10;BYMINUTE=30;BYSECOND=0" +;('DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;INTERVAL=5;WKST=0;UNTIL=20130130T230000Z;BYDAY=MO,FR;BYHOUR=10;BYMINUTE=30;BYSECOND=0') // Cherry-pick only some options from an rrule: RRule.optionsToString({ freq: rule.options.freq, - dtstart: rule.options.dtstart + dtstart: rule.options.dtstart, }) -"DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;" +;('DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;') ``` ##### `RRule.fromString(rfcString)` @@ -562,10 +551,12 @@ RRule.optionsToString({ Constructs an `RRule` instance from a complete `rfcString`: ```javascript -var rule = RRule.fromString("DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;") +var rule = RRule.fromString('DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;') // This is equivalent -var rule = new RRule(RRule.parseString("DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY")) +var rule = new RRule( + RRule.parseString('DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY') +) ``` ##### `RRule.parseString(rfcString)` @@ -574,16 +565,16 @@ Only parse RFC string and return `options`. ```javascript var options = RRule.parseString('FREQ=DAILY;INTERVAL=6') -options.dtstart = new Date(Date.UTC(2000, 1, 1)) +options.dtstart = datetime(2000, 2, 1) var rule = new RRule(options) ``` -* * * * * +--- #### Natural Language Text Methods -These methods provide an incomplete support for text–`RRule` and -`RRule`–text conversion. You should test them with your input to see +These methods provide an incomplete support for text→`RRule` and +`RRule`→text conversion. You should test them with your input to see whether the result is acceptable. ##### `RRule.prototype.toText([gettext, [language]])` @@ -596,10 +587,10 @@ used (defaults to `rrule/nlp.js:ENGLISH`). ```javascript var rule = new RRule({ freq: RRule.WEEKLY, - count: 23 + count: 23, }) rule.toText() -"every week for 23 times" +;('every week for 23 times') ``` ##### `RRule.prototype.isFullyConvertibleToText()` @@ -622,47 +613,50 @@ Parse `text` into `options`: ```javascript options = RRule.parseText('every day for 3 times') // {freq: 3, count: "3"} -options.dtstart = new Date(Date.UTC(2000, 1, 1)) +options.dtstart = datetime(2000, 2, 1) var rule = new RRule(options) ``` - -* * * * * +--- #### `RRuleSet` Constructor ```javascript -new RRuleSet([noCache=false]) +new RRuleSet([(noCache = false)]) ``` -The RRuleSet instance allows more complex recurrence setups, mixing multiple - rules, dates, exclusion rules, and exclusion dates. +The `RRuleSet` instance allows more complex recurrence setups, mixing multiple +rules, dates, exclusion rules, and exclusion dates. Default `noCache` argument is `false`, caching of results will be enabled, improving performance of multiple queries considerably. ##### `RRuleSet.prototype.rrule(rrule)` -Include the given rrule instance in the recurrence set generation. +Include the given `rrule` instance in the recurrence set generation. ##### `RRuleSet.prototype.rdate(dt)` -Include the given datetime instance in the recurrence set generation. + +Include the given datetime instance `dt` in the recurrence set generation. ##### `RRuleSet.prototype.exrule(rrule)` -Include the given rrule instance in the recurrence set exclusion list. Dates + +Include the given `rrule` instance in the recurrence set exclusion list. Dates which are part of the given recurrence rules will not be generated, even if -some inclusive rrule or rdate matches them. NOTE: EXRULE has been (deprecated +some inclusive rrule or rdate matches them. **NOTE:** `EXRULE` has been (deprecated in RFC 5545)[https://icalendar.org/iCalendar-RFC-5545/a-3-deprecated-features.html] -and does not support a DTSTART property. +and does not support a `DTSTART` property. ##### `RRuleSet.prototype.exdate(dt)` -Include the given datetime instance in the recurrence set exclusion list. Dates -included that way will not be generated, even if some inclusive rrule or -rdate matches them. + +Include the given datetime instance `dt` in the recurrence set exclusion list. Dates +included that way will not be generated, even if some inclusive `rrule` or +`rdate` matches them. ##### `RRuleSet.prototype.tzid(tz?)` + Sets or overrides the timezone identifier. Useful if there are no rrules in this -RRuleSet and thus no DTSTART. +`RRuleSet` and thus no `DTSTART`. ##### `RRuleSet.prototype.all([iterator])` @@ -696,7 +690,7 @@ Get list of included datetimes in this recurrence set. Get list of excluded datetimes in this recurrence set. -* * * * * +--- #### `rrulestr` Function @@ -706,69 +700,91 @@ rrulestr(rruleStr[, options]) The `rrulestr` function is a parser for RFC-like syntaxes. The string passed as parameter may be a multiple line string, a single line string, or just the -RRULE property value. +`RRULE` property value. Additionally, it accepts the following keyword arguments: -`cache` -If True, the rruleset or rrule created instance will cache its results. -Default is not to cache. - -`dtstart` -If given, it must be a datetime instance that will be used when no DTSTART -property is found in the parsed string. If it is not given, and the property -is not found, datetime.now() will be used instead. - -`unfold` -If set to True, lines will be unfolded following the RFC specification. It -defaults to False, meaning that spaces before every line will be stripped. - -`forceset` -If set to True a rruleset instance will be returned, even if only a single rule -is found. The default is to return an rrule if possible, and an rruleset if necessary. - -`compatible` -If set to True, the parser will operate in RFC-compatible mode. Right now it -means that unfold will be turned on, and if a DTSTART is found, it will be -considered the first recurrence instance, as documented in the RFC. +
-`tzid` -If given, it must be a string that will be used when no `TZID` property is found -in the parsed string. If it is not given, and the property is not found, `'UTC'` -will be used by default. +
cache
+
+If true, the rruleset or rrule created instance +will cache its results. +Default is not to cache. +
+ +
dtstart
+
+If given, it must be a datetime instance that will be used when no +DTSTART property is found in the parsed string. +If it is not given, and the property is not found, +datetime.now() will be used instead. +
+ +
unfold
+
+If set to true, lines will be unfolded following the RFC specification. +It defaults to false, meaning that spaces before every line will be stripped. +
+ +
forceset
+
+If set to true, an rruleset instance will be returned, +even if only a single rule is found. +The default is to return an rrule if possible, and +an rruleset if necessary. +
+ +
compatible
+
+If set to true, the parser will operate in RFC-compatible mode. +Right now it means that unfold will be turned on, and if a DTSTART is found, +it will be considered the first recurrence instance, as documented in the RFC. +
+ +
tzid
+
+If given, it must be a string that will be used when no TZID +property is found in the parsed string. +If it is not given, and the property is not found, 'UTC' will +be used by default. +
+
-* * * * * +--- ### Differences From iCalendar RFC -* `RRule` has no `byday` keyword. The equivalent keyword has been replaced by -the `byweekday` keyword, to remove the ambiguity present in the original -keyword. -* Unlike documented in the RFC, the starting datetime, `dtstart`, is -not the first recurrence instance, unless it does fit in the specified rules. -This is in part due to this project being a port of -[python-dateutil](https://labix.org/python-dateutil#head-a65103993a21b717f6702063f3717e6e75b4ba66), -which has the same non-compliant functionality. Note that you can get the -original behavior by using a `RRuleSet` and adding the `dtstart` as an `rdate`. +- `RRule` has no `byday` keyword. The equivalent keyword has been replaced by + the `byweekday` keyword, to remove the ambiguity present in the original + keyword. +- Unlike documented in the RFC, the starting datetime, `dtstart`, is + not the first recurrence instance, unless it does fit in the specified rules. + This is in part due to this project being a port of + [python-dateutil](https://labix.org/python-dateutil#head-a65103993a21b717f6702063f3717e6e75b4ba66), + which has the same non-compliant functionality. Note that you can get the + original behavior by using a `RRuleSet` and adding the `dtstart` as an `rdate`. ```javascript var rruleSet = new RRuleSet() -var start = new Date(Date.UTC(2012, 1, 1, 10, 30)) +var start = datetime(2012, 2, 1, 10, 30) // Add a rrule to rruleSet -rruleSet.rrule(new RRule({ - freq: RRule.MONTHLY, - count: 5, - dtstart: start -})) +rruleSet.rrule( + new RRule({ + freq: RRule.MONTHLY, + count: 5, + dtstart: start, + }) +) // Add a date to rruleSet rruleSet.rdate(start) ``` -* Unlike documented in the RFC, every keyword is valid on every frequency (the -RFC documents that `byweekno` is only valid on yearly frequencies, for example). +- Unlike documented in the RFC, every keyword is valid on every frequency. (The + RFC documents that `byweekno` is only valid on yearly frequencies, for example.) ### Development @@ -794,34 +810,28 @@ $ yarn build #### Authors -* [Jakub Roztocil](http://roztocil.co/) - ([@jakubroztocil](http://twitter.com/jakubroztocil)) -* Lars Schöning ([@lyschoening](http://twitter.com/lyschoening)) -* David Golightly ([@davigoli](http://twitter.com/davigoli)) +- [Jakub Roztocil](http://roztocil.co) + ([@jkbrzt](http://twitter.com/jkbrzt)) +- Lars Schöning ([@lyschoening](http://twitter.com/lyschoening)) +- David Golightly ([@davigoli](http://twitter.com/davigoli)) Python `dateutil` is written by [Gustavo -Niemeyer](http://niemeyer.net/). +Niemeyer](http://niemeyer.net). -See [LICENCE](https://github.com/jakubroztocil/rrule/blob/master/LICENCE) for +See [LICENCE](https://github.com/jkbrzt/rrule/blob/master/LICENCE) for more details. [npm-url]: https://npmjs.org/package/rrule [npm-image]: http://img.shields.io/npm/v/rrule.svg - -[travis-url]: https://travis-ci.org/jakubroztocil/rrule -[travis-image]: http://img.shields.io/travis/jakubroztocil/rrule.svg - +[ci-url]: https://github.com/jkbrzt/rrule/actions +[ci-image]: https://github.com/jkbrzt/rrule/workflows/Node%20CI/badge.svg [downloads-url]: https://npmjs.org/package/rrule [downloads-image]: http://img.shields.io/npm/dm/rrule.svg?style=flat-square - [js-standard-url]: https://github.com/feross/standard [js-standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat - [gitter-url]: https://gitter.im/rrule-js/Lobby [gitter-image]: https://img.shields.io/gitter/room/nwjs/nw.js.svg - #### Related projects -* https://rrules.com/ — RESTful API to get back occurrences of RRULEs that conform to RFC 5545. - +- https://rrules.com — RESTful API to get back occurrences of RRULEs that conform to RFC 5545. diff --git a/bower.json b/bower.json index 01698de1..c2b8a50e 100644 --- a/bower.json +++ b/bower.json @@ -3,27 +3,20 @@ "version": "2.3.0", "description": "JavaScript library for working with recurrence rules for calendar dates.", "homepage": "http://jakubroztocil.github.io/rrule/", - "keywords": [ - "dates", - "recurrences", - "calendar", - "icalendar", - "rfc" - ], + "keywords": ["dates", "recurrences", "calendar", "icalendar", "rfc"], "repository": { "type": "git", "url": "git://github.com/jakubroztocil/rrule.git" }, - "authors": [{ - "name": "Jakub Roztočil", - "homepage": "http://subtleapps.com/" - }, { - "name": "Lars Schöning" - }], + "authors": [ + { + "name": "Jakub Roztočil", + "homepage": "http://subtleapps.com/" + }, + { + "name": "Lars Schöning" + } + ], "main": "dist/es5/rrule.js", - "ignore": [ - "**/.*", - "node_modules", - "components" - ] + "ignore": ["**/.*", "node_modules", "components"] } diff --git a/codecov.yml b/codecov.yml index 9e0e8073..9c01dea2 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,7 +1,6 @@ ignore: - - "dist/" - - "test/" - - "demo/" - - "node_modules/" - - ".github/" - - "webpack.config.js" \ No newline at end of file + - 'dist/' + - 'test/' + - 'node_modules/' + - '.github/' + - 'webpack.config.js' diff --git a/demo/demo.css b/demo/demo.css deleted file mode 100644 index 61244522..00000000 --- a/demo/demo.css +++ /dev/null @@ -1,207 +0,0 @@ -body { - font: 14px/1.4 sans-serif; - color: #111; - background: #fafafa; -} -a { - color: #366097; -} -h2, h1 { - text-align: center; - font-family: georgia, serif; - font-size: 3em; - font-weight: normal; -} -h2 { - font-size: 2.5em; - margin-bottom: .7em; -} - -pre, ol { - margin: 0 -} - - - -table { - border-collapse: collapse; - width: 100%; -} - -table, td, th { - border: 1px solid #fafafa; -} -td, th { - padding: .4em; -} - -tbody th { - text-align: right; - width: 10em; -} - -code, label { - background: #fff; - border-radius: .3em; - padding: .2em .3em; - border: 1px solid #ededed; -} - - -label { - white-space: nowrap; - display: inline-block; - margin: 0 .3em .3em 0; - cursor: pointer; - font-size: .9em; -} -input:not([type=checkbox]):not([type=radio]), select { - width: 100%; - font-size: 1.4em; - box-sizing: border-box; -} -input { - padding: .2em; -} - -.error { - color: red; -} - - -#page { - min-width: 960px; - margin: auto; -} - -#intro { - text-align: center; - font-size: 1.2em; -} - -/* Input --------------------------------------- */ - - -#tabs { - border-bottom: 1px solid #111; - text-align: center; -} -#tabs a { - background: #111; - border: 1px solid #111; - padding: .4em 1em; - margin: 0 .5em -1px; - color: #eee; - display: inline-block; - text-decoration: none; - font-weight: bold; - font-size: 1.1em; - border-top-left-radius: .2em; - border-top-right-radius: .2em; -} -#tabs a.active { - color: #111; - background: #fafafa; - border-bottom-color: #fafafa; -} -#input { - float: left; - width: 40% -} -#input th { - width: 7em !important; -} -#input section { - padding: 1em; -} -.examples li { - margin-bottom: .7em; -} -.examples code { - cursor: pointer; -} -#rfc-input input { - font-family: monospace; -} - -#options-input input, #options-input select { - font-size: 1em; -} -.option-name { - position: relative; - cursor: help; -} -.option-name .help { - border-radius: .3em; - font-weight: normal; - display: none; - position: absolute; - padding: 1em; - background: #333; - color: #fafafa; - border: 1px solid #000; - left: 110%; - right: -100%; - width: 350px; - text-align: left; - top: -1em; - box-shadow: 3px 3px 3px #888; - line-height: 1.6; - font-size: .9em; -} -.option-name .help code { - color: #fff; - background: #000; -} -.option-name:hover code:first-child{ - background: #222; - color: #fafafa; -} -.option-name:hover .help { - display: block; -} - - -/* Output --------------------------------------- */ - - -#output { - float: right; - width: 58% -} -#output pre { - white-space: pre-wrap; -} -#output td { - background: #fff; -} -#output td, #output th { - vertical-align: top; -} -#output li { - font-family: monospace; -} -#output li:nth-child(even) { - background: #f1f1f1; -} -#dates { - font-size: .9em; -} -#dates td:first-child { - color: #ccc; -} -#dates td:first-child { - text-align: right; -} -#dates td.b { - background: #eaeaea; -} -#dates td.b { - background: #f0f0f0; -} - -#output a { - color: inherit -} diff --git a/demo/demo.ts b/demo/demo.ts deleted file mode 100644 index 009381e4..00000000 --- a/demo/demo.ts +++ /dev/null @@ -1,275 +0,0 @@ -import * as $ from 'jquery' -import { - RRule, - Options, - Weekday -} from '../src/index' - -const getDay = (i: number) => [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR, - RRule.SA, - RRule.SU -][i] - -const makeArray = (s: string | string[]) => - Array.isArray(s) ? s : [s] - -const getFormValues = function ($form: JQuery) { - const paramObj: { [K in keyof Partial]: string | string[] } = {} - $form.serializeArray().forEach(kv => { - const k = kv.name as keyof Options - if (paramObj.hasOwnProperty(k)) { - const v = makeArray(paramObj[k]!) - v.push(kv.value) - paramObj[k] = v - } else { - paramObj[k] = kv.value - } - }) - - return paramObj -} - -const getOptionsCode = function (options: Partial) { - const days = [ - 'RRule.MO', - 'RRule.TU', - 'RRule.WE', - 'RRule.TH', - 'RRule.FR', - 'RRule.SA', - 'RRule.SU' - ] - - const items = Object.keys(options).map((k: keyof Options) => { - let v: unknown = options[k] - if (v === null) { - v = 'null' - } else if (k === 'freq') { - v = `RRule.${RRule.FREQUENCIES[v as number]}` - } else if (k === 'dtstart' || k === 'until') { - const d = v as Date - v = 'new Date(Date.UTC(' + [ - d.getUTCFullYear(), - d.getUTCMonth(), - d.getUTCDate(), - d.getUTCHours(), - d.getUTCMinutes(), - d.getUTCSeconds() - ].join(', ') + '))' - } else if (k === 'byweekday') { - if (Array.isArray(v)) { - v = (v as Weekday[]).map(function (wday) { - console.log('wday', wday) - let s = days[wday.weekday] - if (wday.n) { - return s + `.nth(${wday.n})` - } - return s - }) - } else { - const w = v as Weekday - v = days[w.weekday] - } - } else if (k === 'wkst') { - if (v === RRule.MO) { - return '' - } - const w = v as Weekday - v = days[w.weekday] - } - - if (Array.isArray(v)) { - v = `[${v.join(', ')}]` - } - - console.log(k, ' =', v) - return `${k}: ${v}` - }) - - return `{\n ${items.filter(v => !!v).join(',\n ')}\n}` -} - -const makeRows = function (dates: Date[]) { - let prevParts: string[] = [] - let prevStates: boolean[] = [] - - const rows = dates.map((date, index) => { - let states: boolean[] = [] - let parts = date.toUTCString().split(' ') - - const cells = parts.map((part, i) => { - if (part !== prevParts[i]) { - states[i] = !prevStates[i] - } else { - states[i] = prevStates[i] - } - const cls = states[i] ? 'a' : 'b' - return `${ part }` - }) - - prevParts = parts - prevStates = states - - return `${ index + 1 }${ cells.join('\n') }` - }) - - return rows.join('\n\n') -} - -$(function () { - const $tabs = $('#tabs') - - const activateTab = function ($a: JQuery) { - const id = $a.attr('href')!.split('#')[1] - $tabs.find('a').removeClass('active') - $a.addClass('active') - $('#input-types section').hide() - return $(`#input-types #${id}`).show().find('input:first').trigger('focus').trigger('change') - } - - $('#input-types section').hide().each(function () { - $('', { - href: `#${$(this).attr('id')}` - }).text($(this).find('h3').hide().text()).appendTo($tabs).on('click', function () { - activateTab($(this)) - return false - }) - }) - - $('.examples code').on('click', function () { - const $code = $(this) - return $code.parents('section:first').find('input').val($code.text()).trigger('change') - }) - - let init: string - let makeRule: () => RRule - - $('input, select').on('keyup change', function () { - const $in = $(this) - const $section = $in.parents('section:first') - const inputMethod = $section.attr('id')!.split('-')[0] - - switch (inputMethod) { - case 'text': - makeRule = () => RRule.fromText($in.val()!.toString()) - init = `RRule.fromText("${(this as HTMLFormElement).value}")` - break - case 'rfc': - makeRule = () => RRule.fromString((this as HTMLFormElement).value) - init = `RRule.fromString("${(this as HTMLFormElement).value}")` - break - case 'options': - let values = getFormValues($in.parents('form')) - let options: Partial = {} - - for (let k in values) { - const key = k as keyof Options - - let value: string | string[] | Date | Weekday | Weekday[] | number | number[] = values[key]! - if (!value) { - continue - } else if (key === 'dtstart' || key === 'until') { - const date = new Date(Date.parse(value + 'Z')) - options[key] = date - } else if (key === 'byweekday') { - if (Array.isArray(value)) { - options[key] = value.map(i => getDay(parseInt(i, 10))) - } else { - options[key] = getDay(parseInt(value, 10)) - } - } else if (/^by/.test(key)) { - if (!Array.isArray(value)) { - value = value.split(/[,\s]+/) - } - value = value.filter(v => v) - options[key] = value.map(n => parseInt(n, 10)) - } else if (key === 'tzid') { - options[key] = value as string - } else { - options[key] = parseInt(value as string, 10) - } - - if (key === 'wkst') { - options[key] = getDay(parseInt(value as string, 10)) - } - - if (key === 'interval') { - const i = parseInt(value as string, 10) - if (i === 1 || !value) { - continue - } - - options[key] = i - } - } - - makeRule = () => new RRule(options) - init = `new RRule(${getOptionsCode(options)})` - console.log(options) - break - } - - $('#init').html(init) - $('#rfc-output a').html('') - $('#text-output a').html('') - $('#options-output').html('') - $('#dates').html('') - - let rule: RRule - try { - rule = makeRule() - } catch (e) { - $('#init').append($('
').text(`=> ${String(e || null)}`))
-      return
-    }
-
-    const rfc = rule.toString()
-    const text = rule.toText()
-    $('#rfc-output a').text(rfc).attr('href', `#/rfc/${rfc}`)
-    $('#text-output a').text(text).attr('href', `#/text/${text}`)
-    $('#options-output').text(getOptionsCode(rule.origOptions))
-    if (inputMethod === 'options') {
-      $('#options-output').parents('tr').hide()
-    } else {
-      $('#options-output').parents('tr').show()
-    }
-    const max = 500
-    const dates = rule.all(function (date, i) {
-      if (!rule.options.count && (i === max)) {
-        return false // That's enough
-      }
-      return true
-    })
-
-    let html = makeRows(dates)
-    if (!rule.options.count) {
-      html += `\
-Showing first ${max} dates, set
-count to see more.\
-`
-    }
-    return $('#dates').html(html)
-  })
-
-  activateTab($tabs.find('a:first'))
-
-  const processHash = function () {
-    const hash = location.hash.substring(1)
-    if (hash) {
-      const match = /^\/(rfc|text)\/(.+)$/.exec(hash)
-      if (match) {
-        const method = match[1] // rfc | text
-        const arg = match[2]
-        activateTab($(`a[href='#${method}-input']`))
-        return $(`#${method}-input input:first`).val(arg).trigger('change')
-      }
-    }
-  }
-  processHash()
-  return $(window).on('hashchange', processHash)
-})
diff --git a/demo/index.html b/demo/index.html
deleted file mode 100644
index 88067afb..00000000
--- a/demo/index.html
+++ /dev/null
@@ -1,586 +0,0 @@
-
-
-
-
-
-  rrule.js demo
-  
-  
-
-
-
-  
-

- Code and docs -

-

- rrule.js demo

- -
-

- This is a demo and test app for - rrule.js, a JavaScript library for working with recurrence rules for calendar dates. -

- -
- -
-

Output

- - - - - - - - - - - - - - - - - - - - - -
- rule = - -

-          
- rule.origOptions - -

-          
- rule.toString() - -
-
- rule.toText() - - - - -
- rule.all() - -
-
-
- - -
-

Input

-
-
-
-

Options

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- freq - -
Frequency
-
-
- - - - - - - -
-
- dtstart - -
The recurrence start. Besides being the base for the recurrence, missing parameters in the final recurrence - instances will also be extracted from this date. If not given, - new Date will be used instead. -
-
-
- -
-
- tzid - -
The timezone for the rule. If present, all recurrences will be interpreted as being in the local time - of the given timezone. If not present, UTC will be used instead. -
-
-
- -
-
- until - -
If given, this must be a - Date - instance, that will specify the limit of the recurrence. If a recurrence instance happens to be the same as the - Date instance given in the - until - argument, this will be the last occurrence. -
-
-
- -
-
- count - -
How many occurrences will be generated. -
-
-
- -
-
- interval - -
The interval between each freq iteration. For example, when using - RRule.YEARLY, an interval of - 2 means once every two years, but with - RRule.HOURLY, it means once every two hours. The default interval is - 1. -
-
-
- -
-
- wkst - -
The week start day. Must be one of the - RRule.MO, - RRule.TU, - RRule.WE - constants, or an integer, specifying the first day of the week. This will affect recurrences based on weekly periods. The - default week start is - RRule.MO. -
-
-
- - - - - - - -
-
- byweekday - -
If given, it must be either an integer ( - 0 == RRule.MO), a sequence of integers, one of the weekday constants ( - RRule.MO, - RRule.TU, etc), or a sequence of these constants. When given, these variables will define - the weekdays where the recurrence will be applied. It's also possible to use an argument n for the - weekday instances, which will mean the nth occurrence of this weekday in the period. For example, - with - RRule.MONTHLY, or with - RRule.YEARLY and - BYMONTH, using - RRule.FR.clone(+1) in - byweekday will specify the first friday of the month where the recurrence happens. Notice - that the RFC documentation, this is specified as - BYDAY, but was renamed to avoid the ambiguity of that argument. -
-
-
- - - - - - - -
-
- bymonth - -
If given, it must be either an integer, or a sequence of integers, meaning the months to apply the - recurrence to. -
-
-
- - - - - - - - - - - - -
-
- bysetpos - -
If given, it must be either an integer, or a sequence of integers, positive or negative. Each given - integer will specify an occurrence number, corresponding to the nth occurrence of the rule inside - the frequency period. For example, a - bysetpos of - -1 if combined with a - RRule.MONTHLY - frequency, and a byweekday of ( - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR), will result in the last work day of every month. -
-
-
- -
-
- bymonthday - -
If given, it must be either an integer, or a sequence of integers, meaning the month days to apply - the recurrence to. -
-
-
- -
-
- byyearday - -
If given, it must be either an integer, or a sequence of integers, meaning the year days to apply the - recurrence to. -
-
-
- -
-
- byweekno - -
If given, it must be either an integer, or a sequence of integers, meaning the week numbers to apply - the recurrence to. Week numbers have the meaning described in ISO8601, that is, the first week of - the year is that containing at least four days of the new year. -
-
-
- -
-
- byhour - -
If given, it must be either an integer, or a sequence of integers, meaning the hours to apply the recurrence - to. -
-
-
- -
-
- byminute - -
If given, it must be either an integer, or a sequence of integers, meaning the minutes to apply the - recurrence to. -
-
-
- -
-
- bysecond - -
If given, it must be either an integer, or a sequence of integers, meaning the seconds to apply the - recurrence to. -
-
-
- -
-
- byeaster - -
- This is an extension to the RFC specification which the Python implementation provides. - Not implemented in the JavaScript version. - -
-
-
- -
-
-
- - -
-

- RRULE string

-

- -

-

- Enter an - RRULE as per - iCalendar RFC. -

-

Examples:

-
    -
  • - FREQ=WEEKLY;BYDAY=MO,WE -
  • -
  • - FREQ=MONTHLY;BYMONTHDAY=10,15;COUNT=20 -
  • -
  • - FREQ=DAILY;INTERVAL=3;COUNT=10 -
  • -
  • - FREQ=MONTHLY;BYDAY=-2FR;COUNT=7 -
  • -
-
- - - -
-

Text input

-

- -

-

Examples:

-
    -
  • - Every weekday -
  • -
  • - Every 2 weeks on Tuesday -
  • -
  • - Every week on Monday, Wednesday -
  • -
  • - Every month on the 2nd last Friday for 7 times -
  • -
  • - Every 6 months -
  • -
-
- - -
-
-
- - Fork me on GitHub - - - - diff --git a/index.html b/index.html deleted file mode 120000 index 5ad281df..00000000 --- a/index.html +++ /dev/null @@ -1 +0,0 @@ -demo/index.html \ No newline at end of file diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..8bb37208 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +} diff --git a/package.json b/package.json index 8c837dbf..a31a1116 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "rrule", - "version": "2.6.2", + "version": "2.8.0", "description": "JavaScript library for working with recurrence rules for calendar dates.", "homepage": "http://jakubroztocil.github.io/rrule/", - "license": "SEE LICENSE IN LICENSE", + "license": "BSD-3-Clause", "keywords": [ "dates", "recurrences", @@ -13,22 +13,23 @@ ], "author": "Jakub Roztocil, Lars Schöning, and David Golightly", "main": "dist/es5/rrule.js", - "module": "dist/esm/src/index.js", - "typings": "dist/esm/src/index.d.ts", + "module": "dist/esm/index.js", + "types": "dist/esm/index.d.ts", "repository": { "type": "git", "url": "git://github.com/jakubroztocil/rrule.git" }, - "husky": { - "hooks": { - "pre-commit": "yarn lint" - } - }, "scripts": { - "build": "yarn lint && tsc && webpack && tsc dist/esm/**/*.d.ts", - "lint": "yarn tslint --project . --fix --config tslint.json", - "test": "TS_NODE_PROJECT=tsconfig.test.json mocha **/*.test.ts", - "test-ci": "TS_NODE_PROJECT=tsconfig.test.json nyc mocha **/*.test.ts" + "prebuild": "yarn clean", + "prepublish": "yarn build", + "build": "yarn lint && yarn format-check && tsc -b tsconfig.build.json && webpack && tsc dist/esm/**/*.d.ts", + "clean": "rm -rf dist/", + "lint": "yarn eslint . --fix --config .eslintrc.js", + "format": "yarn prettier --write .", + "format-check": "yarn prettier --check .", + "run-ts": "TS_NODE_PROJECT=tsconfig.json node --loader ts-node/esm", + "test": "jest **/*.test.ts", + "test-ci": "yarn run-ts ./node_modules/.bin/nyc jest **/*.test.ts" }, "nyc": { "extension": [ @@ -43,47 +44,48 @@ ], "all": true }, - "devDependencies": { - "@types/assert": "^0.0.31", - "@types/chai": "^4.1.4", - "@types/jquery": "^3.3.29", - "@types/luxon": "^1.2.2", - "@types/mocha": "^5.2.5", - "@types/mockdate": "^2.0.0", - "@types/node": "^10.12.18", - "chai": "^4.1.2", - "copy-webpack-plugin": "^4.5.2", - "coverage": "^0.0.0", - "html-webpack-plugin": "^3.2.0", - "husky": "^1.0.0-rc.13", - "jquery": "^3.3.1", - "mocha": "^5.2.0", - "mockdate": "^2.0.2", - "nyc": "^12.0.2", - "source-map-loader": "^0.2.4", - "source-map-support": "^0.5.8", - "ts-loader": "^4.4.2", - "ts-node": "^7.0.0", - "tslint": "^5.11.0", - "tslint-eslint-rules": "^5.4.0", - "typescript": "^3.0.1", - "webpack": "^4.16.3", - "webpack-cli": "^3.1.0" - }, - "standard": { - "ignore": [ - "demo" + "lint-staged": { + "*.ts": [ + "yarn lint", + "yarn format" ] }, + "devDependencies": { + "@types/assert": "^1.4.3", + "@types/jest": "^29.5.8", + "@types/mockdate": "^3.0.0", + "@types/node": "^17.0.41", + "@typescript-eslint/eslint-plugin": "^5.27.1", + "@typescript-eslint/parser": "^5.27.1", + "coverage": "^0.4.1", + "eslint": "^8.17.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsdoc": "^39.3.2", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^8.0.1", + "jest": "^29.7.0", + "lint-staged": "^13.0.1", + "mockdate": "^3.0.5", + "nyc": "^15.1.0", + "prettier": "^2.6.2", + "source-map-loader": "^3.0.1", + "source-map-support": "^0.5.16", + "terser-webpack-plugin": "^5.3.3", + "ts-jest": "^29.1.1", + "ts-loader": "^9.3.0", + "ts-node": "^10.8.1", + "typescript": "^4.7.3", + "unminified-webpack-plugin": "^3.0.0", + "webpack": "^5.73.0", + "webpack-cli": "^4.9.2" + }, "files": [ "dist", "README.md" ], - "optionalDependencies": { - "luxon": "^1.3.3" - }, "peerDependencies": {}, "dependencies": { - "tslib": "^1.9.0" + "tslib": "^2.4.0" } } diff --git a/src/cache.ts b/src/cache.ts index 442f53ac..02ed58e3 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -1,9 +1,26 @@ import IterResult, { IterArgs } from './iterresult' -import dateutil from './dateutil' +import { clone, cloneDates } from './dateutil' import { isArray } from './helpers' export type CacheKeys = 'before' | 'after' | 'between' +function argsMatch( + left: IterArgs[keyof IterArgs] | undefined, + right: IterArgs[keyof IterArgs] | undefined +) { + if (Array.isArray(left)) { + if (!Array.isArray(right)) return false + if (left.length !== right.length) return false + return left.every((date, i) => date.getTime() === right[i].getTime()) + } + + if (left instanceof Date) { + return right instanceof Date && left.getTime() === right.getTime() + } + + return left === right +} + export class Cache { all: Date[] | Partial | false = false before: IterArgs[] = [] @@ -15,34 +32,31 @@ export class Cache { * @param {Array,Date} value - an array of dates, one date, or null * @param {Object?} args - _iter arguments */ - public _cacheAdd ( + public _cacheAdd( what: CacheKeys | 'all', value: Date[] | Date | null, args?: Partial ) { if (value) { - value = - value instanceof Date - ? dateutil.clone(value) - : dateutil.cloneDates(value) + value = value instanceof Date ? clone(value) : cloneDates(value) } if (what === 'all') { this.all = value as Date[] } else { - args!._value = value + args._value = value this[what].push(args as IterArgs) } } /** * @return false - not in the cache - * null - cached, but zero occurrences (before/after) - * Date - cached (before/after) - * [] - cached, but zero occurrences (all/between) - * [Date1, DateN] - cached (all/between) + * @return null - cached, but zero occurrences (before/after) + * @return Date - cached (before/after) + * @return [] - cached, but zero occurrences (all/between) + * @return [Date1, DateN] - cached (all/between) */ - public _cacheGet ( + public _cacheGet( what: CacheKeys | 'all', args?: Partial ): Date | Date[] | false | null { @@ -51,7 +65,7 @@ export class Cache { const findCacheDiff = function (item: IterArgs) { for (let i = 0; i < argsKeys.length; i++) { const key = argsKeys[i] - if (String(args![key]) !== String(item[key])) { + if (!argsMatch(args[key], item[key])) { return true } } @@ -75,7 +89,7 @@ export class Cache { if (!cached && this.all) { // Not in the cache, but we already know all the occurrences, // so we can find the correct dates from the cached ones. - const iterResult = new IterResult(what, args!) + const iterResult = new IterResult(what, args) for (let i = 0; i < (this.all as Date[]).length; i++) { if (!iterResult.accept((this.all as Date[])[i])) break } @@ -84,10 +98,9 @@ export class Cache { } return isArray(cached) - ? dateutil.cloneDates(cached) + ? cloneDates(cached) : cached instanceof Date - ? dateutil.clone(cached) - : cached + ? clone(cached) + : cached } - } diff --git a/src/callbackiterresult.ts b/src/callbackiterresult.ts index 8dfa1b68..67c57d71 100644 --- a/src/callbackiterresult.ts +++ b/src/callbackiterresult.ts @@ -9,7 +9,7 @@ type Iterator = (d: Date, len: number) => boolean export default class CallbackIterResult extends IterResult<'all' | 'between'> { private iterator: Iterator - constructor ( + constructor( method: 'all' | 'between', args: Partial, iterator: Iterator @@ -19,7 +19,7 @@ export default class CallbackIterResult extends IterResult<'all' | 'between'> { this.iterator = iterator } - add (date: Date) { + add(date: Date) { if (this.iterator(date, this._result.length)) { this._result.push(date) return true diff --git a/src/datetime.ts b/src/datetime.ts index 09422f66..a542047c 100644 --- a/src/datetime.ts +++ b/src/datetime.ts @@ -1,6 +1,6 @@ import { ParsedOptions, Frequency } from './types' import { pymod, divmod, empty, includes } from './helpers' -import { dateutil } from './dateutil' +import { getWeekday, MAXYEAR, monthRange } from './dateutil' export class Time { public hour: number @@ -8,38 +8,38 @@ export class Time { public second: number public millisecond: number - constructor ( - hour: number, - minute: number, - second: number, - millisecond: number - ) { + constructor( + hour: number, + minute: number, + second: number, + millisecond: number + ) { this.hour = hour this.minute = minute this.second = second this.millisecond = millisecond || 0 } - getHours () { + getHours() { return this.hour } - getMinutes () { + getMinutes() { return this.minute } - getSeconds () { + getSeconds() { return this.second } - getMilliseconds () { + getMilliseconds() { return this.millisecond } - getTime () { + getTime() { return ( - (this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 + - this.millisecond + (this.hour * 60 * 60 + this.minute * 60 + this.second) * 1000 + + this.millisecond ) } } @@ -49,62 +49,68 @@ export class DateTime extends Time { public month: number public year: number - static fromDate (date: Date) { + static fromDate(date: Date) { return new this( - date.getUTCFullYear(), - date.getUTCMonth() + 1, - date.getUTCDate(), - date.getUTCHours(), - date.getUTCMinutes(), - date.getUTCSeconds(), - date.valueOf() % 1000 - ) + date.getUTCFullYear(), + date.getUTCMonth() + 1, + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + date.valueOf() % 1000 + ) } - constructor ( - year: number, - month: number, - day: number, - hour: number, - minute: number, - second: number, - millisecond: number - ) { + constructor( + year: number, + month: number, + day: number, + hour: number, + minute: number, + second: number, + millisecond: number + ) { super(hour, minute, second, millisecond) this.year = year this.month = month this.day = day } - getWeekday () { - return dateutil.getWeekday(new Date(this.getTime())) + getWeekday() { + return getWeekday(new Date(this.getTime())) } - getTime () { + getTime() { return new Date( - Date.UTC( - this.year, this.month - 1, this.day, this.hour, this.minute, this.second, this.millisecond - ) - ).getTime() + Date.UTC( + this.year, + this.month - 1, + this.day, + this.hour, + this.minute, + this.second, + this.millisecond + ) + ).getTime() } - getDay () { + getDay() { return this.day } - getMonth () { + getMonth() { return this.month } - getYear () { + getYear() { return this.year } - public addYears (years: number) { + public addYears(years: number) { this.year += years } - public addMonths (months: number) { + public addMonths(months: number) { this.month += months if (this.month > 12) { const yearDiv = Math.floor(this.month / 12) @@ -118,7 +124,7 @@ export class DateTime extends Time { } } - public addWeekly (days: number, wkst: number) { + public addWeekly(days: number, wkst: number) { if (wkst > this.getWeekday()) { this.day += -(this.getWeekday() + 1 + (6 - wkst)) + days * 7 } else { @@ -128,18 +134,18 @@ export class DateTime extends Time { this.fixDay() } - public addDaily (days: number) { + public addDaily(days: number) { this.day += days this.fixDay() } - public addHours (hours: number, filtered: boolean, byhour: number[]) { + public addHours(hours: number, filtered: boolean, byhour: number[]) { if (filtered) { - // Jump to one iteration before next day + // Jump to one iteration before next day this.hour += Math.floor((23 - this.hour) / hours) * hours } - while (true) { + for (;;) { this.hour += hours const { div: dayDiv, mod: hourMod } = divmod(this.hour, 24) if (dayDiv) { @@ -151,14 +157,19 @@ export class DateTime extends Time { } } - public addMinutes (minutes: number, filtered: boolean, byhour: number[], byminute: number[]) { + public addMinutes( + minutes: number, + filtered: boolean, + byhour: number[], + byminute: number[] + ) { if (filtered) { - // Jump to one iteration before next day + // Jump to one iteration before next day this.minute += - Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes + Math.floor((1439 - (this.hour * 60 + this.minute)) / minutes) * minutes } - while (true) { + for (;;) { this.minute += minutes const { div: hourDiv, mod: minuteMod } = divmod(this.minute, 60) if (hourDiv) { @@ -167,24 +178,31 @@ export class DateTime extends Time { } if ( - (empty(byhour) || includes(byhour, this.hour)) && - (empty(byminute) || includes(byminute, this.minute)) - ) { + (empty(byhour) || includes(byhour, this.hour)) && + (empty(byminute) || includes(byminute, this.minute)) + ) { break } } } - public addSeconds (seconds: number, filtered: boolean, byhour: number[], byminute: number[], bysecond: number[]) { + public addSeconds( + seconds: number, + filtered: boolean, + byhour: number[], + byminute: number[], + bysecond: number[] + ) { if (filtered) { - // Jump to one iteration before next day + // Jump to one iteration before next day this.second += - Math.floor( - (86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / seconds - ) * seconds + Math.floor( + (86399 - (this.hour * 3600 + this.minute * 60 + this.second)) / + seconds + ) * seconds } - while (true) { + for (;;) { this.second += seconds const { div: minuteDiv, mod: secondMod } = divmod(this.second, 60) if (minuteDiv) { @@ -193,21 +211,21 @@ export class DateTime extends Time { } if ( - (empty(byhour) || includes(byhour, this.hour)) && - (empty(byminute) || includes(byminute, this.minute)) && - (empty(bysecond) || includes(bysecond, this.second)) - ) { + (empty(byhour) || includes(byhour, this.hour)) && + (empty(byminute) || includes(byminute, this.minute)) && + (empty(bysecond) || includes(bysecond, this.second)) + ) { break } } } - public fixDay () { + public fixDay() { if (this.day <= 28) { return } - let daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1] + let daysinmonth = monthRange(this.year, this.month - 1)[1] if (this.day <= daysinmonth) { return } @@ -218,33 +236,33 @@ export class DateTime extends Time { if (this.month === 13) { this.month = 1 ++this.year - if (this.year > dateutil.MAXYEAR) { + if (this.year > MAXYEAR) { return } } - daysinmonth = dateutil.monthRange(this.year, this.month - 1)[1] + daysinmonth = monthRange(this.year, this.month - 1)[1] } } - public add (options: ParsedOptions, filtered: boolean) { - const { - freq, - interval, - wkst, - byhour, - byminute, - bysecond - } = options + public add(options: ParsedOptions, filtered: boolean) { + const { freq, interval, wkst, byhour, byminute, bysecond } = options switch (freq) { - case Frequency.YEARLY: return this.addYears(interval) - case Frequency.MONTHLY: return this.addMonths(interval) - case Frequency.WEEKLY: return this.addWeekly(interval, wkst) - case Frequency.DAILY: return this.addDaily(interval) - case Frequency.HOURLY: return this.addHours(interval, filtered, byhour) - case Frequency.MINUTELY: return this.addMinutes(interval, filtered, byhour, byminute) - case Frequency.SECONDLY: return this.addSeconds(interval, filtered, byhour, byminute, bysecond) + case Frequency.YEARLY: + return this.addYears(interval) + case Frequency.MONTHLY: + return this.addMonths(interval) + case Frequency.WEEKLY: + return this.addWeekly(interval, wkst) + case Frequency.DAILY: + return this.addDaily(interval) + case Frequency.HOURLY: + return this.addHours(interval, filtered, byhour) + case Frequency.MINUTELY: + return this.addMinutes(interval, filtered, byhour, byminute) + case Frequency.SECONDLY: + return this.addSeconds(interval, filtered, byhour, byminute, bysecond) } } } diff --git a/src/dateutil.ts b/src/dateutil.ts index 9ed09b18..b2cd176a 100644 --- a/src/dateutil.ts +++ b/src/dateutil.ts @@ -3,196 +3,220 @@ import { Time } from './datetime' type Datelike = Pick +export const datetime = function ( + y: number, + m: number, + d: number, + h = 0, + i = 0, + s = 0 +) { + return new Date(Date.UTC(y, m - 1, d, h, i, s)) +} + /** * General date-related utilities. * Also handles several incompatibilities between JavaScript and Python * */ -export namespace dateutil { - export const MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] - - /** - * Number of milliseconds of one day - */ - export const ONE_DAY = 1000 * 60 * 60 * 24 - - /** - * @see: - */ - export const MAXYEAR = 9999 - - /** - * Python uses 1-Jan-1 as the base for calculating ordinals but we don't - * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, - * therefore we use 1-Jan-1970 instead - */ - export const ORDINAL_BASE = new Date(Date.UTC(1970, 0, 1)) - - /** - * Python: MO-SU: 0 - 6 - * JS: SU-SAT 0 - 6 - */ - export const PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5] - - /** - * py_date.timetuple()[7] - */ - export const getYearDay = function (date: Date) { - const dateNoTime = new Date( - date.getUTCFullYear(), - date.getUTCMonth(), - date.getUTCDate() - ) - return ( - Math.ceil( - (dateNoTime.valueOf() - - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / - ONE_DAY - ) + 1 - ) - } +export const MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] - export const isLeapYear = function (year: number) { - return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 - } +/** + * Number of milliseconds of one day + */ +export const ONE_DAY = 1000 * 60 * 60 * 24 - export const isDate = function (value: any): value is Date { - return value instanceof Date - } +/** + * @see: + */ +export const MAXYEAR = 9999 - export const isValidDate = function (value: any): value is Date { - return isDate(value) && !isNaN(value.getTime()) - } +/** + * Python uses 1-Jan-1 as the base for calculating ordinals but we don't + * want to confuse the JS engine with milliseconds > Number.MAX_NUMBER, + * therefore we use 1-Jan-1970 instead + */ +export const ORDINAL_BASE = datetime(1970, 1, 1) - /** - * @return {Number} the date's timezone offset in ms - */ - export const tzOffset = function (date: Date) { - return date.getTimezoneOffset() * 60 * 1000 - } +/** + * Python: MO-SU: 0 - 6 + * JS: SU-SAT 0 - 6 + */ +export const PY_WEEKDAYS = [6, 0, 1, 2, 3, 4, 5] - /** - * @see: - */ - export const daysBetween = function (date1: Date, date2: Date) { - // The number of milliseconds in one day - // Convert both dates to milliseconds - const date1ms = date1.getTime() - tzOffset(date1) - const date2ms = date2.getTime() - tzOffset(date2) - // Calculate the difference in milliseconds - const differencems = date1ms - date2ms - // Convert back to days and return - return Math.round(differencems / ONE_DAY) - } +/** + * py_date.timetuple()[7] + */ +export const getYearDay = function (date: Date) { + const dateNoTime = new Date( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate() + ) + return ( + Math.ceil( + (dateNoTime.valueOf() - new Date(date.getUTCFullYear(), 0, 1).valueOf()) / + ONE_DAY + ) + 1 + ) +} - /** - * @see: - */ - export const toOrdinal = function (date: Date) { - return daysBetween(date, ORDINAL_BASE) - } +export const isLeapYear = function (year: number) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 +} - /** - * @see - - */ - export const fromOrdinal = function (ordinal: number) { - return new Date(ORDINAL_BASE.getTime() + ordinal * ONE_DAY) - } +export const isDate = function (value: unknown): value is Date { + return value instanceof Date +} - export const getMonthDays = function (date: Date) { - const month = date.getUTCMonth() - return month === 1 && isLeapYear(date.getUTCFullYear()) - ? 29 - : MONTH_DAYS[month] - } +export const isValidDate = function (value: unknown): value is Date { + return isDate(value) && !isNaN(value.getTime()) +} - /** - * @return {Number} python-like weekday - */ - export const getWeekday = function (date: Date) { - return PY_WEEKDAYS[date.getUTCDay()] - } +/** + * @return {Number} the date's timezone offset in ms + */ +export const tzOffset = function (date: Date) { + return date.getTimezoneOffset() * 60 * 1000 +} - /** - * @see: - */ - export const monthRange = function (year: number, month: number) { - const date = new Date(Date.UTC(year, month, 1)) - return [getWeekday(date), getMonthDays(date)] - } +/** + * @see: + */ +export const daysBetween = function (date1: Date, date2: Date) { + // The number of milliseconds in one day + // Convert both dates to milliseconds + const date1ms = date1.getTime() + const date2ms = date2.getTime() + + // Calculate the difference in milliseconds + const differencems = date1ms - date2ms + + // Convert back to days and return + return Math.round(differencems / ONE_DAY) +} - /** - * @see: - */ - export const combine = function (date: Date, time: Date | Time) { - time = time || date - return new Date( - Date.UTC( - date.getUTCFullYear(), - date.getUTCMonth(), - date.getUTCDate(), - time.getHours(), - time.getMinutes(), - time.getSeconds(), - time.getMilliseconds() - ) +/** + * @see: + */ +export const toOrdinal = function (date: Date) { + return daysBetween(date, ORDINAL_BASE) +} + +/** + * @see - + */ +export const fromOrdinal = function (ordinal: number) { + return new Date(ORDINAL_BASE.getTime() + ordinal * ONE_DAY) +} + +export const getMonthDays = function (date: Date) { + const month = date.getUTCMonth() + return month === 1 && isLeapYear(date.getUTCFullYear()) + ? 29 + : MONTH_DAYS[month] +} + +/** + * @return {Number} python-like weekday + */ +export const getWeekday = function (date: Date) { + return PY_WEEKDAYS[date.getUTCDay()] +} + +/** + * @see: + */ +export const monthRange = function (year: number, month: number) { + const date = datetime(year, month + 1, 1) + return [getWeekday(date), getMonthDays(date)] +} + +/** + * @see: + */ +export const combine = function (date: Date, time: Date | Time) { + time = time || date + return new Date( + Date.UTC( + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + time.getHours(), + time.getMinutes(), + time.getSeconds(), + time.getMilliseconds() ) - } + ) +} - export const clone = function (date: Date | Time) { - const dolly = new Date(date.getTime()) - return dolly - } +export const clone = function (date: Date | Time) { + const dolly = new Date(date.getTime()) + return dolly +} - export const cloneDates = function (dates: Date[] | Time[]) { - const clones = [] - for (let i = 0; i < dates.length; i++) { - clones.push(clone(dates[i])) - } - return clones +export const cloneDates = function (dates: Date[] | Time[]) { + const clones = [] + for (let i = 0; i < dates.length; i++) { + clones.push(clone(dates[i])) } + return clones +} - /** - * Sorts an array of Date or dateutil.Time objects - */ - export const sort = function(dates: T[]) { - dates.sort(function (a, b) { - return a.getTime() - b.getTime() - }) - } +/** + * Sorts an array of Date or Time objects + */ +export const sort = function (dates: T[]) { + dates.sort(function (a, b) { + return a.getTime() - b.getTime() + }) +} - export const timeToUntilString = function (time: number, utc = true) { - const date = new Date(time) - return [ - padStart(date.getUTCFullYear().toString(), 4, '0'), - padStart(date.getUTCMonth() + 1, 2, '0'), - padStart(date.getUTCDate(), 2, '0'), - 'T', - padStart(date.getUTCHours(), 2, '0'), - padStart(date.getUTCMinutes(), 2, '0'), - padStart(date.getUTCSeconds(), 2, '0'), - utc ? 'Z' : '' - ].join('') - } +export const timeToUntilString = function (time: number, utc = true) { + const date = new Date(time) + return [ + padStart(date.getUTCFullYear().toString(), 4, '0'), + padStart(date.getUTCMonth() + 1, 2, '0'), + padStart(date.getUTCDate(), 2, '0'), + 'T', + padStart(date.getUTCHours(), 2, '0'), + padStart(date.getUTCMinutes(), 2, '0'), + padStart(date.getUTCSeconds(), 2, '0'), + utc ? 'Z' : '', + ].join('') +} + +export const untilStringToDate = function (until: string) { + const re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/ + const bits = re.exec(until) + + if (!bits) throw new Error(`Invalid UNTIL value: ${until}`) - export const untilStringToDate = function (until: string) { - const re = /^(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2})Z?)?$/ - const bits = re.exec(until) - - if (!bits) throw new Error(`Invalid UNTIL value: ${until}`) - - return new Date( - Date.UTC( - parseInt(bits[1], 10), - parseInt(bits[2], 10) - 1, - parseInt(bits[3], 10), - parseInt(bits[5], 10) || 0, - parseInt(bits[6], 10) || 0, - parseInt(bits[7], 10) || 0 - ) + return new Date( + Date.UTC( + parseInt(bits[1], 10), + parseInt(bits[2], 10) - 1, + parseInt(bits[3], 10), + parseInt(bits[5], 10) || 0, + parseInt(bits[6], 10) || 0, + parseInt(bits[7], 10) || 0 ) - } + ) +} +const dateTZtoISO8601 = function (date: Date, timeZone: string) { + // date format for sv-SE is almost ISO8601 + const dateStr = date.toLocaleString('sv-SE', { timeZone }) + // '2023-02-07 10:41:36' + return dateStr.replace(' ', 'T') + 'Z' } -export default dateutil +export const dateInTimeZone = function (date: Date, timeZone: string) { + const localTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone + // Date constructor can only reliably parse dates in ISO8601 format + const dateInLocalTZ = new Date(dateTZtoISO8601(date, localTimeZone)) + const dateInTargetTZ = new Date(dateTZtoISO8601(date, timeZone ?? 'UTC')) + const tzOffset = dateInTargetTZ.getTime() - dateInLocalTZ.getTime() + + return new Date(date.getTime() - tzOffset) +} diff --git a/src/datewithzone.ts b/src/datewithzone.ts index 8ae3ed09..e05fcc2e 100644 --- a/src/datewithzone.ts +++ b/src/datewithzone.ts @@ -1,21 +1,23 @@ -import dateutil from './dateutil' -import { DateTime } from 'luxon' +import { dateInTimeZone, timeToUntilString } from './dateutil' export class DateWithZone { public date: Date public tzid?: string | null - constructor (date: Date, tzid?: string | null) { + constructor(date: Date, tzid?: string | null) { + if (isNaN(date.getTime())) { + throw new RangeError('Invalid date passed to DateWithZone') + } this.date = date this.tzid = tzid } - private get isUTC () { + private get isUTC() { return !this.tzid || this.tzid.toUpperCase() === 'UTC' } - public toString () { - const datestr = dateutil.timeToUntilString(this.date.getTime(), this.isUTC) + public toString() { + const datestr = timeToUntilString(this.date.getTime(), this.isUTC) if (!this.isUTC) { return `;TZID=${this.tzid}:${datestr}` } @@ -23,27 +25,15 @@ export class DateWithZone { return `:${datestr}` } - public getTime () { + public getTime() { return this.date.getTime() } - public rezonedDate () { + public rezonedDate() { if (this.isUTC) { return this.date } - try { - const datetime = DateTime - .fromJSDate(this.date) - - const rezoned = datetime.setZone(this.tzid!, { keepLocalTime: true }) - - return rezoned.toJSDate() - } catch (e) { - if (e instanceof TypeError) { - console.error('Using TZID without Luxon available is unsupported. Returned times are in UTC, not the requested time zone') - } - return this.date - } + return dateInTimeZone(this.date, this.tzid) } } diff --git a/src/helpers.ts b/src/helpers.ts index af458c8d..37c3ac0b 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -2,14 +2,22 @@ // Helper functions // ============================================================================= -export const isPresent = function(value?: T | null | undefined): value is T { +import { ALL_WEEKDAYS, WeekdayStr } from './weekday' + +export const isPresent = function ( + value?: T | null | undefined +): value is T { return value !== null && value !== undefined } -export const isNumber = function (value?: any): value is number { +export const isNumber = function (value: unknown): value is number { return typeof value === 'number' } +export const isWeekdayStr = function (value: unknown): value is WeekdayStr { + return typeof value === 'string' && ALL_WEEKDAYS.includes(value as WeekdayStr) +} + export const isArray = Array.isArray /** @@ -25,11 +33,11 @@ export const range = function (start: number, end: number = start): number[] { return rang } -export const clone = function(array: T[]): T[] { +export const clone = function (array: T[]): T[] { return ([] as T[]).concat(array) } -export const repeat = function(value: T | T[], times: number): (T | T[])[] { +export const repeat = function (value: T | T[], times: number): (T | T[])[] { let i = 0 const array: (T | T[])[] = [] @@ -41,15 +49,19 @@ export const repeat = function(value: T | T[], times: number): (T | T[])[] { return array } -export const toArray = function(item: T | T[]): T[] { +export const toArray = function (item: T | T[]): T[] { if (isArray(item)) { return item } - return [ item ] + return [item] } -export function padStart (item: string | number, targetLength: number, padString: string = ' ') { +export function padStart( + item: string | number, + targetLength: number, + padString = ' ' +) { const str = String(item) targetLength = targetLength >> 0 if (str.length > targetLength) { @@ -61,7 +73,7 @@ export function padStart (item: string | number, targetLength: number, padString padString += repeat(padString, targetLength / padString.length) } - return padString.slice(0,targetLength) + String(str) + return padString.slice(0, targetLength) + String(str) } /** @@ -87,7 +99,7 @@ export const split = function (str: string, sep: string, num: number) { * @param {number} a The dividend. * @param {number} b The divisor. * @return {number} a % b where the result is between 0 and b (either 0 <= x < b - * or b < x <= 0, depending on the sign of b). + * or b < x <= 0, depending on the sign of b). */ export const pymod = function (a: number, b: number) { const r = a % b @@ -102,23 +114,24 @@ export const divmod = function (a: number, b: number) { return { div: Math.floor(a / b), mod: pymod(a, b) } } -export const empty = function(obj: T[] | null | undefined) { +export const empty = function (obj: T[] | null | undefined) { return !isPresent(obj) || obj.length === 0 } /** * Python-like boolean + * * @return {Boolean} value of an object/primitive, taking into account * the fact that in Python an empty list's/tuple's * boolean value is False, whereas in JS it's true */ -export const notEmpty = function(obj: T[] | null | undefined): obj is T[] { +export const notEmpty = function (obj: T[] | null | undefined): obj is T[] { return !empty(obj) } /** * Return true if a value is in an array */ -export const includes = function(arr: T[] | null | undefined, val: T) { +export const includes = function (arr: T[] | null | undefined, val: T) { return notEmpty(arr) && arr.indexOf(val) !== -1 } diff --git a/src/index.ts b/src/index.ts index bf8aa8d4..237a275f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -/*! +/* ! * rrule.js - Library for working with recurrence rules for calendar dates. * https://github.com/jakubroztocil/rrule * @@ -14,21 +14,11 @@ * */ -import RRule from './rrule' -import RRuleSet from './rruleset' -import { rrulestr } from './rrulestr' +export { RRule } from './rrule' +export { RRuleSet } from './rruleset' + +export { rrulestr } from './rrulestr' export { Frequency, ByWeekday, Options } from './types' -export { Weekday, WeekdayStr } from './weekday' +export { Weekday, WeekdayStr, ALL_WEEKDAYS } from './weekday' export { RRuleStrOptions } from './rrulestr' - -// ============================================================================= -// Export -// ============================================================================= - -export { - RRule, - RRuleSet, - rrulestr -} - -export default RRule +export { datetime } from './dateutil' diff --git a/src/iter/index.ts b/src/iter/index.ts index 3b0653e5..89856c7d 100644 --- a/src/iter/index.ts +++ b/src/iter/index.ts @@ -1,22 +1,19 @@ import IterResult from '../iterresult' import { ParsedOptions, freqIsDailyOrGreater, QueryMethodTypes } from '../types' -import dateutil from '../dateutil' +import { combine, fromOrdinal, MAXYEAR } from '../dateutil' import Iterinfo from '../iterinfo/index' -import RRule from '../rrule' +import { RRule } from '../rrule' import { buildTimeset } from '../parseoptions' import { notEmpty, includes, isPresent } from '../helpers' import { DateWithZone } from '../datewithzone' import { buildPoslist } from './poslist' import { Time, DateTime } from '../datetime' -export function iter (iterResult: IterResult, options: ParsedOptions) { - const { - dtstart, - freq, - interval, - until, - bysetpos - } = options +export function iter( + iterResult: IterResult, + options: ParsedOptions +) { + const { dtstart, freq, interval, until, bysetpos } = options let count = options.count if (count === 0 || interval === 0) { @@ -24,24 +21,24 @@ export function iter (iterResult: IterResult, op } let counterDate = DateTime.fromDate(dtstart) - const endYear = until ? DateTime.fromDate(until).year : dateutil.MAXYEAR + const endYear = until ? DateTime.fromDate(until).year : MAXYEAR const ii = new Iterinfo(options) ii.rebuild(counterDate.year, counterDate.month) let timeset = makeTimeset(ii, counterDate, options) - while (true) { - let [dayset, start, end] = ii.getdayset(freq)( + for (;;) { + const [dayset, start, end] = ii.getdayset(freq)( counterDate.year, counterDate.month, counterDate.day ) - let filtered = removeFilteredDays(dayset, start, end, ii, options) + const filtered = removeFilteredDays(dayset, start, end, ii, options) if (notEmpty(bysetpos)) { - const poslist = buildPoslist(bysetpos, timeset!, start, end, ii, dayset) + const poslist = buildPoslist(bysetpos, timeset, start, end, ii, dayset) for (let j = 0; j < poslist.length; j++) { const res = poslist[j] @@ -70,10 +67,10 @@ export function iter (iterResult: IterResult, op continue } - const date = dateutil.fromOrdinal(ii.yearordinal + currentDay) - for (let k = 0; k < timeset!.length; k++) { - const time = timeset![k] - const res = dateutil.combine(date, time) + const date = fromOrdinal(ii.yearordinal + currentDay) + for (let k = 0; k < timeset.length; k++) { + const time = timeset[k] + const res = combine(date, time) if (until && res > until) { return emitResult(iterResult) } @@ -101,22 +98,24 @@ export function iter (iterResult: IterResult, op // Handle frequency and interval counterDate.add(options, filtered) - if (counterDate) { - - if (counterDate.year > endYear) { - return emitResult(iterResult) - } + if (counterDate && counterDate.year > endYear) { + return emitResult(iterResult) } if (!freqIsDailyOrGreater(freq)) { - timeset = ii.gettimeset(freq)(counterDate.hour, counterDate.minute, counterDate.second, 0) + timeset = ii.gettimeset(freq)( + counterDate.hour, + counterDate.minute, + counterDate.second, + 0 + ) } ii.rebuild(counterDate.year, counterDate.month) } } -function isFiltered ( +function isFiltered( ii: Iterinfo, currentDay: number, options: ParsedOptions @@ -128,15 +127,15 @@ function isFiltered ( byeaster, bymonthday, bynmonthday, - byyearday + byyearday, } = options return ( (notEmpty(bymonth) && !includes(bymonth, ii.mmask[currentDay])) || - (notEmpty(byweekno) && !ii.wnomask![currentDay]) || + (notEmpty(byweekno) && !ii.wnomask[currentDay]) || (notEmpty(byweekday) && !includes(byweekday, ii.wdaymask[currentDay])) || (notEmpty(ii.nwdaymask) && !ii.nwdaymask[currentDay]) || - (byeaster !== null && !includes(ii.eastermask!, currentDay)) || + (byeaster !== null && !includes(ii.eastermask, currentDay)) || ((notEmpty(bymonthday) || notEmpty(bynmonthday)) && !includes(bymonthday, ii.mdaymask[currentDay]) && !includes(bynmonthday, ii.nmdaymask[currentDay])) || @@ -150,24 +149,26 @@ function isFiltered ( ) } -function rezoneIfNeeded (date: Date, options: ParsedOptions) { +function rezoneIfNeeded(date: Date, options: ParsedOptions) { return new DateWithZone(date, options.tzid).rezonedDate() } -function emitResult (iterResult: IterResult) { +function emitResult(iterResult: IterResult) { return iterResult.getValue() } -function removeFilteredDays (dayset: (number | null)[], start: number, end: number, ii: Iterinfo, options: ParsedOptions) { +function removeFilteredDays( + dayset: (number | null)[], + start: number, + end: number, + ii: Iterinfo, + options: ParsedOptions +) { let filtered = false for (let dayCounter = start; dayCounter < end; dayCounter++) { - let currentDay = dayset[dayCounter] as number + const currentDay = dayset[dayCounter] - filtered = isFiltered( - ii, - currentDay, - options - ) + filtered = isFiltered(ii, currentDay, options) if (filtered) dayset[currentDay] = null } @@ -175,13 +176,12 @@ function removeFilteredDays (dayset: (number | null)[], start: number, end: numb return filtered } -function makeTimeset (ii: Iterinfo, counterDate: DateTime, options: ParsedOptions): Time[] | null { - const { - freq, - byhour, - byminute, - bysecond - } = options +function makeTimeset( + ii: Iterinfo, + counterDate: DateTime, + options: ParsedOptions +): Time[] | null { + const { freq, byhour, byminute, bysecond } = options if (freqIsDailyOrGreater(freq)) { return buildTimeset(options) diff --git a/src/iter/poslist.ts b/src/iter/poslist.ts index 575a2b85..6abf7e5d 100644 --- a/src/iter/poslist.ts +++ b/src/iter/poslist.ts @@ -1,9 +1,16 @@ -import dateutil from '../dateutil' +import { combine, fromOrdinal, sort } from '../dateutil' import Iterinfo from '../iterinfo/index' import { pymod, isPresent, includes } from '../helpers' import { Time } from '../datetime' -export function buildPoslist (bysetpos: number[], timeset: Time[], start: number, end: number, ii: Iterinfo, dayset: (number | null)[]) { +export function buildPoslist( + bysetpos: number[], + timeset: Time[], + start: number, + end: number, + ii: Iterinfo, + dayset: (number | null)[] +) { const poslist: Date[] = [] for (let j = 0; j < bysetpos.length; j++) { @@ -33,14 +40,14 @@ export function buildPoslist (bysetpos: number[], timeset: Time[], start: number } const time = timeset[timepos] - const date = dateutil.fromOrdinal(ii.yearordinal + i) - const res = dateutil.combine(date, time) + const date = fromOrdinal(ii.yearordinal + i) + const res = combine(date, time) // XXX: can this ever be in the array? // - compare the actual date instead? if (!includes(poslist, res)) poslist.push(res) } - dateutil.sort(poslist) + sort(poslist) return poslist } diff --git a/src/iterinfo/easter.ts b/src/iterinfo/easter.ts index e4ef7aa3..271efea2 100644 --- a/src/iterinfo/easter.ts +++ b/src/iterinfo/easter.ts @@ -1,4 +1,4 @@ -export function easter (y: number, offset: number = 0) { +export function easter(y: number, offset = 0) { const a = y % 19 const b = Math.floor(y / 100) const c = y % 100 diff --git a/src/iterinfo/index.ts b/src/iterinfo/index.ts index 896fed33..ac3cec3a 100644 --- a/src/iterinfo/index.ts +++ b/src/iterinfo/index.ts @@ -1,15 +1,10 @@ -import dateutil from '../dateutil' -import { - notEmpty, - repeat, - range, - isPresent -} from '../helpers' +import { notEmpty, repeat, range, isPresent } from '../helpers' import { ParsedOptions, Frequency } from '../types' import { YearInfo, rebuildYear } from './yearinfo' import { rebuildMonth, MonthInfo } from './monthinfo' import { easter } from './easter' import { Time } from '../datetime' +import { datetime, sort, toOrdinal } from '../dateutil' export type DaySet = [(number | null)[], number, number] export type GetDayset = () => DaySet @@ -23,9 +18,10 @@ export default class Iterinfo { public monthinfo: MonthInfo public eastermask: number[] | null - constructor (private options: ParsedOptions) {} + // eslint-disable-next-line no-empty-function + constructor(private options: ParsedOptions) {} - rebuild (year: number, month: number) { + rebuild(year: number, month: number) { const options = this.options if (year !== this.lastyear) { @@ -33,12 +29,17 @@ export default class Iterinfo { } if ( - notEmpty(options.bynweekday!) && + notEmpty(options.bynweekday) && (month !== this.lastmonth || year !== this.lastyear) ) { const { yearlen, mrange, wdaymask } = this.yearinfo this.monthinfo = rebuildMonth( - year, month, yearlen, mrange, wdaymask, options + year, + month, + yearlen, + mrange, + wdaymask, + options ) } @@ -47,59 +48,59 @@ export default class Iterinfo { } } - get lastyear () { + get lastyear() { return this.monthinfo ? this.monthinfo.lastyear : null } - get lastmonth () { + get lastmonth() { return this.monthinfo ? this.monthinfo.lastmonth : null } - get yearlen () { + get yearlen() { return this.yearinfo.yearlen } - get yearordinal () { + get yearordinal() { return this.yearinfo.yearordinal } - get mrange () { + get mrange() { return this.yearinfo.mrange } - get wdaymask () { + get wdaymask() { return this.yearinfo.wdaymask } - get mmask () { + get mmask() { return this.yearinfo.mmask } - get wnomask () { + get wnomask() { return this.yearinfo.wnomask } - get nwdaymask () { + get nwdaymask() { return this.monthinfo ? this.monthinfo.nwdaymask : [] } - get nextyearlen () { + get nextyearlen() { return this.yearinfo.nextyearlen } - get mdaymask () { + get mdaymask() { return this.yearinfo.mdaymask } - get nmdaymask () { + get nmdaymask() { return this.yearinfo.nmdaymask } - ydayset () { + ydayset() { return [range(this.yearlen), 0, this.yearlen] } - mdayset (_: any, month: number, __: any) { + mdayset(_: unknown, month: number) { const start = this.mrange[month - 1] const end = this.mrange[month] const set = repeat(null, this.yearlen) @@ -107,12 +108,10 @@ export default class Iterinfo { return [set, start, end] } - wdayset (year: number, month: number, day: number) { + wdayset(year: number, month: number, day: number) { // We need to handle cross-year weeks here. const set = repeat(null, this.yearlen + 7) - let i = - dateutil.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal + let i = toOrdinal(datetime(year, month, day)) - this.yearordinal const start = i for (let j = 0; j < 7; j++) { set[i] = i @@ -122,52 +121,60 @@ export default class Iterinfo { return [set, start, i] } - ddayset (year: number, month: number, day: number) { + ddayset(year: number, month: number, day: number) { const set = repeat(null, this.yearlen) as (number | null)[] - const i = - dateutil.toOrdinal(new Date(Date.UTC(year, month - 1, day))) - - this.yearordinal + const i = toOrdinal(datetime(year, month, day)) - this.yearordinal set[i] = i return [set, i, i + 1] } - htimeset (hour: number, _: number, second: number, millisecond: number) { + htimeset(hour: number, _: number, second: number, millisecond: number) { let set: Time[] = [] - this.options.byminute.forEach(minute => { + this.options.byminute.forEach((minute) => { set = set.concat(this.mtimeset(hour, minute, second, millisecond)) }) - dateutil.sort(set) + sort(set) return set } - mtimeset (hour: number, minute: number, _: number, millisecond: number) { - const set = this.options.bysecond.map(second => - new Time(hour, minute, second, millisecond) + mtimeset(hour: number, minute: number, _: number, millisecond: number) { + const set = this.options.bysecond.map( + (second) => new Time(hour, minute, second, millisecond) ) - dateutil.sort(set) + sort(set) return set } - stimeset (hour: number, minute: number, second: number, millisecond: number) { + stimeset(hour: number, minute: number, second: number, millisecond: number) { return [new Time(hour, minute, second, millisecond)] } - getdayset (freq: Frequency): (y: number, m: number, d: number) => DaySet { + getdayset(freq: Frequency): (y: number, m: number, d: number) => DaySet { switch (freq) { - case Frequency.YEARLY: return this.ydayset.bind(this) - case Frequency.MONTHLY: return this.mdayset.bind(this) - case Frequency.WEEKLY: return this.wdayset.bind(this) - case Frequency.DAILY: return this.ddayset.bind(this) - default: return this.ddayset.bind(this) + case Frequency.YEARLY: + return this.ydayset.bind(this) + case Frequency.MONTHLY: + return this.mdayset.bind(this) + case Frequency.WEEKLY: + return this.wdayset.bind(this) + case Frequency.DAILY: + return this.ddayset.bind(this) + default: + return this.ddayset.bind(this) } } - gettimeset (freq: Frequency.HOURLY | Frequency.MINUTELY | Frequency.SECONDLY): (h: number, m: number, s: number, ms: number) => Time[] { + gettimeset( + freq: Frequency.HOURLY | Frequency.MINUTELY | Frequency.SECONDLY + ): (h: number, m: number, s: number, ms: number) => Time[] { switch (freq) { - case Frequency.HOURLY: return this.htimeset.bind(this) - case Frequency.MINUTELY: return this.mtimeset.bind(this) - case Frequency.SECONDLY: return this.stimeset.bind(this) + case Frequency.HOURLY: + return this.htimeset.bind(this) + case Frequency.MINUTELY: + return this.mtimeset.bind(this) + case Frequency.SECONDLY: + return this.stimeset.bind(this) } } } diff --git a/src/iterinfo/monthinfo.ts b/src/iterinfo/monthinfo.ts index 4c4ab746..96dea471 100644 --- a/src/iterinfo/monthinfo.ts +++ b/src/iterinfo/monthinfo.ts @@ -1,5 +1,5 @@ import { ParsedOptions } from '../types' -import RRule from '../rrule' +import { RRule } from '../rrule' import { empty, repeat, pymod } from '../helpers' export interface MonthInfo { @@ -8,7 +8,7 @@ export interface MonthInfo { nwdaymask: number[] } -export function rebuildMonth ( +export function rebuildMonth( year: number, month: number, yearlen: number, @@ -19,7 +19,7 @@ export function rebuildMonth ( const result: MonthInfo = { lastyear: year, lastmonth: month, - nwdaymask: [] + nwdaymask: [], } let ranges: number[][] = [] @@ -49,9 +49,9 @@ export function rebuildMonth ( const first = rang[0] const last = rang[1] - 1 - for (let k = 0; k < options.bynweekday!.length; k++) { + for (let k = 0; k < options.bynweekday.length; k++) { let i - const [ wday, n ] = options.bynweekday![k] + const [wday, n] = options.bynweekday[k] if (n < 0) { i = last + (n + 1) * 7 i -= pymod(wdaymask[i] - wday, 7) diff --git a/src/iterinfo/yearinfo.ts b/src/iterinfo/yearinfo.ts index 3ac5cc0b..a34d2070 100644 --- a/src/iterinfo/yearinfo.ts +++ b/src/iterinfo/yearinfo.ts @@ -1,7 +1,17 @@ import { ParsedOptions } from '../types' -import dateutil from '../dateutil' +import { datetime, getWeekday, isLeapYear, toOrdinal } from '../dateutil' import { empty, repeat, pymod, includes } from '../helpers' -import { M365MASK, MDAY365MASK, NMDAY365MASK, WDAYMASK, M365RANGE, M366MASK, MDAY366MASK, NMDAY366MASK, M366RANGE } from '../masks' +import { + M365MASK, + MDAY365MASK, + NMDAY365MASK, + WDAYMASK, + M365RANGE, + M366MASK, + MDAY366MASK, + NMDAY366MASK, + M366RANGE, +} from '../masks' export interface YearInfo { yearlen: 365 | 366 @@ -16,13 +26,13 @@ export interface YearInfo { wnomask: number[] | null } -export function rebuildYear (year: number, options: ParsedOptions) { - const firstyday = new Date(Date.UTC(year, 0, 1)) +export function rebuildYear(year: number, options: ParsedOptions) { + const firstyday = datetime(year, 1, 1) - const yearlen = dateutil.isLeapYear(year) ? 366 : 365 - const nextyearlen = dateutil.isLeapYear(year + 1) ? 366 : 365 - const yearordinal = dateutil.toOrdinal(firstyday) - const yearweekday = dateutil.getWeekday(firstyday) + const yearlen = isLeapYear(year) ? 366 : 365 + const nextyearlen = isLeapYear(year + 1) ? 366 : 365 + const yearordinal = toOrdinal(firstyday) + const yearweekday = getWeekday(firstyday) const result: YearInfo = { yearlen, @@ -30,7 +40,7 @@ export function rebuildYear (year: number, options: ParsedOptions) { yearordinal, yearweekday, ...baseYearMasks(year), - wnomask: null + wnomask: null, } if (empty(options.byweekno)) { @@ -40,14 +50,13 @@ export function rebuildYear (year: number, options: ParsedOptions) { result.wnomask = repeat(0, yearlen + 7) as number[] let firstwkst: number let wyearlen: number - let no1wkst = firstwkst = pymod(7 - yearweekday + options.wkst, 7) + let no1wkst = (firstwkst = pymod(7 - yearweekday + options.wkst, 7)) if (no1wkst >= 4) { no1wkst = 0 // Number of days in the year, plus the days we got // from last year. - wyearlen = - result.yearlen + pymod(yearweekday - options.wkst, 7) + wyearlen = result.yearlen + pymod(yearweekday - options.wkst, 7) } else { // Number of days in the year, minus the days we // left in last year. @@ -109,16 +118,11 @@ export function rebuildYear (year: number, options: ParsedOptions) { // this year. let lnumweeks: number if (!includes(options.byweekno, -1)) { - const lyearweekday = dateutil.getWeekday( - new Date(Date.UTC(year - 1, 0, 1)) - ) + const lyearweekday = getWeekday(datetime(year - 1, 1, 1)) - let lno1wkst = pymod( - 7 - lyearweekday.valueOf() + options.wkst, - 7 - ) + let lno1wkst = pymod(7 - lyearweekday.valueOf() + options.wkst, 7) - const lyearlen = dateutil.isLeapYear(year - 1) ? 366 : 365 + const lyearlen = isLeapYear(year - 1) ? 366 : 365 let weekst: number if (lno1wkst >= 4) { lno1wkst = 0 @@ -140,10 +144,10 @@ export function rebuildYear (year: number, options: ParsedOptions) { return result } -function baseYearMasks (year: number) { - const yearlen = dateutil.isLeapYear(year) ? 366 : 365 - const firstyday = new Date(Date.UTC(year, 0, 1)) - const wday = dateutil.getWeekday(firstyday) +function baseYearMasks(year: number) { + const yearlen = isLeapYear(year) ? 366 : 365 + const firstyday = datetime(year, 1, 1) + const wday = getWeekday(firstyday) if (yearlen === 365) { return { @@ -151,7 +155,7 @@ function baseYearMasks (year: number) { mdaymask: MDAY365MASK, nmdaymask: NMDAY365MASK, wdaymask: WDAYMASK.slice(wday), - mrange: M365RANGE + mrange: M365RANGE, } } @@ -160,6 +164,6 @@ function baseYearMasks (year: number) { mdaymask: MDAY366MASK, nmdaymask: NMDAY366MASK, wdaymask: WDAYMASK.slice(wday), - mrange: M366RANGE + mrange: M366RANGE, } } diff --git a/src/iterresult.ts b/src/iterresult.ts index d7111847..49650c71 100644 --- a/src/iterresult.ts +++ b/src/iterresult.ts @@ -23,19 +23,19 @@ export default class IterResult { public _result: Date[] = [] public total = 0 - constructor (method: M, args: Partial) { + constructor(method: M, args: Partial) { this.method = method this.args = args if (method === 'between') { this.maxDate = args.inc - ? args.before! - : new Date(args.before!.getTime() - 1) - this.minDate = args.inc ? args.after! : new Date(args.after!.getTime() + 1) + ? args.before + : new Date(args.before.getTime() - 1) + this.minDate = args.inc ? args.after : new Date(args.after.getTime() + 1) } else if (method === 'before') { - this.maxDate = args.inc ? args.dt! : new Date(args.dt!.getTime() - 1) + this.maxDate = args.inc ? args.dt : new Date(args.dt.getTime() - 1) } else if (method === 'after') { - this.minDate = args.inc ? args.dt! : new Date(args.dt!.getTime() + 1) + this.minDate = args.inc ? args.dt : new Date(args.dt.getTime() + 1) } } @@ -43,11 +43,11 @@ export default class IterResult { * Possibly adds a date into the result. * * @param {Date} date - the date isn't necessarly added to the result - * list (if it is too late/too early) + * list (if it is too late/too early) * @return {Boolean} true if it makes sense to continue the iteration - * false if we're done. + * false if we're done. */ - accept (date: Date) { + accept(date: Date) { ++this.total const tooEarly = this.minDate && date < this.minDate const tooLate = this.maxDate && date > this.maxDate @@ -71,7 +71,7 @@ export default class IterResult { * @param {Date} date that is part of the result. * @return {Boolean} whether we are interested in more values. */ - add (date: Date) { + add(date: Date) { this._result.push(date) return true } @@ -79,9 +79,10 @@ export default class IterResult { /** * 'before' and 'after' return only one date, whereas 'all' * and 'between' an array. + * * @return {Date,Array?} */ - getValue (): IterResultType { + getValue(): IterResultType { const res = this._result switch (this.method) { case 'all': @@ -94,7 +95,7 @@ export default class IterResult { } } - clone () { + clone() { return new IterResult(this.method, this.args) } } diff --git a/src/iterset.ts b/src/iterset.ts index 393a1dc5..79395189 100644 --- a/src/iterset.ts +++ b/src/iterset.ts @@ -1,11 +1,11 @@ import IterResult from './iterresult' -import RRule from './rrule' +import { RRule } from './rrule' import { DateWithZone } from './datewithzone' -import { iter } from './iter/index' -import dateutil from './dateutil' +import { iter } from './iter' +import { sort } from './dateutil' import { QueryMethodTypes, IterResultType } from './types' -export function iterSet ( +export function iterSet( iterResult: IterResult, _rrule: RRule[], _exrule: RRule[], @@ -16,7 +16,7 @@ export function iterSet ( const _exdateHash: { [k: number]: boolean } = {} const _accept = iterResult.accept - function evalExdate (after: Date, before: Date) { + function evalExdate(after: Date, before: Date) { _exrule.forEach(function (rrule) { rrule.between(after, before, true).forEach(function (date) { _exdateHash[Number(date)] = true @@ -31,6 +31,7 @@ export function iterSet ( iterResult.accept = function (date) { const dt = Number(date) + if (isNaN(dt)) return _accept.call(this, date) if (!_exdateHash[dt]) { evalExdate(new Date(dt - 1), new Date(dt + 1)) if (!_exdateHash[dt]) { @@ -42,7 +43,7 @@ export function iterSet ( } if (iterResult.method === 'between') { - evalExdate(iterResult.args.after!, iterResult.args.before!) + evalExdate(iterResult.args.after, iterResult.args.before) iterResult.accept = function (date) { const dt = Number(date) if (!_exdateHash[dt]) { @@ -63,7 +64,7 @@ export function iterSet ( }) const res = iterResult._result - dateutil.sort(res) + sort(res) switch (iterResult.method) { case 'all': case 'between': diff --git a/src/masks.ts b/src/masks.ts index 42505b10..9f522e77 100644 --- a/src/masks.ts +++ b/src/masks.ts @@ -1,4 +1,4 @@ -import { range, repeat, clone } from './helpers' +import { range, repeat } from './helpers' // ============================================================================= // Date masks @@ -19,7 +19,7 @@ const M365MASK = [ ...repeat(10, 31), ...repeat(11, 30), ...repeat(12, 31), - ...repeat(1, 7) + ...repeat(1, 7), ] const M366MASK = [ @@ -35,7 +35,7 @@ const M366MASK = [ ...repeat(10, 31), ...repeat(11, 30), ...repeat(12, 31), - ...repeat(1, 7) + ...repeat(1, 7), ] const M28 = range(1, 29) @@ -56,7 +56,7 @@ const MDAY366MASK = [ ...M31, ...M30, ...M31, - ...M31.slice(0, 7) + ...M31.slice(0, 7), ] const MDAY365MASK = [ @@ -72,7 +72,7 @@ const MDAY365MASK = [ ...M31, ...M30, ...M31, - ...M31.slice(0, 7) + ...M31.slice(0, 7), ] const NM28 = range(-28, 0) @@ -93,7 +93,7 @@ const NMDAY366MASK = [ ...NM31, ...NM30, ...NM31, - ...NM31.slice(0, 7) + ...NM31.slice(0, 7), ] const NMDAY365MASK = [ @@ -109,7 +109,7 @@ const NMDAY365MASK = [ ...NM31, ...NM30, ...NM31, - ...NM31.slice(0, 7) + ...NM31.slice(0, 7), ] const M366RANGE = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] @@ -130,5 +130,5 @@ export { MDAY365MASK, MDAY366MASK, NMDAY365MASK, - NMDAY366MASK + NMDAY366MASK, } diff --git a/src/nlp/i18n.ts b/src/nlp/i18n.ts index 63941b3b..1b2e3953 100644 --- a/src/nlp/i18n.ts +++ b/src/nlp/i18n.ts @@ -12,19 +12,33 @@ export interface Language { const ENGLISH: Language = { dayNames: [ - 'Sunday', 'Monday', 'Tuesday', 'Wednesday', - 'Thursday', 'Friday', 'Saturday' + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', ], monthNames: [ - 'January', 'February', 'March', 'April', 'May', - 'June', 'July', 'August', 'September', 'October', - 'November', 'December' + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', ], tokens: { - 'SKIP': /^[ \r\n\t]+|^\.$/, - 'number': /^[1-9][0-9]*/, - 'numberAsText': /^(one|two|three)/i, - 'every': /^every/i, + SKIP: /^[ \r\n\t]+|^\.$/, + number: /^[1-9][0-9]*/, + numberAsText: /^(one|two|three)/i, + every: /^every/i, 'day(s)': /^days?/i, 'weekday(s)': /^weekdays?/i, 'week(s)': /^weeks?/i, @@ -32,38 +46,38 @@ const ENGLISH: Language = { 'minute(s)': /^minutes?/i, 'month(s)': /^months?/i, 'year(s)': /^years?/i, - 'on': /^(on|in)/i, - 'at': /^(at)/i, - 'the': /^the/i, - 'first': /^first/i, - 'second': /^second/i, - 'third': /^third/i, - 'nth': /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, - 'last': /^last/i, - 'for': /^for/i, + on: /^(on|in)/i, + at: /^(at)/i, + the: /^the/i, + first: /^first/i, + second: /^second/i, + third: /^third/i, + nth: /^([1-9][0-9]*)(\.|th|nd|rd|st)/i, + last: /^last/i, + for: /^for/i, 'time(s)': /^times?/i, - 'until': /^(un)?til/i, - 'monday': /^mo(n(day)?)?/i, - 'tuesday': /^tu(e(s(day)?)?)?/i, - 'wednesday': /^we(d(n(esday)?)?)?/i, - 'thursday': /^th(u(r(sday)?)?)?/i, - 'friday': /^fr(i(day)?)?/i, - 'saturday': /^sa(t(urday)?)?/i, - 'sunday': /^su(n(day)?)?/i, - 'january': /^jan(uary)?/i, - 'february': /^feb(ruary)?/i, - 'march': /^mar(ch)?/i, - 'april': /^apr(il)?/i, - 'may': /^may/i, - 'june': /^june?/i, - 'july': /^july?/i, - 'august': /^aug(ust)?/i, - 'september': /^sep(t(ember)?)?/i, - 'october': /^oct(ober)?/i, - 'november': /^nov(ember)?/i, - 'december': /^dec(ember)?/i, - 'comma': /^(,\s*|(and|or)\s*)+/i - } + until: /^(un)?til/i, + monday: /^mo(n(day)?)?/i, + tuesday: /^tu(e(s(day)?)?)?/i, + wednesday: /^we(d(n(esday)?)?)?/i, + thursday: /^th(u(r(sday)?)?)?/i, + friday: /^fr(i(day)?)?/i, + saturday: /^sa(t(urday)?)?/i, + sunday: /^su(n(day)?)?/i, + january: /^jan(uary)?/i, + february: /^feb(ruary)?/i, + march: /^mar(ch)?/i, + april: /^apr(il)?/i, + may: /^may/i, + june: /^june?/i, + july: /^july?/i, + august: /^aug(ust)?/i, + september: /^sep(t(ember)?)?/i, + october: /^oct(ober)?/i, + november: /^nov(ember)?/i, + december: /^dec(ember)?/i, + comma: /^(,\s*|(and|or)\s*)+/i, + }, } export default ENGLISH diff --git a/src/nlp/index.ts b/src/nlp/index.ts index f18da328..f420d72c 100644 --- a/src/nlp/index.ts +++ b/src/nlp/index.ts @@ -1,17 +1,18 @@ import ToText, { DateFormatter, GetText } from './totext' import parseText from './parsetext' -import RRule from '../index' +import { RRule } from '../rrule' +import { Frequency } from '../types' import ENGLISH, { Language } from './i18n' -/*! -* rrule.js - Library for working with recurrence rules for calendar dates. -* https://github.com/jakubroztocil/rrule -* -* Copyright 2010, Jakub Roztocil and Lars Schoning -* Licenced under the BSD licence. -* https://github.com/jakubroztocil/rrule/blob/master/LICENCE -* -*/ +/* ! + * rrule.js - Library for working with recurrence rules for calendar dates. + * https://github.com/jakubroztocil/rrule + * + * Copyright 2010, Jakub Roztocil and Lars Schoning + * Licenced under the BSD licence. + * https://github.com/jakubroztocil/rrule/blob/master/LICENCE + * + */ /** * @@ -34,13 +35,13 @@ import ENGLISH, { Language } from './i18n' * RULES * * Every ([n]) - * day(s) - * | [weekday], ..., (and) [weekday] - * | weekday(s) - * | week(s) - * | month(s) - * | [month], ..., (and) [month] - * | year(s) + * day(s) + * | [weekday], ..., (and) [weekday] + * | weekday(s) + * | week(s) + * | month(s) + * | [month], ..., (and) [month] + * | year(s) * * * Plus 0, 1, or multiple of these: @@ -66,10 +67,10 @@ import ENGLISH, { Language } from './i18n' * Definitely no supported for parsing: * * (for year): - * in week(s) [n], ..., (and) [n] + * in week(s) [n], ..., (and) [n] * - * on the [yearday], ..., (and) [n] day of the year - * on day [yearday], ..., (and) [n] + * on the [yearday], ..., (and) [n] day of the year + * on day [yearday], ..., (and) [n] * * * NON-TERMINALS @@ -80,10 +81,10 @@ import ENGLISH, { Language } from './i18n' * [nth-weekday]: first [weekday], 2nd [weekday], ... last [weekday], ... * [monthday]: first, 1., 2., 1st, 2nd, second, ... 31st, last day, 2nd last day, .. * [date]: - * [month] (0-31(,) ([year])), - * (the) 0-31.(1-12.([year])), - * (the) 0-31/(1-12/([year])), - * [weekday] + * - [month] (0-31(,) ([year])), + * - (the) 0-31.(1-12.([year])), + * - (the) 0-31/(1-12/([year])), + * - [weekday] * * [year]: 0000, 0001, ... 01, 02, .. * @@ -104,22 +105,27 @@ const common = [ 'interval', 'byweekday', 'bymonthday', - 'bymonth' + 'bymonth', ] ToText.IMPLEMENTED = [] -ToText.IMPLEMENTED[RRule.HOURLY] = common -ToText.IMPLEMENTED[RRule.MINUTELY] = common -ToText.IMPLEMENTED[RRule.DAILY] = ['byhour'].concat(common) -ToText.IMPLEMENTED[RRule.WEEKLY] = common -ToText.IMPLEMENTED[RRule.MONTHLY] = common -ToText.IMPLEMENTED[RRule.YEARLY] = ['byweekno', 'byyearday'].concat(common) +ToText.IMPLEMENTED[Frequency.HOURLY] = common +ToText.IMPLEMENTED[Frequency.MINUTELY] = common +ToText.IMPLEMENTED[Frequency.DAILY] = ['byhour'].concat(common) +ToText.IMPLEMENTED[Frequency.WEEKLY] = common +ToText.IMPLEMENTED[Frequency.MONTHLY] = common +ToText.IMPLEMENTED[Frequency.YEARLY] = ['byweekno', 'byyearday'].concat(common) // ============================================================================= // Export // ============================================================================= -const toText = function (rrule: RRule, gettext?: GetText, language?: Language, dateFormatter?: DateFormatter) { +const toText = function ( + rrule: RRule, + gettext?: GetText, + language?: Language, + dateFormatter?: DateFormatter +) { return new ToText(rrule, gettext, language, dateFormatter).toString() } diff --git a/src/nlp/parsetext.ts b/src/nlp/parsetext.ts index 089de0d0..fbaeccf9 100644 --- a/src/nlp/parsetext.ts +++ b/src/nlp/parsetext.ts @@ -1,6 +1,6 @@ import ENGLISH, { Language } from './i18n' -import RRule from '../index' -import { Options } from '../types' +import { RRule } from '../rrule' +import { ByWeekday, Options } from '../types' import { WeekdayStr } from '../weekday' // ============================================================================= @@ -14,24 +14,23 @@ class Parser { public value: RegExpExecArray | null private done = true - constructor (rules: { [k: string]: RegExp }) { + constructor(rules: { [k: string]: RegExp }) { this.rules = rules } - start (text: string) { + start(text: string) { this.text = text this.done = false return this.nextSymbol() } - isDone () { + isDone() { return this.done && this.symbol === null } - nextSymbol () { + nextSymbol() { let best: RegExpExecArray | null let bestSymbol: string - const p = this this.symbol = null this.value = null @@ -40,9 +39,9 @@ class Parser { let rule: RegExp best = null - for (let name in this.rules) { + for (const name in this.rules) { rule = this.rules[name] - const match = rule.exec(p.text) + const match = rule.exec(this.text) if (match) { if (best === null || match[0].length > best[0].length) { best = match @@ -63,16 +62,14 @@ class Parser { this.value = null return } - // @ts-ignore } while (bestSymbol === 'SKIP') - // @ts-ignore this.symbol = bestSymbol this.value = best return true } - accept (name: string) { + accept(name: string) { if (this.symbol === name) { if (this.value) { const v = this.value @@ -87,18 +84,18 @@ class Parser { return false } - acceptNumber () { + acceptNumber() { return this.accept('number') as RegExpExecArray } - expect (name: string) { + expect(name: string) { if (this.accept(name)) return true throw new Error('expected ' + name + ' but found ' + this.symbol) } } -export default function parseText (text: string, language: Language = ENGLISH) { +export default function parseText(text: string, language: Language = ENGLISH) { const options: Partial = {} const ttr = new Parser(language.tokens) @@ -107,10 +104,10 @@ export default function parseText (text: string, language: Language = ENGLISH) { S() return options - function S () { + function S() { // every [n] ttr.expect('every') - let n = ttr.acceptNumber() + const n = ttr.acceptNumber() if (n) options.interval = parseInt(n[0], 10) if (ttr.isDone()) throw new Error('Unexpected end') @@ -127,14 +124,9 @@ export default function parseText (text: string, language: Language = ENGLISH) { // DAILY on weekdays is not a valid rule case 'weekday(s)': options.freq = RRule.WEEKLY - options.byweekday = [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR - ] + options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR] ttr.nextSymbol() + AT() F() break @@ -142,6 +134,7 @@ export default function parseText (text: string, language: Language = ENGLISH) { options.freq = RRule.WEEKLY if (ttr.nextSymbol()) { ON() + AT() F() } break @@ -186,7 +179,9 @@ export default function parseText (text: string, language: Language = ENGLISH) { case 'saturday': case 'sunday': options.freq = RRule.WEEKLY - const key: WeekdayStr = ttr.symbol.substr(0, 2).toUpperCase() as WeekdayStr + const key: WeekdayStr = ttr.symbol + .substr(0, 2) + .toUpperCase() as WeekdayStr options.byweekday = [RRule[key]] if (!ttr.nextSymbol()) return @@ -195,15 +190,17 @@ export default function parseText (text: string, language: Language = ENGLISH) { while (ttr.accept('comma')) { if (ttr.isDone()) throw new Error('Unexpected end') - let wkd = decodeWKD() as keyof typeof RRule + const wkd = decodeWKD() as keyof typeof RRule if (!wkd) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected weekday') + throw new Error( + 'Unexpected symbol ' + ttr.symbol + ', expected weekday' + ) } - // @ts-ignore - options.byweekday.push(RRule[wkd]) + options.byweekday.push(RRule[wkd] as ByWeekday) ttr.nextSymbol() } + AT() MDAYs() F() break @@ -229,9 +226,11 @@ export default function parseText (text: string, language: Language = ENGLISH) { while (ttr.accept('comma')) { if (ttr.isDone()) throw new Error('Unexpected end') - let m = decodeM() + const m = decodeM() if (!m) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected month') + throw new Error( + 'Unexpected symbol ' + ttr.symbol + ', expected month' + ) } options.bymonth.push(m) @@ -247,15 +246,15 @@ export default function parseText (text: string, language: Language = ENGLISH) { } } - function ON () { + function ON() { const on = ttr.accept('on') const the = ttr.accept('the') if (!(on || the)) return do { - let nth = decodeNTH() - let wkd = decodeWKD() - let m = decodeM() + const nth = decodeNTH() + const wkd = decodeWKD() + const m = decodeM() // nth | if (nth) { @@ -263,60 +262,54 @@ export default function parseText (text: string, language: Language = ENGLISH) { if (wkd) { ttr.nextSymbol() - if (!options.byweekday) options.byweekday = [] - // @ts-ignore - options.byweekday.push(RRule[wkd].nth(nth)) + if (!options.byweekday) options.byweekday = [] as ByWeekday[] + ;(options.byweekday as ByWeekday[]).push( + RRule[wkd as WeekdayStr].nth(nth) + ) } else { - if (!options.bymonthday) options.bymonthday = [] - // @ts-ignore - options.bymonthday.push(nth) + if (!options.bymonthday) options.bymonthday = [] as number[] + ;(options.bymonthday as number[]).push(nth) ttr.accept('day(s)') } // } else if (wkd) { ttr.nextSymbol() - if (!options.byweekday) options.byweekday = [] - - // @ts-ignore - options.byweekday.push(RRule[wkd]) + if (!options.byweekday) options.byweekday = [] as ByWeekday[] + ;(options.byweekday as ByWeekday[]).push(RRule[wkd as WeekdayStr]) } else if (ttr.symbol === 'weekday(s)') { ttr.nextSymbol() if (!options.byweekday) { - options.byweekday = [ - RRule.MO, - RRule.TU, - RRule.WE, - RRule.TH, - RRule.FR - ] + options.byweekday = [RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR] } } else if (ttr.symbol === 'week(s)') { ttr.nextSymbol() let n = ttr.acceptNumber() if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + ', expected week number') + throw new Error( + 'Unexpected symbol ' + ttr.symbol + ', expected week number' + ) } options.byweekno = [parseInt(n[0], 10)] while (ttr.accept('comma')) { n = ttr.acceptNumber() if (!n) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday') + throw new Error( + 'Unexpected symbol ' + ttr.symbol + '; expected monthday' + ) } options.byweekno.push(parseInt(n[0], 10)) } } else if (m) { ttr.nextSymbol() - if (!options.bymonth) options.bymonth = [] - - // @ts-ignore - options.bymonth.push(m) + if (!options.bymonth) options.bymonth = [] as number[] + ;(options.bymonth as number[]).push(m) } else { return } } while (ttr.accept('comma') || ttr.accept('the') || ttr.accept('on')) } - function AT () { + function AT() { const at = ttr.accept('at') if (!at) return @@ -336,7 +329,7 @@ export default function parseText (text: string, language: Language = ENGLISH) { } while (ttr.accept('comma') || ttr.accept('at')) } - function decodeM () { + function decodeM() { switch (ttr.symbol) { case 'january': return 1 @@ -367,7 +360,7 @@ export default function parseText (text: string, language: Language = ENGLISH) { } } - function decodeWKD () { + function decodeWKD() { switch (ttr.symbol) { case 'monday': case 'tuesday': @@ -382,7 +375,7 @@ export default function parseText (text: string, language: Language = ENGLISH) { } } - function decodeNTH () { + function decodeNTH() { switch (ttr.symbol) { case 'last': ttr.nextSymbol() @@ -397,7 +390,7 @@ export default function parseText (text: string, language: Language = ENGLISH) { ttr.nextSymbol() return ttr.accept('last') ? -3 : 3 case 'nth': - const v = parseInt(ttr.value![1], 10) + const v = parseInt(ttr.value[1], 10) if (v < -366 || v > 366) throw new Error('Nth out of range: ' + v) ttr.nextSymbol() @@ -408,7 +401,7 @@ export default function parseText (text: string, language: Language = ENGLISH) { } } - function MDAYs () { + function MDAYs() { ttr.accept('on') ttr.accept('the') @@ -421,7 +414,9 @@ export default function parseText (text: string, language: Language = ENGLISH) { while (ttr.accept('comma')) { nth = decodeNTH() if (!nth) { - throw new Error('Unexpected symbol ' + ttr.symbol + '; expected monthday') + throw new Error( + 'Unexpected symbol ' + ttr.symbol + '; expected monthday' + ) } options.bymonthday.push(nth) @@ -429,14 +424,14 @@ export default function parseText (text: string, language: Language = ENGLISH) { } } - function F () { + function F() { if (ttr.symbol === 'until') { const date = Date.parse(ttr.text) if (!date) throw new Error('Cannot parse until date:' + ttr.text) options.until = new Date(date) } else if (ttr.accept('for')) { - options.count = parseInt(ttr.value![0], 10) + options.count = parseInt(ttr.value[0], 10) ttr.expect('number') // ttr.expect('times') } diff --git a/src/nlp/totext.ts b/src/nlp/totext.ts index 210834a3..e77fd123 100644 --- a/src/nlp/totext.ts +++ b/src/nlp/totext.ts @@ -1,8 +1,8 @@ import ENGLISH, { Language } from './i18n' -import RRule from '../index' +import { RRule } from '../rrule' import { Options, ByWeekday } from '../types' import { Weekday } from '../weekday' -import { isArray, isNumber, isPresent, padStart } from '../helpers' +import { isArray, isNumber, isPresent } from '../helpers' // ============================================================================= // Helper functions @@ -21,11 +21,15 @@ const contains = function (arr: string[], val: string) { export type GetText = (id: string | number | Weekday) => string -const defaultGetText: GetText = id => id.toString() +const defaultGetText: GetText = (id) => id.toString() export type DateFormatter = (year: number, month: string, day: number) => string -const defaultDateFormatter: DateFormatter = (year: number, month: string, day: number) => `${month} ${day}, ${year}` +const defaultDateFormatter: DateFormatter = ( + year: number, + month: string, + day: number +) => `${month} ${day}, ${year}` /** * @@ -52,7 +56,12 @@ export default class ToText { isEveryDay: boolean } | null - constructor (rrule: RRule, gettext: GetText = defaultGetText, language: Language = ENGLISH, dateFormatter: DateFormatter = defaultDateFormatter) { + constructor( + rrule: RRule, + gettext: GetText = defaultGetText, + language: Language = ENGLISH, + dateFormatter: DateFormatter = defaultDateFormatter + ) { this.text = [] this.language = language || ENGLISH this.gettext = gettext @@ -62,8 +71,8 @@ export default class ToText { this.origOptions = rrule.origOptions if (this.origOptions.bymonthday) { - const bymonthday = ([] as number[]).concat(this.options.bymonthday!) - const bynmonthday = ([] as number[]).concat(this.options.bynmonthday!) + const bymonthday = ([] as number[]).concat(this.options.bymonthday) + const bynmonthday = ([] as number[]).concat(this.options.bynmonthday) bymonthday.sort((a, b) => a - b) bynmonthday.sort((a, b) => b - a) @@ -100,18 +109,18 @@ export default class ToText { days.indexOf('TH') !== -1 && days.indexOf('FR') !== -1 && days.indexOf('SA') !== -1 && - days.indexOf('SU') !== -1 + days.indexOf('SU') !== -1, } const sortWeekDays = function (a: Weekday, b: Weekday) { return a.weekday - b.weekday } - this.byweekday.allWeeks!.sort(sortWeekDays) - this.byweekday.someWeeks!.sort(sortWeekDays) + this.byweekday.allWeeks.sort(sortWeekDays) + this.byweekday.someWeeks.sort(sortWeekDays) - if (!this.byweekday.allWeeks!.length) this.byweekday.allWeeks = null - if (!this.byweekday.someWeeks!.length) this.byweekday.someWeeks = null + if (!this.byweekday.allWeeks.length) this.byweekday.allWeeks = null + if (!this.byweekday.someWeeks.length) this.byweekday.someWeeks = null } else { this.byweekday = null } @@ -119,24 +128,25 @@ export default class ToText { /** * Test whether the rrule can be fully converted to text. + * * @param {RRule} rrule * @return {Boolean} */ - static isFullyConvertible (rrule: RRule) { - let canConvert = true + static isFullyConvertible(rrule: RRule) { + const canConvert = true if (!(rrule.options.freq in ToText.IMPLEMENTED)) return false if (rrule.origOptions.until && rrule.origOptions.count) return false - for (let key in rrule.origOptions) { - if (contains(['dtstart', 'wkst', 'freq'], key)) return true + for (const key in rrule.origOptions) { + if (contains(['dtstart', 'tzid', 'wkst', 'freq'], key)) return true if (!contains(ToText.IMPLEMENTED[rrule.options.freq], key)) return false } return canConvert } - isFullyConvertible () { + isFullyConvertible() { return ToText.isFullyConvertible(this.rrule) } @@ -144,23 +154,31 @@ export default class ToText { * Perform the conversion. Only some of the frequencies are supported. * If some of the rrule's options aren't supported, they'll * be omitted from the output an "(~ approximate)" will be appended. + * * @return {*} */ - toString () { + toString() { const gettext = this.gettext - if (!(this.options.freq! in ToText.IMPLEMENTED)) { + if (!(this.options.freq in ToText.IMPLEMENTED)) { return gettext('RRule error: Unable to fully convert this rrule to text') } this.text = [gettext('every')] + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore this[RRule.FREQUENCIES[this.options.freq]]() if (this.options.until) { this.add(gettext('until')) const until = this.options.until - this.add(this.dateFormatter(until.getUTCFullYear(), this.language.monthNames[until.getUTCMonth()], until.getUTCDate())) + this.add( + this.dateFormatter( + until.getUTCFullYear(), + this.language.monthNames[until.getUTCMonth()], + until.getUTCDate() + ) + ) } else if (this.options.count) { this.add(gettext('for')) .add(this.options.count.toString()) @@ -174,44 +192,43 @@ export default class ToText { return this.text.join('') } - HOURLY () { + HOURLY() { const gettext = this.gettext - if (this.options.interval !== 1) this.add(this.options.interval!.toString()) + if (this.options.interval !== 1) this.add(this.options.interval.toString()) this.add( - this.plural(this.options.interval!) ? gettext('hours') : gettext('hour') + this.plural(this.options.interval) ? gettext('hours') : gettext('hour') ) } - MINUTELY () { + MINUTELY() { const gettext = this.gettext - if (this.options.interval !== 1) this.add(this.options.interval!.toString()) + if (this.options.interval !== 1) this.add(this.options.interval.toString()) this.add( - this.plural(this.options.interval!) + this.plural(this.options.interval) ? gettext('minutes') - : gettext('minutes') + : gettext('minute') ) } - DAILY () { + DAILY() { const gettext = this.gettext - if (this.options.interval !== 1) this.add(this.options.interval!.toString()) + if (this.options.interval !== 1) this.add(this.options.interval.toString()) if (this.byweekday && this.byweekday.isWeekdays) { this.add( - this.plural(this.options.interval!) + this.plural(this.options.interval) ? gettext('weekdays') : gettext('weekday') ) } else { this.add( - this.plural(this.options.interval!) ? gettext('days') : gettext('day') + this.plural(this.options.interval) ? gettext('days') : gettext('day') ) - } if (this.origOptions.bymonth) { @@ -228,12 +245,12 @@ export default class ToText { } } - WEEKLY () { + WEEKLY() { const gettext = this.gettext if (this.options.interval !== 1) { - this.add(this.options.interval!.toString()).add( - this.plural(this.options.interval!) ? gettext('weeks') : gettext('week') + this.add(this.options.interval.toString()).add( + this.plural(this.options.interval) ? gettext('weeks') : gettext('week') ) } @@ -249,7 +266,7 @@ export default class ToText { } } else if (this.byweekday && this.byweekday.isEveryDay) { this.add( - this.plural(this.options.interval!) ? gettext('days') : gettext('day') + this.plural(this.options.interval) ? gettext('days') : gettext('day') ) } else { if (this.options.interval === 1) this.add(gettext('week')) @@ -264,24 +281,30 @@ export default class ToText { } else if (this.byweekday) { this._byweekday() } + + if (this.origOptions.byhour) { + this._byhour() + } } } - MONTHLY () { + MONTHLY() { const gettext = this.gettext if (this.origOptions.bymonth) { if (this.options.interval !== 1) { - this.add(this.options.interval!.toString()).add(gettext('months')) - if (this.plural(this.options.interval!)) this.add(gettext('in')) + this.add(this.options.interval.toString()).add(gettext('months')) + if (this.plural(this.options.interval)) this.add(gettext('in')) } else { // this.add(gettext('MONTH')) } this._bymonth() } else { - if (this.options.interval !== 1) this.add(this.options.interval!.toString()) + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()) + } this.add( - this.plural(this.options.interval!) + this.plural(this.options.interval) ? gettext('months') : gettext('month') ) @@ -295,21 +318,23 @@ export default class ToText { } } - YEARLY () { + YEARLY() { const gettext = this.gettext if (this.origOptions.bymonth) { if (this.options.interval !== 1) { - this.add(this.options.interval!.toString()) + this.add(this.options.interval.toString()) this.add(gettext('years')) } else { // this.add(gettext('YEAR')) } this._bymonth() } else { - if (this.options.interval !== 1) this.add(this.options.interval!.toString()) + if (this.options.interval !== 1) { + this.add(this.options.interval.toString()) + } this.add( - this.plural(this.options.interval!) ? gettext('years') : gettext('year') + this.plural(this.options.interval) ? gettext('years') : gettext('year') ) } @@ -336,7 +361,7 @@ export default class ToText { } } - private _bymonthday () { + private _bymonthday() { const gettext = this.gettext if (this.byweekday && this.byweekday.allWeeks) { this.add(gettext('on')) @@ -344,55 +369,54 @@ export default class ToText { this.list(this.byweekday.allWeeks, this.weekdaytext, gettext('or')) ) .add(gettext('the')) - .add(this.list(this.bymonthday!, this.nth, gettext('or'))) + .add(this.list(this.bymonthday, this.nth, gettext('or'))) } else { this.add(gettext('on the')).add( - this.list(this.bymonthday!, this.nth, gettext('and')) + this.list(this.bymonthday, this.nth, gettext('and')) ) } // this.add(gettext('DAY')) } - private _byweekday () { + private _byweekday() { const gettext = this.gettext - if (this.byweekday!.allWeeks && !this.byweekday!.isWeekdays) { + if (this.byweekday.allWeeks && !this.byweekday.isWeekdays) { this.add(gettext('on')).add( - this.list(this.byweekday!.allWeeks!, this.weekdaytext) + this.list(this.byweekday.allWeeks, this.weekdaytext) ) } - if (this.byweekday!.someWeeks) { - if (this.byweekday!.allWeeks) this.add(gettext('and')) + if (this.byweekday.someWeeks) { + if (this.byweekday.allWeeks) this.add(gettext('and')) this.add(gettext('on the')).add( - this.list(this.byweekday!.someWeeks!, this.weekdaytext, gettext('and')) + this.list(this.byweekday.someWeeks, this.weekdaytext, gettext('and')) ) } } - private _byhour () { + private _byhour() { const gettext = this.gettext this.add(gettext('at')).add( - this.list(this.origOptions.byhour!, undefined, gettext('and')) + this.list(this.origOptions.byhour, undefined, gettext('and')) ) } - private _bymonth () { + private _bymonth() { this.add( - this.list(this.options.bymonth!, this.monthtext, this.gettext('and')) + this.list(this.options.bymonth, this.monthtext, this.gettext('and')) ) } - nth (n: number | string) { + nth(n: number | string) { n = parseInt(n.toString(), 10) let nth: string - let npos: number const gettext = this.gettext if (n === -1) return gettext('last') - npos = Math.abs(n) + const npos = Math.abs(n) switch (npos) { case 1: case 21: @@ -414,29 +438,34 @@ export default class ToText { return n < 0 ? nth + ' ' + gettext('last') : nth } - monthtext (m: number) { + monthtext(m: number) { return this.language.monthNames[m - 1] } - weekdaytext (wday: Weekday | number) { - const weekday = - isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday() + weekdaytext(wday: Weekday | number) { + const weekday = isNumber(wday) ? (wday + 1) % 7 : wday.getJsWeekday() return ( - ((wday as Weekday).n ? this.nth((wday as Weekday).n!) + ' ' : '') + this.language.dayNames[weekday] + ((wday as Weekday).n ? this.nth((wday as Weekday).n) + ' ' : '') + + this.language.dayNames[weekday] ) } - plural (n: number) { + plural(n: number) { return n % 100 !== 1 } - add (s: string) { + add(s: string) { this.text.push(' ') this.text.push(s) return this } - list (arr: ByWeekday | ByWeekday[], callback?: GetText, finalDelim?: string, delim: string = ',') { + list( + arr: ByWeekday | ByWeekday[], + callback?: GetText, + finalDelim?: string, + delim = ',' + ) { if (!isArray(arr)) { arr = [arr] } @@ -465,9 +494,9 @@ export default class ToText { function (o) { return o.toString() } - const self = this - const realCallback = function (arg: ByWeekday) { - return callback && callback.call(self, arg) + + const realCallback = (arg: ByWeekday) => { + return callback && callback.call(this, arg) } if (finalDelim) { diff --git a/src/optionstostring.ts b/src/optionstostring.ts index 6321712e..10086692 100644 --- a/src/optionstostring.ts +++ b/src/optionstostring.ts @@ -1,13 +1,13 @@ import { Options } from './types' -import RRule, { DEFAULT_OPTIONS } from './rrule' +import { RRule, DEFAULT_OPTIONS } from './rrule' import { includes, isPresent, isArray, isNumber, toArray } from './helpers' import { Weekday } from './weekday' -import dateutil from './dateutil' +import { timeToUntilString } from './dateutil' import { DateWithZone } from './datewithzone' -export function optionsToString (options: Partial) { - let rrule: string[][] = [] - let dtstart: string = '' +export function optionsToString(options: Partial) { + const rrule: string[][] = [] + let dtstart = '' const keys: (keyof Options)[] = Object.keys(options) as (keyof Options)[] const defaultKeys = Object.keys(DEFAULT_OPTIONS) @@ -16,14 +16,14 @@ export function optionsToString (options: Partial) { if (!includes(defaultKeys, keys[i])) continue let key = keys[i].toUpperCase() - const value: any = options[keys[i]] - let outValue: string = '' + const value = options[keys[i]] + let outValue = '' if (!isPresent(value) || (isArray(value) && !value.length)) continue switch (key) { case 'FREQ': - outValue = RRule.FREQUENCIES[options.freq!] + outValue = RRule.FREQUENCIES[options.freq] break case 'WKST': if (isNumber(value)) { @@ -33,7 +33,7 @@ export function optionsToString (options: Partial) { } break case 'BYWEEKDAY': - /* + /* NOTE: BYWEEKDAY is a special case. RRule() deconstructs the rule.options.byweekday array into an array of Weekday arguments. @@ -45,25 +45,29 @@ export function optionsToString (options: Partial) { */ key = 'BYDAY' - outValue = toArray(value).map(wday => { - if (wday instanceof Weekday) { - return wday - } - - if (isArray(wday)) { - return new Weekday(wday[0], wday[1]) - } - - return new Weekday(wday) - }).toString() + outValue = toArray( + value as Weekday | number[] | number + ) + .map((wday) => { + if (wday instanceof Weekday) { + return wday + } + + if (isArray(wday)) { + return new Weekday(wday[0], wday[1]) + } + + return new Weekday(wday) + }) + .toString() break case 'DTSTART': - dtstart = buildDtstart(value, options.tzid) + dtstart = buildDtstart(value as number, options.tzid) break case 'UNTIL': - outValue = dateutil.timeToUntilString(value, !options.tzid) + outValue = timeToUntilString(value as number, !options.tzid) break default: @@ -83,16 +87,18 @@ export function optionsToString (options: Partial) { } } - const rules = rrule.map(([key, value]) => `${key}=${value.toString()}`).join(';') + const rules = rrule + .map(([key, value]) => `${key}=${value.toString()}`) + .join(';') let ruleString = '' if (rules !== '') { ruleString = `RRULE:${rules}` } - return [ dtstart, ruleString ].filter(x => !!x).join('\n') + return [dtstart, ruleString].filter((x) => !!x).join('\n') } -function buildDtstart (dtstart?: number, tzid?: string | null) { +function buildDtstart(dtstart?: number, tzid?: string | null) { if (!dtstart) { return '' } diff --git a/src/parseoptions.ts b/src/parseoptions.ts index 4c83c572..60e2567f 100644 --- a/src/parseoptions.ts +++ b/src/parseoptions.ts @@ -1,38 +1,38 @@ import { Options, ParsedOptions, freqIsDailyOrGreater } from './types' -import { includes, notEmpty, isPresent, isNumber, isArray } from './helpers' -import RRule, { defaultKeys, DEFAULT_OPTIONS } from './rrule' -import dateutil from './dateutil' +import { + includes, + notEmpty, + isPresent, + isNumber, + isArray, + isWeekdayStr, +} from './helpers' +import { RRule, defaultKeys, DEFAULT_OPTIONS } from './rrule' +import { getWeekday, isDate, isValidDate } from './dateutil' import { Weekday } from './weekday' import { Time } from './datetime' -export function initializeOptions (options: Partial) { +export function initializeOptions(options: Partial) { const invalid: string[] = [] const keys = Object.keys(options) as (keyof Options)[] - const initializedOptions: Partial = {} // Shallow copy for options and origOptions and check for invalid - keys.forEach(key => { - const value = options[key] - initializedOptions[key] = value + for (const key of keys) { if (!includes(defaultKeys, key)) invalid.push(key) - if (dateutil.isDate(value) && !dateutil.isValidDate(value)) invalid.push(key) - }) + if (isDate(options[key]) && !isValidDate(options[key])) { + invalid.push(key) + } + } if (invalid.length) { throw new Error('Invalid options: ' + invalid.join(', ')) } - return initializedOptions + return { ...options } } -export function parseOptions (options: Partial) { - const opts = initializeOptions(options) - const keys = Object.keys(options) as (keyof Options)[] - - // Merge in default options - defaultKeys.forEach(key => { - if (!includes(keys, key) || !isPresent(opts[key])) opts[key] = DEFAULT_OPTIONS[key] - }) +export function parseOptions(options: Partial) { + const opts = { ...DEFAULT_OPTIONS, ...initializeOptions(options) } if (isPresent(opts.byeaster)) opts.freq = RRule.YEARLY @@ -83,7 +83,7 @@ export function parseOptions (options: Partial) { opts.bymonthday = opts.dtstart.getUTCDate() break case RRule.WEEKLY: - opts.byweekday = [dateutil.getWeekday(opts.dtstart)] + opts.byweekday = [getWeekday(opts.dtstart)] break } } @@ -139,6 +139,9 @@ export function parseOptions (options: Partial) { } else if (isNumber(opts.byweekday)) { opts.byweekday = [opts.byweekday] opts.bynweekday = null + } else if (isWeekdayStr(opts.byweekday)) { + opts.byweekday = [Weekday.fromStr(opts.byweekday).weekday] + opts.bynweekday = null } else if (opts.byweekday instanceof Weekday) { if (!opts.byweekday.n || opts.freq > RRule.MONTHLY) { opts.byweekday = [opts.byweekday.weekday] @@ -148,7 +151,7 @@ export function parseOptions (options: Partial) { opts.byweekday = null } } else { - const byweekday = [] + const byweekday: number[] = [] const bynweekday = [] for (let i = 0; i < opts.byweekday.length; i++) { @@ -157,13 +160,15 @@ export function parseOptions (options: Partial) { if (isNumber(wday)) { byweekday.push(wday) continue + } else if (isWeekdayStr(wday)) { + byweekday.push(Weekday.fromStr(wday).weekday) + continue } - const wd = wday as Weekday - if (!wd.n || opts.freq > RRule.MONTHLY) { - byweekday.push(wd.weekday) + if (!wday.n || opts.freq > RRule.MONTHLY) { + byweekday.push(wday.weekday) } else { - bynweekday.push([wd.weekday, wd.n]) + bynweekday.push([wday.weekday, wday.n]) } } opts.byweekday = notEmpty(byweekday) ? byweekday : null @@ -172,8 +177,7 @@ export function parseOptions (options: Partial) { // byhour if (!isPresent(opts.byhour)) { - opts.byhour = - opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null + opts.byhour = opts.freq < RRule.HOURLY ? [opts.dtstart.getUTCHours()] : null } else if (isNumber(opts.byhour)) { opts.byhour = [opts.byhour] } @@ -197,16 +201,16 @@ export function parseOptions (options: Partial) { return { parsedOptions: opts as ParsedOptions } } -export function buildTimeset (opts: ParsedOptions) { +export function buildTimeset(opts: ParsedOptions) { const millisecondModulo = opts.dtstart.getTime() % 1000 if (!freqIsDailyOrGreater(opts.freq)) { return [] } const timeset: Time[] = [] - opts.byhour.forEach(hour => { - opts.byminute.forEach(minute => { - opts.bysecond.forEach(second => { + opts.byhour.forEach((hour) => { + opts.byminute.forEach((minute) => { + opts.bysecond.forEach((second) => { timeset.push(new Time(hour, minute, second, millisecondModulo)) }) }) diff --git a/src/parsestring.ts b/src/parsestring.ts index b1b38e53..049de818 100644 --- a/src/parsestring.ts +++ b/src/parsestring.ts @@ -1,32 +1,37 @@ import { Options, Frequency } from './types' import { Weekday } from './weekday' -import dateutil from './dateutil' +import { untilStringToDate } from './dateutil' import { Days } from './rrule' -export function parseString (rfcString: string): Partial { - const options = rfcString.split('\n').map(parseLine).filter(x => x !== null) +export function parseString(rfcString: string): Partial { + const options = rfcString + .split('\n') + .map(parseLine) + .filter((x) => x !== null) return { ...options[0], ...options[1] } } -export function parseDtstart (line: string) { +export function parseDtstart(line: string) { const options: Partial = {} - const dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec(line) + const dtstartWithZone = /DTSTART(?:;TZID=([^:=]+?))?(?::|=)([^;\s]+)/i.exec( + line + ) if (!dtstartWithZone) { return options } - const [ _, tzid, dtstart ] = dtstartWithZone + const [, tzid, dtstart] = dtstartWithZone if (tzid) { options.tzid = tzid } - options.dtstart = dateutil.untilStringToDate(dtstart) + options.dtstart = untilStringToDate(dtstart) return options } -function parseLine (rfcString: string) { +function parseLine(rfcString: string) { rfcString = rfcString.replace(/^\s+|\s+$/, '') if (!rfcString.length) return null @@ -35,7 +40,7 @@ function parseLine (rfcString: string) { return parseRrule(rfcString) } - const [ _, key ] = header + const [, key] = header switch (key.toUpperCase()) { case 'RRULE': case 'EXRULE': @@ -47,14 +52,14 @@ function parseLine (rfcString: string) { } } -function parseRrule (line: string) { +function parseRrule(line: string) { const strippedLine = line.replace(/^RRULE:/i, '') const options = parseDtstart(strippedLine) const attrs = line.replace(/^(?:RRULE|EXRULE):/i, '').split(';') - attrs.forEach(attr => { - const [ key, value ] = attr.split('=') + attrs.forEach((attr) => { + const [key, value] = attr.split('=') switch (key.toUpperCase()) { case 'FREQ': options.freq = Frequency[value.toUpperCase() as keyof typeof Frequency] @@ -74,6 +79,7 @@ function parseRrule (line: string) { case 'BYSECOND': const num = parseNumber(value) const optionKey = key.toLowerCase() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore options[optionKey] = num break @@ -89,7 +95,7 @@ function parseRrule (line: string) { options.dtstart = dtstart.dtstart break case 'UNTIL': - options.until = dateutil.untilStringToDate(value) + options.until = untilStringToDate(value) break case 'BYEASTER': options.byeaster = Number(value) @@ -102,7 +108,7 @@ function parseRrule (line: string) { return options } -function parseNumber (value: string) { +function parseNumber(value: string) { if (value.indexOf(',') !== -1) { const values = value.split(',') return values.map(parseIndividualNumber) @@ -111,7 +117,7 @@ function parseNumber (value: string) { return parseIndividualNumber(value) } -function parseIndividualNumber (value: string) { +function parseIndividualNumber(value: string) { if (/^[+-]?\d+$/.test(value)) { return Number(value) } @@ -119,17 +125,20 @@ function parseIndividualNumber (value: string) { return value } -function parseWeekday (value: string) { +function parseWeekday(value: string) { const days = value.split(',') - return days.map(day => { + return days.map((day) => { if (day.length === 2) { // MO, TU, ... return Days[day as keyof typeof Days] // wday instanceof Weekday } // -1MO, +3FR, 1SO, 13TU ... - const parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/)! + const parts = day.match(/^([+-]?\d{1,2})([A-Z]{2})$/) + if (!parts || parts.length < 3) { + throw new SyntaxError(`Invalid weekday string: ${day}`) + } const n = Number(parts[1]) const wdaypart = parts[2] as keyof typeof Days const wday = Days[wdaypart].weekday diff --git a/src/rrule.ts b/src/rrule.ts index ccbac06c..cab2d1dd 100644 --- a/src/rrule.ts +++ b/src/rrule.ts @@ -1,11 +1,18 @@ -import dateutil from './dateutil' +import { isValidDate } from './dateutil' import IterResult, { IterArgs } from './iterresult' import CallbackIterResult from './callbackiterresult' import { Language } from './nlp/i18n' -import { Nlp } from './nlp/index' +import { fromText, parseText, toText, isFullyConvertible } from './nlp/index' import { DateFormatter, GetText } from './nlp/totext' -import { ParsedOptions, Options, Frequency, QueryMethods, QueryMethodTypes, IterResultType } from './types' +import { + ParsedOptions, + Options, + Frequency, + QueryMethods, + QueryMethodTypes, + IterResultType, +} from './types' import { parseOptions, initializeOptions } from './parseoptions' import { parseString } from './parsestring' import { optionsToString } from './optionstostring' @@ -13,19 +20,6 @@ import { Cache, CacheKeys } from './cache' import { Weekday } from './weekday' import { iter } from './iter/index' -interface GetNlp { - _nlp: Nlp - (): Nlp -} - -const getnlp: GetNlp = function () { - // Lazy, runtime import to avoid circular refs. - if (!getnlp._nlp) { - getnlp._nlp = require('./nlp') - } - return getnlp._nlp -} as GetNlp - // ============================================================================= // RRule // ============================================================================= @@ -37,7 +31,7 @@ export const Days = { TH: new Weekday(3), FR: new Weekday(4), SA: new Weekday(5), - SU: new Weekday(6) + SU: new Weekday(6), } export const DEFAULT_OPTIONS: Options = { @@ -59,7 +53,7 @@ export const DEFAULT_OPTIONS: Options = { byhour: null, byminute: null, bysecond: null, - byeaster: null + byeaster: null, } export const defaultKeys = Object.keys(DEFAULT_OPTIONS) as (keyof Options)[] @@ -67,10 +61,10 @@ export const defaultKeys = Object.keys(DEFAULT_OPTIONS) as (keyof Options)[] /** * * @param {Options?} options - see - * The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... + * - The only required option is `freq`, one of RRule.YEARLY, RRule.MONTHLY, ... * @constructor */ -export default class RRule implements QueryMethods { +export class RRule implements QueryMethods { public _cache: Cache | null public origOptions: Partial public options: ParsedOptions @@ -84,7 +78,7 @@ export default class RRule implements QueryMethods { 'DAILY', 'HOURLY', 'MINUTELY', - 'SECONDLY' + 'SECONDLY', ] static readonly YEARLY = Frequency.YEARLY @@ -103,7 +97,7 @@ export default class RRule implements QueryMethods { static readonly SA = Days.SA static readonly SU = Days.SU - constructor (options: Partial = {}, noCache: boolean = false) { + constructor(options: Partial = {}, noCache = false) { // RFC string this._cache = noCache ? null : new Cache() @@ -113,32 +107,34 @@ export default class RRule implements QueryMethods { this.options = parsedOptions } - static parseText (text: string, language?: Language) { - return getnlp().parseText(text, language) + static parseText(text: string, language?: Language) { + return parseText(text, language) } - static fromText (text: string, language?: Language) { - return getnlp().fromText(text, language) + static fromText(text: string, language?: Language) { + return fromText(text, language) } static parseString = parseString - static fromString (str: string) { + static fromString(str: string) { return new RRule(RRule.parseString(str) || undefined) } static optionsToString = optionsToString - protected _iter (iterResult: IterResult): IterResultType { + protected _iter( + iterResult: IterResult + ): IterResultType { return iter(iterResult, this.options) } - private _cacheGet (what: CacheKeys | 'all', args?: Partial) { + private _cacheGet(what: CacheKeys | 'all', args?: Partial) { if (!this._cache) return false return this._cache._cacheGet(what, args) } - public _cacheAdd ( + public _cacheAdd( what: CacheKeys | 'all', value: Date[] | Date | null, args?: Partial @@ -149,11 +145,11 @@ export default class RRule implements QueryMethods { /** * @param {Function} iterator - optional function that will be called - * on each date that is added. It can return false - * to stop the iteration. + * on each date that is added. It can return false + * to stop the iteration. * @return Array containing all recurrences. */ - all (iterator?: (d: Date, len: number) => boolean): Date[] { + all(iterator?: (d: Date, len: number) => boolean): Date[] { if (iterator) { return this._iter(new CallbackIterResult('all', {}, iterator)) } @@ -171,25 +167,26 @@ export default class RRule implements QueryMethods { * The inc keyword defines what happens if after and/or before are * themselves occurrences. With inc == True, they will be included in the * list, if they are found in the recurrence set. + * * @return Array */ - between ( + between( after: Date, before: Date, - inc: boolean = false, + inc = false, iterator?: (d: Date, len: number) => boolean ): Date[] { - if (!dateutil.isValidDate(after) || !dateutil.isValidDate(before)) throw new Error('Invalid date passed in to RRule.between') + if (!isValidDate(after) || !isValidDate(before)) { + throw new Error('Invalid date passed in to RRule.between') + } const args = { before, after, - inc + inc, } if (iterator) { - return this._iter( - new CallbackIterResult('between', args, iterator) - ) + return this._iter(new CallbackIterResult('between', args, iterator)) } let result = this._cacheGet('between', args) @@ -204,50 +201,57 @@ export default class RRule implements QueryMethods { * Returns the last recurrence before the given datetime instance. * The inc keyword defines what happens if dt is an occurrence. * With inc == True, if dt itself is an occurrence, it will be returned. + * * @return Date or null */ - before (dt: Date, inc = false): Date { - if (!dateutil.isValidDate(dt)) throw new Error('Invalid date passed in to RRule.before') + before(dt: Date, inc = false): Date | null { + if (!isValidDate(dt)) { + throw new Error('Invalid date passed in to RRule.before') + } const args = { dt: dt, inc: inc } let result = this._cacheGet('before', args) if (result === false) { result = this._iter(new IterResult('before', args)) this._cacheAdd('before', result, args) } - return result as Date + return result as Date | null } /** * Returns the first recurrence after the given datetime instance. * The inc keyword defines what happens if dt is an occurrence. * With inc == True, if dt itself is an occurrence, it will be returned. + * * @return Date or null */ - after (dt: Date, inc = false): Date { - if (!dateutil.isValidDate(dt)) throw new Error('Invalid date passed in to RRule.after') + after(dt: Date, inc = false): Date | null { + if (!isValidDate(dt)) { + throw new Error('Invalid date passed in to RRule.after') + } const args = { dt: dt, inc: inc } let result = this._cacheGet('after', args) if (result === false) { result = this._iter(new IterResult('after', args)) this._cacheAdd('after', result, args) } - return result as Date + return result as Date | null } /** * Returns the number of recurrences in this set. It will have go trough * the whole recurrence, if this hasn't been done before. */ - count (): number { + count(): number { return this.all().length } /** * Converts the rrule into its string representation + * * @see * @return String */ - toString () { + toString() { return optionsToString(this.origOptions) } @@ -255,19 +259,23 @@ export default class RRule implements QueryMethods { * Will convert all rules described in nlp:ToText * to text. */ - toText (gettext?: GetText, language?: Language, dateFormatter?: DateFormatter) { - return getnlp().toText(this, gettext, language, dateFormatter) + toText( + gettext?: GetText, + language?: Language, + dateFormatter?: DateFormatter + ) { + return toText(this, gettext, language, dateFormatter) } - isFullyConvertibleToText () { - return getnlp().isFullyConvertible(this) + isFullyConvertibleToText() { + return isFullyConvertible(this) } /** * @return a RRule instance with the same freq and options - * as this one (cache is not cloned) + * as this one (cache is not cloned) */ - clone (): RRule { + clone(): RRule { return new RRule(this.origOptions) } } diff --git a/src/rruleset.ts b/src/rruleset.ts index 1e548fb9..ebf9d01d 100644 --- a/src/rruleset.ts +++ b/src/rruleset.ts @@ -1,5 +1,5 @@ -import RRule from './rrule' -import dateutil from './dateutil' +import { RRule } from './rrule' +import { sort, timeToUntilString } from './dateutil' import { includes } from './helpers' import IterResult from './iterresult' import { iterSet } from './iterset' @@ -7,7 +7,7 @@ import { QueryMethodTypes, IterResultType } from './types' import { rrulestr } from './rrulestr' import { optionsToString } from './optionstostring' -function createGetterSetter (fieldName: string) { +function createGetterSetter(fieldName: string) { return (field?: T) => { if (field !== undefined) { this[`_${fieldName}`] = field @@ -26,7 +26,7 @@ function createGetterSetter (fieldName: string) { } } -export default class RRuleSet extends RRule { +export class RRuleSet extends RRule { public readonly _rrule: RRule[] public readonly _rdate: Date[] public readonly _exrule: RRule[] @@ -38,10 +38,10 @@ export default class RRuleSet extends RRule { /** * * @param {Boolean?} noCache - * The same stratagy as RRule on cache, default to false + * The same stratagy as RRule on cache, default to false * @constructor */ - constructor (noCache: boolean = false) { + constructor(noCache = false) { super({}, noCache) this._rrule = [] @@ -53,7 +53,9 @@ export default class RRuleSet extends RRule { dtstart = createGetterSetter.apply(this, ['dtstart']) tzid = createGetterSetter.apply(this, ['tzid']) - _iter (iterResult: IterResult): IterResultType { + _iter( + iterResult: IterResult + ): IterResultType { return iterSet( iterResult, this._rrule, @@ -69,7 +71,7 @@ export default class RRuleSet extends RRule { * * @param {RRule} */ - rrule (rrule: RRule) { + rrule(rrule: RRule) { _addRule(rrule, this._rrule) } @@ -78,7 +80,7 @@ export default class RRuleSet extends RRule { * * @param {RRule} */ - exrule (rrule: RRule) { + exrule(rrule: RRule) { _addRule(rrule, this._exrule) } @@ -87,7 +89,7 @@ export default class RRuleSet extends RRule { * * @param {Date} */ - rdate (date: Date) { + rdate(date: Date) { _addDate(date, this._rdate) } @@ -96,7 +98,7 @@ export default class RRuleSet extends RRule { * * @param {Date} */ - exdate (date: Date) { + exdate(date: Date) { _addDate(date, this._exdate) } @@ -105,8 +107,8 @@ export default class RRuleSet extends RRule { * * @return List of rrules */ - rrules () { - return this._rrule.map(e => rrulestr(e.toString())) + rrules() { + return this._rrule.map((e) => rrulestr(e.toString())) } /** @@ -114,8 +116,8 @@ export default class RRuleSet extends RRule { * * @return List of exrules */ - exrules () { - return this._exrule.map(e => rrulestr(e.toString())) + exrules() { + return this._exrule.map((e) => rrulestr(e.toString())) } /** @@ -123,8 +125,8 @@ export default class RRuleSet extends RRule { * * @return List of rdates */ - rdates () { - return this._rdate.map(e => new Date(e.getTime())) + rdates() { + return this._rdate.map((e) => new Date(e.getTime())) } /** @@ -132,11 +134,11 @@ export default class RRuleSet extends RRule { * * @return List of exdates */ - exdates () { - return this._exdate.map(e => new Date(e.getTime())) + exdates() { + return this._exdate.map((e) => new Date(e.getTime())) } - valueOf () { + valueOf() { let result: string[] = [] if (!this._rrule.length && this._dtstart) { @@ -149,22 +151,20 @@ export default class RRuleSet extends RRule { this._exrule.forEach(function (exrule) { result = result.concat( - exrule.toString().split('\n') - .map(line => line.replace(/^RRULE:/, 'EXRULE:')) - .filter(line => !/^DTSTART/.test(line)) + exrule + .toString() + .split('\n') + .map((line) => line.replace(/^RRULE:/, 'EXRULE:')) + .filter((line) => !/^DTSTART/.test(line)) ) }) if (this._rdate.length) { - result.push( - rdatesToString('RDATE', this._rdate, this.tzid()) - ) + result.push(rdatesToString('RDATE', this._rdate, this.tzid())) } if (this._exdate.length) { - result.push( - rdatesToString('EXDATE', this._exdate, this.tzid()) - ) + result.push(rdatesToString('EXDATE', this._exdate, this.tzid())) } return result @@ -172,30 +172,30 @@ export default class RRuleSet extends RRule { /** * to generate recurrence field such as: - * DTSTART:19970902T010000Z - * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU - * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH + * DTSTART:19970902T010000Z + * RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU + * RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH */ - toString () { + toString() { return this.valueOf().join('\n') } /** * Create a new RRuleSet Object completely base on current instance */ - clone (): RRuleSet { + clone(): RRuleSet { const rrs = new RRuleSet(!!this._cache) - this._rrule.forEach(rule => rrs.rrule(rule.clone())) - this._exrule.forEach(rule => rrs.exrule(rule.clone())) - this._rdate.forEach(date => rrs.rdate(new Date(date.getTime()))) - this._exdate.forEach(date => rrs.exdate(new Date(date.getTime()))) + this._rrule.forEach((rule) => rrs.rrule(rule.clone())) + this._exrule.forEach((rule) => rrs.exrule(rule.clone())) + this._rdate.forEach((date) => rrs.rdate(new Date(date.getTime()))) + this._exdate.forEach((date) => rrs.exdate(new Date(date.getTime()))) return rrs } } -function _addRule (rrule: RRule, collection: RRule[]) { +function _addRule(rrule: RRule, collection: RRule[]) { if (!(rrule instanceof RRule)) { throw new TypeError(String(rrule) + ' is not RRule instance') } @@ -205,23 +205,27 @@ function _addRule (rrule: RRule, collection: RRule[]) { } } -function _addDate (date: Date, collection: Date[]) { +function _addDate(date: Date, collection: Date[]) { if (!(date instanceof Date)) { throw new TypeError(String(date) + ' is not Date instance') } if (!includes(collection.map(Number), Number(date))) { collection.push(date) - dateutil.sort(collection) + sort(collection) } } -function rdatesToString (param: string, rdates: Date[], tzid: string | undefined) { +function rdatesToString( + param: string, + rdates: Date[], + tzid: string | undefined +) { const isUTC = !tzid || tzid.toUpperCase() === 'UTC' const header = isUTC ? `${param}:` : `${param};TZID=${tzid}:` const dateString = rdates - .map(rdate => dateutil.timeToUntilString(rdate.valueOf(), isUTC)) - .join(',') + .map((rdate) => timeToUntilString(rdate.valueOf(), isUTC)) + .join(',') return `${header}${dateString}` } diff --git a/src/rrulestr.ts b/src/rrulestr.ts index c9daacd9..61f3707d 100644 --- a/src/rrulestr.ts +++ b/src/rrulestr.ts @@ -1,6 +1,6 @@ -import RRule from './rrule' -import RRuleSet from './rruleset' -import dateutil from './dateutil' +import { RRule } from './rrule' +import { RRuleSet } from './rruleset' +import { untilStringToDate } from './dateutil' import { includes, split } from './helpers' import { Options } from './types' import { parseString, parseDtstart } from './parsestring' @@ -16,7 +16,7 @@ export interface RRuleStrOptions { /** * RRuleStr - * To parse a set of rrule strings + * To parse a set of rrule strings */ const DEFAULT_OPTIONS: RRuleStrOptions = { dtstart: null, @@ -24,20 +24,22 @@ const DEFAULT_OPTIONS: RRuleStrOptions = { unfold: false, forceset: false, compatible: false, - tzid: null + tzid: null, } -export function parseInput (s: string, options: Partial) { - let rrulevals: Partial[] = [] +export function parseInput(s: string, options: Partial) { + const rrulevals: Partial[] = [] let rdatevals: Date[] = [] - let exrulevals: Partial[] = [] + const exrulevals: Partial[] = [] let exdatevals: Date[] = [] - let { dtstart, tzid } = parseDtstart(s) + const parsedDtstart = parseDtstart(s) + const { dtstart } = parsedDtstart + let { tzid } = parsedDtstart const lines = splitIntoLines(s, options.unfold) - lines.forEach(line => { + lines.forEach((line) => { if (!line) return const { name, parms, value } = breakDownLine(line) @@ -51,7 +53,7 @@ export function parseInput (s: string, options: Partial) { break case 'RDATE': - const [ _, rdateTzid ] = /RDATE(?:;TZID=([^:=]+))?/i.exec(line)! + const [, rdateTzid] = /RDATE(?:;TZID=([^:=]+))?/i.exec(line) ?? [] if (rdateTzid && !tzid) { tzid = rdateTzid } @@ -84,19 +86,13 @@ export function parseInput (s: string, options: Partial) { rrulevals, rdatevals, exrulevals, - exdatevals + exdatevals, } } -function buildRule (s: string, options: Partial) { - const { - rrulevals, - rdatevals, - exrulevals, - exdatevals, - dtstart, - tzid - } = parseInput(s, options) +function buildRule(s: string, options: Partial) { + const { rrulevals, rdatevals, exrulevals, exdatevals, dtstart, tzid } = + parseInput(s, options) const noCache = options.cache === false @@ -117,60 +113,57 @@ function buildRule (s: string, options: Partial) { rset.dtstart(dtstart) rset.tzid(tzid || undefined) - rrulevals.forEach(val => { - rset.rrule( - new RRule( - groomRruleOptions(val, dtstart, tzid), - noCache - ) - ) + rrulevals.forEach((val) => { + rset.rrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)) }) - rdatevals.forEach(date => { + rdatevals.forEach((date) => { rset.rdate(date) }) - exrulevals.forEach(val => { - rset.exrule( - new RRule( - groomRruleOptions(val, dtstart, tzid), - noCache - ) - ) + exrulevals.forEach((val) => { + rset.exrule(new RRule(groomRruleOptions(val, dtstart, tzid), noCache)) }) - exdatevals.forEach(date => { + exdatevals.forEach((date) => { rset.exdate(date) }) - if (options.compatible && options.dtstart) rset.rdate(dtstart!) + if (options.compatible && options.dtstart) rset.rdate(dtstart) return rset } const val = rrulevals[0] || {} - return new RRule(groomRruleOptions( - val, - val.dtstart || options.dtstart || dtstart, - val.tzid || options.tzid || tzid - ), noCache) + return new RRule( + groomRruleOptions( + val, + val.dtstart || options.dtstart || dtstart, + val.tzid || options.tzid || tzid + ), + noCache + ) } -export function rrulestr ( +export function rrulestr( s: string, options: Partial = {} ): RRule | RRuleSet { return buildRule(s, initializeOptions(options)) } -function groomRruleOptions (val: Partial, dtstart?: Date | null, tzid?: string | null) { +function groomRruleOptions( + val: Partial, + dtstart?: Date | null, + tzid?: string | null +) { return { ...val, dtstart, - tzid + tzid, } } -function initializeOptions (options: Partial) { +function initializeOptions(options: Partial) { const invalid: string[] = [] const keys = Object.keys(options) as (keyof typeof options)[] const defaultKeys = Object.keys( @@ -185,44 +178,37 @@ function initializeOptions (options: Partial) { throw new Error('Invalid options: ' + invalid.join(', ')) } - const initializedOptions = { ...options } - - // Merge in default options - defaultKeys.forEach(function (key) { - if (!includes(keys, key)) initializedOptions[key] = DEFAULT_OPTIONS[key] - }) - - return initializedOptions + return { ...DEFAULT_OPTIONS, ...options } } -function extractName (line: string) { +function extractName(line: string) { if (line.indexOf(':') === -1) { return { name: 'RRULE', - value: line + value: line, } } const [name, value] = split(line, ':', 1) return { name, - value + value, } } -function breakDownLine (line: string) { +function breakDownLine(line: string) { const { name, value } = extractName(line) - let parms = name.split(';') + const parms = name.split(';') if (!parms) throw new Error('empty property name') return { name: parms[0].toUpperCase(), parms: parms.slice(1), - value + value, } } -function splitIntoLines (s: string, unfold = false) { +function splitIntoLines(s: string, unfold = false) { s = s && s.trim() if (!s) throw new Error('Invalid empty string') @@ -250,18 +236,16 @@ function splitIntoLines (s: string, unfold = false) { return lines } -function validateDateParm (parms: string[]) { - parms.forEach(parm => { +function validateDateParm(parms: string[]) { + parms.forEach((parm) => { if (!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(parm)) { throw new Error('unsupported RDATE/EXDATE parm: ' + parm) } }) } -function parseRDate (rdateval: string, parms: string[]) { +function parseRDate(rdateval: string, parms: string[]) { validateDateParm(parms) - return rdateval - .split(',') - .map(datestr => dateutil.untilStringToDate(datestr)) + return rdateval.split(',').map((datestr) => untilStringToDate(datestr)) } diff --git a/src/types.ts b/src/types.ts index bbf1d85a..81785142 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,14 +1,18 @@ import { Weekday, WeekdayStr } from './weekday' export interface QueryMethods { - all (): Date[] - between (after: Date, before: Date, inc: boolean): Date[] - before (date: Date, inc: boolean): Date - after (date: Date, inc: boolean): Date + all(): Date[] + between(after: Date, before: Date, inc: boolean): Date[] + before(date: Date, inc: boolean): Date | null + after(date: Date, inc: boolean): Date | null } export type QueryMethodTypes = keyof QueryMethods -export type IterResultType = M extends 'all' | 'between' ? Date[] : (Date | null) +export type IterResultType = M extends + | 'all' + | 'between' + ? Date[] + : Date | null export enum Frequency { YEARLY = 0, @@ -17,10 +21,16 @@ export enum Frequency { DAILY = 3, HOURLY = 4, MINUTELY = 5, - SECONDLY = 6 + SECONDLY = 6, } -export function freqIsDailyOrGreater (freq: Frequency): freq is Frequency.YEARLY | Frequency.MONTHLY | Frequency.WEEKLY | Frequency.DAILY { +export function freqIsDailyOrGreater( + freq: Frequency +): freq is + | Frequency.YEARLY + | Frequency.MONTHLY + | Frequency.WEEKLY + | Frequency.DAILY { return freq < Frequency.HOURLY } diff --git a/src/weekday.ts b/src/weekday.ts index f8bffa8f..dc4d61c6 100644 --- a/src/weekday.ts +++ b/src/weekday.ts @@ -3,37 +3,49 @@ // ============================================================================= export type WeekdayStr = 'MO' | 'TU' | 'WE' | 'TH' | 'FR' | 'SA' | 'SU' -const WDAYS: WeekdayStr[] = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'] +export const ALL_WEEKDAYS: WeekdayStr[] = [ + 'MO', + 'TU', + 'WE', + 'TH', + 'FR', + 'SA', + 'SU', +] export class Weekday { public readonly weekday: number public readonly n?: number - constructor (weekday: number, n?: number) { + constructor(weekday: number, n?: number) { if (n === 0) throw new Error("Can't create weekday with n == 0") this.weekday = weekday this.n = n } + static fromStr(str: WeekdayStr): Weekday { + return new Weekday(ALL_WEEKDAYS.indexOf(str)) + } + // __call__ - Cannot call the object directly, do it through // e.g. RRule.TH.nth(-1) instead, - nth (n: number) { + nth(n: number) { return this.n === n ? this : new Weekday(this.weekday, n) } // __eq__ - equals (other: Weekday) { + equals(other: Weekday) { return this.weekday === other.weekday && this.n === other.n } // __repr__ - toString () { - let s: string = WDAYS[this.weekday] + toString() { + let s: string = ALL_WEEKDAYS[this.weekday] if (this.n) s = (this.n > 0 ? '+' : '') + String(this.n) + s return s } - getJsWeekday () { + getJsWeekday() { return this.weekday === 6 ? 0 : this.weekday + 1 } } diff --git a/test/cache.test.ts b/test/cache.test.ts new file mode 100644 index 00000000..5bc6075e --- /dev/null +++ b/test/cache.test.ts @@ -0,0 +1,100 @@ +import { Cache } from '../src/cache' +import { IterArgs } from '../src/iterresult' + +const dates = [ + new Date('2021-01-01T00:00:00.000+00:00'), + new Date('2021-01-02T00:00:00.000+00:00'), + new Date('2021-01-03T00:00:00.000+00:00'), + new Date('2021-01-04T00:00:00.000+00:00'), + new Date('2021-01-05T00:00:00.000+00:00'), + new Date('2021-01-06T00:00:00.000+00:00'), + new Date('2021-01-07T00:00:00.000+00:00'), +] + +describe('Cache', () => { + it('returns false for an empty cache', () => { + const cache = new Cache() + const args: Partial = { + after: new Date('2021-01-01T00:00:00.000+00:00'), + before: new Date('2021-01-08T00:00:00.000+00:00'), + inc: true, + } + + expect(cache._cacheGet('between', args)).toBe(false) + }) + + it('returns an empty array for a cached but empty set', () => { + const cache = new Cache() + const args: Partial = { + after: new Date('2021-01-01T00:00:00.000+00:00'), + before: new Date('2021-01-08T00:00:00.000+00:00'), + inc: true, + } + + cache._cacheAdd('between', [], args) + + expect(cache._cacheGet('between', args)).toEqual([]) + }) + + it('returns cached entries if the "what" and the args both match', () => { + const cache = new Cache() + const args: Partial = { + after: new Date('2021-01-01T00:00:00.000+00:00'), + before: new Date('2021-01-08T00:00:00.000+00:00'), + inc: true, + } + + cache._cacheAdd('between', dates, args) + + expect(cache._cacheGet('between', args)).toEqual(dates) + }) + + it('does not return cached entries if the "what" matches but the args do not', () => { + const cache = new Cache() + const args: Partial = { + after: new Date('2021-01-01T00:00:00.000+00:00'), + before: new Date('2021-01-08T00:00:00.000+00:00'), + inc: true, + } + + cache._cacheAdd('between', dates, args) + + expect( + cache._cacheGet('between', { + ...args, + /** 1ms later than the args used for the insert */ + after: new Date('2021-01-01T00:00:00.001+00:00'), + }) + ).toBe(false) + }) + + it('does not return cached entries if args match but the "what" does not', () => { + const cache = new Cache() + const args: Partial = { + after: new Date('2021-01-01T00:00:00.000+00:00'), + before: new Date('2021-01-08T00:00:00.000+00:00'), + inc: true, + } + + cache._cacheAdd('between', dates, args) + + expect(cache._cacheGet('after', args)).toBe(false) + }) + + it('reuses dates cached for the "all" method when querying using another method', () => { + const cache = new Cache() + const args: Partial = { + after: new Date('2021-01-04T00:00:00.000+00:00'), + before: new Date('2021-01-06T00:00:00.000+00:00'), + inc: true, + } + + cache._cacheAdd('all', dates) + + expect(cache._cacheGet('between', args)).toEqual([ + new Date('2021-01-04T00:00:00.000+00:00'), + new Date('2021-01-05T00:00:00.000+00:00'), + new Date('2021-01-06T00:00:00.000+00:00'), + ]) + }) +}) diff --git a/test/dateutil.test.ts b/test/dateutil.test.ts index d6bd196a..b7787dd3 100644 --- a/test/dateutil.test.ts +++ b/test/dateutil.test.ts @@ -1,9 +1,8 @@ -import { dateutil } from '../src/dateutil' -import { expect } from 'chai' +import { datetime, untilStringToDate } from '../src/dateutil' describe('untilStringToDate', () => { it('parses a date string', () => { - const date = dateutil.untilStringToDate('19970902T090000') - expect(date.getTime()).to.equal(new Date(Date.UTC(1997, 8, 2, 9, 0, 0, 0)).getTime()) + const date = untilStringToDate('19970902T090000') + expect(date.getTime()).toBe(datetime(1997, 9, 2, 9, 0, 0).getTime()) }) }) diff --git a/test/datewithzone.test.ts b/test/datewithzone.test.ts index 3bf0cd4e..2e13774c 100644 --- a/test/datewithzone.test.ts +++ b/test/datewithzone.test.ts @@ -1,66 +1,56 @@ -import { DateWithZone } from "../src/datewithzone"; -import { expect } from "chai"; -import { DateTime } from "luxon"; +import { DateWithZone } from '../src/datewithzone' import { set as setMockDate, reset as resetMockDate } from 'mockdate' -import { expectedDate } from "./lib/utils"; +import { datetime, expectedDate } from './lib/utils' describe('toString', () => { it('returns the date when no tzid is present', () => { - const dt = new DateWithZone(new Date(Date.UTC(2010, 9, 5, 11, 0, 0))) - expect(dt.toString()).to.equal(':20101005T110000Z') + const dt = new DateWithZone(datetime(2010, 10, 5, 11, 0, 0)) + expect(dt.toString()).toBe(':20101005T110000Z') - const dt2 = new DateWithZone(new Date(Date.UTC(2010, 9, 5, 11, 0, 0)), 'UTC') - expect(dt2.toString()).to.equal(':20101005T110000Z') - }) + const dt2 = new DateWithZone(datetime(2010, 10, 5, 11, 0, 0), 'UTC') + expect(dt2.toString()).toBe(':20101005T110000Z') + }) it('returns the date with tzid when present', () => { - const dt = new DateWithZone(new Date(Date.UTC(2010, 9, 5, 11, 0, 0)), 'Asia/Tokyo') - expect(dt.toString()).to.equal(';TZID=Asia/Tokyo:20101005T110000') + const dt = new DateWithZone(datetime(2010, 10, 5, 11, 0, 0), 'Asia/Tokyo') + expect(dt.toString()).toBe(';TZID=Asia/Tokyo:20101005T110000') }) }) it('returns the time of the date', () => { - const d = new Date(Date.UTC(2010, 9, 5, 11, 0, 0)) + const d = datetime(2010, 10, 5, 11, 0, 0) const dt = new DateWithZone(d) - expect(dt.getTime()).to.equal(d.getTime()) + expect(dt.getTime()).toBe(d.getTime()) +}) + +it('rejects invalid dates', () => { + expect(() => new DateWithZone(new Date(undefined))).toThrow( + 'Invalid date passed to DateWithZone' + ) }) describe('rezonedDate', () => { it('returns the original date when no zone is given', () => { - const d = new Date(Date.UTC(2010, 9, 5, 11, 0, 0)) + const d = datetime(2010, 10, 5, 11, 0, 0) const dt = new DateWithZone(d) - expect(dt.rezonedDate()).to.deep.equal(d) + expect(dt.rezonedDate()).toEqual(d) }) it('returns the date in the correct zone when given', () => { const targetZone = 'America/New_York' - const currentLocalDate = DateTime.local(2000, 2, 6, 1, 0, 0) - setMockDate(currentLocalDate.toJSDate()) + const currentLocalDate = new Date(2000, 1, 6, 1, 0, 0) + setMockDate(currentLocalDate) - const d = DateTime.fromISO('20101005T110000').toJSDate() + const d = new Date(Date.parse('2010-10-05T11:00:00')) const dt = new DateWithZone(d, targetZone) - expect(dt.rezonedDate()).to.deep.equal( - expectedDate(DateTime.fromISO('20101005T110000'), currentLocalDate, targetZone) + expect(dt.rezonedDate()).toEqual( + expectedDate( + new Date(Date.parse('2010-10-05T11:00:00')), + currentLocalDate, + targetZone + ) ) resetMockDate() }) - - it('recovers from an error if Luxon is missing', () => { - const origfromJSDate = DateTime.fromJSDate - DateTime.fromJSDate = () => { - throw new TypeError() - } - - const targetZone = 'America/New_York' - const currentLocalDate = DateTime.local(2000, 2, 6, 1, 0, 0) - setMockDate(currentLocalDate.toJSDate()) - - const d = DateTime.fromISO('20101005T110000').toJSDate() - const dt = new DateWithZone(d, targetZone) - expect(dt.rezonedDate()).to.deep.equal(d) - - DateTime.fromJSDate = origfromJSDate - resetMockDate() - }) -}) \ No newline at end of file +}) diff --git a/test/helpers.test.ts b/test/helpers.test.ts index 7efd7d55..91f84cae 100644 --- a/test/helpers.test.ts +++ b/test/helpers.test.ts @@ -1,132 +1,142 @@ -import { empty, includes, pymod, divmod, split, clone, range, repeat, isPresent, isArray } from '../src/helpers' -import { expect } from 'chai' -import { isNumber } from 'util'; +import { + empty, + includes, + pymod, + divmod, + split, + clone, + range, + repeat, + isPresent, + isArray, +} from '../src/helpers' +import { isNumber } from 'util' describe('isPresent', () => { it('is false if object is null', () => { - expect(isPresent(null)).to.be.false + expect(isPresent(null)).toBe(false) }) it('is false if object is undefined', () => { - expect(isPresent(undefined)).to.be.false + expect(isPresent(undefined)).toBe(false) }) it('is true if object is non-null and not undefined', () => { - expect(isPresent(0)).to.be.true - expect(isPresent('')).to.be.true - expect(isPresent('foo')).to.be.true - expect(isPresent(123)).to.be.true - expect(isPresent([])).to.be.true + expect(isPresent(0)).toBe(true) + expect(isPresent('')).toBe(true) + expect(isPresent('foo')).toBe(true) + expect(isPresent(123)).toBe(true) + expect(isPresent([])).toBe(true) }) }) describe('isArray', () => { it('is true if it is an array', () => { - expect(isArray([])).to.be.true - expect(isArray([1])).to.be.true - expect(isArray(['foo'])).to.be.true + expect(isArray([])).toBe(true) + expect(isArray([1])).toBe(true) + expect(isArray(['foo'])).toBe(true) }) it('is false if it is empty', () => { - expect(isArray('foo')).to.be.false - expect(isArray(null)).to.be.false - expect(isArray(0)).to.be.false - expect(isArray(undefined)).to.be.false + expect(isArray('foo')).toBe(false) + expect(isArray(null)).toBe(false) + expect(isArray(0)).toBe(false) + expect(isArray(undefined)).toBe(false) }) }) describe('isNumber', () => { it('is true if it is a number', () => { - expect(isNumber(0)).to.be.true + expect(isNumber(0)).toBe(true) }) it('is false if it is not a number', () => { - expect(isNumber('1')).to.be.false - expect(isNumber(null)).to.be.false + expect(isNumber('1')).toBe(false) + expect(isNumber(null)).toBe(false) }) }) describe('empty', () => { it('is empty if object is null', () => { - expect(empty(null)).to.be.true + expect(empty(null)).toBe(true) }) it('is empty if object is undefined', () => { - expect(empty(undefined)).to.be.true + expect(empty(undefined)).toBe(true) }) it('is empty if object is an empty array', () => { - expect(empty([])).to.be.true + expect(empty([])).toBe(true) }) it('is not empty if object is a non-empty array', () => { - expect(empty(['foo'])).to.be.false - expect(empty([0])).to.be.false + expect(empty(['foo'])).toBe(false) + expect(empty([0])).toBe(false) }) }) describe('includes', () => { it('is true if the object is found', () => { - expect(includes(['foo'], 'foo')).to.be.true - expect(includes([0], 0)).to.be.true + expect(includes(['foo'], 'foo')).toBe(true) + expect(includes([0], 0)).toBe(true) }) it('is false if the object is not found', () => { - expect(includes(['foo'], 'bar')).to.be.false - expect(includes([0], 1)).to.be.false + expect(includes(['foo'], 'bar')).toBe(false) + expect(includes([0], 1)).toBe(false) }) }) describe('pymod', () => { it('returns the wrapped result', () => { - expect(pymod(1, 8)).to.equal(1) - expect(pymod(-1, -8)).to.equal(-1) - expect(pymod(-1, 8)).to.equal(7) + expect(pymod(1, 8)).toBe(1) + expect(pymod(-1, -8)).toBe(-1) + expect(pymod(-1, 8)).toBe(7) }) }) describe('divmod', () => { it('returns the divided result', () => { - expect(divmod(1, 8)).to.deep.equal({ div: 0, mod: 1 }) - expect(divmod(-1, -8)).to.deep.equal({ div: 0, mod: -1 }) - expect(divmod(-1, 8)).to.deep.equal({ div: -1, mod: 7 }) + expect(divmod(1, 8)).toEqual({ div: 0, mod: 1 }) + expect(divmod(-1, -8)).toEqual({ div: 0, mod: -1 }) + expect(divmod(-1, 8)).toEqual({ div: -1, mod: 7 }) }) }) describe('split', () => { it('splits on the separator', () => { - expect(split('one-two-three', '-', 0)).to.deep.equal(['one', 'two', 'three']) + expect(split('one-two-three', '-', 0)).toEqual(['one', 'two', 'three']) }) it('only splits the specified number when nonzero', () => { - expect(split('one-two-three', '-', 1)).to.deep.equal(['one', 'two-three']) + expect(split('one-two-three', '-', 1)).toEqual(['one', 'two-three']) }) }) describe('clone', () => { it('copies an array', () => { const a = ['a', 'b', 'c'] - expect(clone(a)).not.to.equal(a) - expect(clone(a)).to.deep.equal(a) + expect(clone(a)).not.toBe(a) + expect(clone(a)).toEqual(a) }) }) describe('range', () => { it('generates a range', () => { - expect(range(3, 7)).to.deep.equal([3, 4, 5, 6]) + expect(range(3, 7)).toEqual([3, 4, 5, 6]) }) it('generates to the first argument if no second argument is given', () => { - expect(range(7)).to.deep.equal([0, 1, 2, 3, 4, 5, 6]) + expect(range(7)).toEqual([0, 1, 2, 3, 4, 5, 6]) }) }) describe('repeat', () => { it('repeats a single item', () => { - expect(repeat('foo', 3)).to.deep.equal(['foo', 'foo', 'foo']) + expect(repeat('foo', 3)).toEqual(['foo', 'foo', 'foo']) }) it('repeats an array', () => { - expect(repeat(['foo'], 3)).to.deep.equal([['foo'], ['foo'], ['foo']]) + expect(repeat(['foo'], 3)).toEqual([['foo'], ['foo'], ['foo']]) }) -}) \ No newline at end of file +}) diff --git a/test/lib/utils.ts b/test/lib/utils.ts index d82c5d2f..6bb2b93f 100644 --- a/test/lib/utils.ts +++ b/test/lib/utils.ts @@ -1,24 +1,29 @@ -import { expect } from 'chai' -import { ExclusiveTestFunction, TestFunction } from 'mocha' +export { datetime } from '../../src/dateutil' +import { dateInTimeZone, datetime } from '../../src/dateutil' import { RRule, RRuleSet } from '../../src' -import { DateTime } from 'luxon'; -const assertDatesEqual = function (actual: Date | Date[], expected: Date | Date[], msg?: string) { - msg = msg ? ' [' + msg + '] ' : '' +export const TEST_CTX = { + ALSO_TESTSTRING_FUNCTIONS: false, + ALSO_TESTNLP_FUNCTIONS: false, + ALSO_TESTBEFORE_AFTER_BETWEEN: false, + ALSO_TESTSUBSECOND_PRECISION: false, +} +const assertDatesEqual = function ( + actual: Date | Date[], + expected: Date | Date[] +) { if (!(actual instanceof Array)) actual = [actual] if (!(expected instanceof Array)) expected = [expected] if (expected.length > 1) { - expect(actual).to.have.length(expected.length, msg + 'number of recurrences') - msg = ' - ' + expect(actual).toHaveLength(expected.length) } for (let i = 0; i < expected.length; i++) { const act = actual[i] const exp = expected[i] - expect(exp instanceof Date ? exp.toString() : exp).to.equal( - act.toString(), msg + (i + 1) + '/' + expected.length) + expect(exp instanceof Date ? exp.toString() : exp).toBe(act.toString()) } } @@ -26,47 +31,42 @@ const extractTime = function (date: Date) { return date != null ? date.getTime() : void 0 } -/** - * datetime.datetime - */ -export const datetime = function (y: number, m: number, d: number, h: number = 0, i: number = 0, s: number = 0) { - return new Date(Date.UTC(y, m - 1, d, h, i, s)) -} - -export const datetimeUTC = function (y: number, m: number, d: number, h: number = 0, i: number = 0, s: number = 0) { - return new Date(Date.UTC(y, m - 1, d, h, i, s)) -} - /** * dateutil.parser.parse */ export const parse = function (str: string) { const parts = str.match(/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/) - let [ _, y, m, d, h, i, s ] = parts + const [, y, m, d, h, i, s] = parts const year = Number(y) - const month = Number(m[0] === '0' ? m[1] : m) - 1 + const month = Number(m[0] === '0' ? m[1] : m) const day = Number(d[0] === '0' ? d[1] : d) const hour = Number(h[0] === '0' ? h[1] : h) const minute = Number(i[0] === '0' ? i[1] : i) const second = Number(s[0] === '0' ? s[1] : s) - return new Date(Date.UTC(year, month, day, hour, minute, second)) + return datetime(year, month, day, hour, minute, second) } interface TestRecurring { - (m: string, testObj: any, expectedDates: Date | Date[]): void - only: (...args: any[]) => void - skip: (...args: any[]) => void + (m: string, testObj: unknown, expectedDates: Date | Date[]): void + only: (...args: unknown[]) => void + skip: (...args: unknown[]) => void +} + +interface TestObj { + rrule: RRule + method: 'all' | 'between' | 'before' | 'after' + args: unknown[] } export const testRecurring = function ( msg: string, - testObj: any, + testObj: TestObj | RRule | (() => TestObj), expectedDates: Date | Date[], - itFunc: TestFunction | ExclusiveTestFunction = it, + itFunc: jest.Func = it ) { - let rule: any - let method: string - let args: any + let rule: RRule + let method: 'all' | 'before' | 'between' | 'after' + let args: unknown[] if (typeof testObj === 'function') { testObj = testObj() @@ -79,27 +79,34 @@ export const testRecurring = function ( } else { rule = testObj.rrule method = testObj.method - args = testObj.args + args = testObj.args ?? [] } // Use text and string representation of the rrule as the message. if (rule instanceof RRule) { - msg = msg + ' [' + + msg = + msg + + ' [' + (rule.isFullyConvertibleToText() ? rule.toText() : 'no text repr') + - ']' + ' [' + rule.toString() + ']' + ']' + + ' [' + + rule.toString() + + ']' } else { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore msg = msg + ' ' + rule.toString() } itFunc(msg, function () { - const ctx = this.test.ctx let time = Date.now() - let actualDates = rule[method].apply(rule, args) + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + let actualDates = rule[method](...args) time = Date.now() - time const maxTestDuration = 200 - expect(time).to.be.lessThan(maxTestDuration, - `${rule}\' method "${method}" should finish in ${maxTestDuration} ms, but took ${time} ms`) + expect(time).toBeLessThan(maxTestDuration) if (!(actualDates instanceof Array)) actualDates = [actualDates] if (!(expectedDates instanceof Array)) expectedDates = [expectedDates] @@ -109,35 +116,45 @@ export const testRecurring = function ( // Additional tests using the expected dates // ========================================================== - if (ctx.ALSO_TEST_SUBSECOND_PRECISION) { - expect(actualDates.map(extractTime)).to.deep.equal(expectedDates.map(extractTime)) + if (TEST_CTX.ALSO_TESTSUBSECOND_PRECISION) { + expect(actualDates.map(extractTime)).toEqual( + expectedDates.map(extractTime) + ) } - if (ctx.ALSO_TEST_STRING_FUNCTIONS) { + if (TEST_CTX.ALSO_TESTSTRING_FUNCTIONS) { // Test toString()/fromString() const str = rule.toString() const rrule2 = RRule.fromString(str) const string2 = rrule2.toString() - expect(str).to.equal(string2, 'toString() == fromString(toString()).toString()') + expect(str).toBe(string2) if (method === 'all') { - assertDatesEqual(rrule2.all(), expectedDates, 'fromString().all()') + assertDatesEqual(rrule2.all(), expectedDates) } } - if (ctx.ALSO_TEST_NLP_FUNCTIONS && rule.isFullyConvertibleToText && rule.isFullyConvertibleToText()) { + if ( + TEST_CTX.ALSO_TESTNLP_FUNCTIONS && + rule.isFullyConvertibleToText && + rule.isFullyConvertibleToText() + ) { // Test fromText()/toText(). const str = rule.toString() const text = rule.toText() + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore const rrule2 = RRule.fromText(text, rule.options.dtstart) const text2 = rrule2.toText() - expect(text2).to.equal(text, 'toText() == fromText(toText()).toText()') + expect(text2).toBe(text) // Test fromText()/toString(). + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore const rrule3 = RRule.fromText(text, rule.options.dtstart) - expect(rrule3.toString()).to.equal(str, 'toString() == fromText(toText()).toString()') + expect(rrule3.toString()).toBe(str) } - if (method === 'all' && ctx.ALSO_TEST_BEFORE_AFTER_BETWEEN) { + if (method === 'all' && TEST_CTX.ALSO_TESTBEFORE_AFTER_BETWEEN) { // Test before, after, and between - use the expected dates. // create a clean copy of the rrule object to bypass caching rule = rule.clone() @@ -150,8 +167,7 @@ export const testRecurring = function ( expectedDates[expectedDates.length - 1], true ), - expectedDates, - 'between, inc=true' + expectedDates ) assertDatesEqual( @@ -160,8 +176,7 @@ export const testRecurring = function ( expectedDates[expectedDates.length - 1], false ), - expectedDates.slice(1, expectedDates.length - 1), - 'between, inc=false' + expectedDates.slice(1, expectedDates.length - 1) ) } @@ -175,12 +190,12 @@ export const testRecurring = function ( prev = expectedDates[i - 1] // Test after() and before() with inc=true. - assertDatesEqual(rule.after(date, true), date, 'after, inc=true') - assertDatesEqual(rule.before(date, true), date, 'before, inc=true') + assertDatesEqual(rule.after(date, true), date) + assertDatesEqual(rule.before(date, true), date) // Test after() and before() with inc=false. - next && assertDatesEqual(rule.after(date, false), next, 'after, inc=false') - prev && assertDatesEqual(rule.before(date, false), prev, 'before, inc=false') + next && assertDatesEqual(rule.after(date, false), next) + prev && assertDatesEqual(rule.before(date, false), prev) } } } @@ -191,19 +206,15 @@ testRecurring.only = function (...args) { testRecurring.apply(it, [...args, it.only]) } -testRecurring.skip = function () { - it.skip.apply(it, arguments) +testRecurring.skip = function ([description]: [string]) { + // eslint-disable-next-line @typescript-eslint/no-empty-function, no-empty-function + it.skip(description, () => {}) } -export function expectedDate(startDate: DateTime, currentLocalDate: DateTime, targetZone: string): Date { - const targetOffset = startDate.setZone(targetZone).offset - const { zoneName: systemZone } = currentLocalDate - const { - offset: systemOffset, - } = startDate.setZone(systemZone) - - const netOffset = targetOffset - systemOffset - const hours = -((netOffset / 60) % 24) - const minutes = -(netOffset % 60) - return startDate.plus({ hours, minutes }).toJSDate() +export function expectedDate( + startDate: Date, + currentLocalDate: Date, + targetZone: string +): Date { + return dateInTimeZone(startDate, targetZone) } diff --git a/test/nlp.test.ts b/test/nlp.test.ts index 540912cd..8948616c 100644 --- a/test/nlp.test.ts +++ b/test/nlp.test.ts @@ -1,12 +1,15 @@ -import { expect } from 'chai' -import { DateTime } from 'luxon' -import RRule from '../src'; -import { optionsToString } from '../src/optionstostring'; -import {DateFormatter} from '../src/nlp/totext' +import { RRule } from '../src' +import { optionsToString } from '../src/optionstostring' +import { DateFormatter } from '../src/nlp/totext' +import { datetime } from './lib/utils' const texts = [ ['Every day', 'RRULE:FREQ=DAILY'], ['Every day at 10, 12 and 17', 'RRULE:FREQ=DAILY;BYHOUR=10,12,17'], + [ + 'Every week on Sunday at 10, 12 and 17', + 'RRULE:FREQ=WEEKLY;BYDAY=SU;BYHOUR=10,12,17', + ], ['Every week', 'RRULE:FREQ=WEEKLY'], ['Every hour', 'RRULE:FREQ=HOURLY'], ['Every 4 hours', 'RRULE:INTERVAL=4;FREQ=HOURLY'], @@ -26,7 +29,15 @@ const texts = [ ['Every month on the last Monday', 'RRULE:FREQ=MONTHLY;BYDAY=-1MO'], ['Every month on the 2nd last Friday', 'RRULE:FREQ=MONTHLY;BYDAY=-2FR'], // ['Every week until January 1, 2007', 'RRULE:FREQ=WEEKLY;UNTIL=20070101T080000Z'], - ['Every week for 20 times', 'RRULE:FREQ=WEEKLY;COUNT=20'] + ['Every week for 20 times', 'RRULE:FREQ=WEEKLY;COUNT=20'], +] + +const toTexts = [ + ...texts, + [ + 'Every week on monday', + 'DTSTART;TZID=America/New_York:20220601T000000\nRRULE:INTERVAL=1;FREQ=WEEKLY;BYDAY=MO', + ], ] describe('NLP', () => { @@ -34,16 +45,17 @@ describe('NLP', () => { texts.forEach(function (item) { const text = item[0] const str = item[1] - expect(RRule.fromText(text).toString()).equals(str, text + ' => ' + str) + expect(RRule.fromText(text).toString()).toBe(str) }) }) it('toText()', function () { - texts.forEach(function (item) { + toTexts.forEach(function (item) { const text = item[0] const str = item[1] - expect(RRule.fromString(str).toText().toLowerCase()).equals(text.toLowerCase(), - str + ' => ' + text) + expect(RRule.fromString(str).toText().toLowerCase()).toBe( + text.toLowerCase() + ) }) }) @@ -51,51 +63,75 @@ describe('NLP', () => { texts.forEach(function (item) { const text = item[0] const str = item[1] - expect(optionsToString(RRule.parseText(text))).equals(str, text + ' => ' + str) + expect(optionsToString(RRule.parseText(text))).toBe(str) }) }) it('permits integers in byweekday (#153)', () => { const rrule = new RRule({ freq: RRule.WEEKLY, - byweekday: 0 + byweekday: 0, }) - expect(rrule.toText()).to.equal('every week on Monday') - expect(rrule.toString()).to.equal('RRULE:FREQ=WEEKLY;BYDAY=MO') + expect(rrule.toText()).toBe('every week on Monday') + expect(rrule.toString()).toBe('RRULE:FREQ=WEEKLY;BYDAY=MO') }) it('sorts monthdays correctly (#101)', () => { - const options = { "freq": 2, "bymonthday": [3, 10, 17, 24] } + const options = { freq: 2, bymonthday: [3, 10, 17, 24] } const rule = new RRule(options) - expect(rule.toText()).to.equal('every week on the 3rd, 10th, 17th and 24th') + expect(rule.toText()).toBe('every week on the 3rd, 10th, 17th and 24th') }) it('shows correct text for every day', () => { - const options = { "freq": RRule.WEEKLY, byweekday: [ - RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR, RRule.SA, RRule.SU - ]} + const options = { + freq: RRule.WEEKLY, + byweekday: [ + RRule.MO, + RRule.TU, + RRule.WE, + RRule.TH, + RRule.FR, + RRule.SA, + RRule.SU, + ], + } + const rule = new RRule(options) + expect(rule.toText()).toBe('every day') + }) + + it('shows correct text for every minute', () => { + const options = { freq: RRule.MINUTELY } + const rule = new RRule(options) + expect(rule.toText()).toBe('every minute') + }) + + it('shows correct text for every (plural) minutes', () => { + const options = { freq: RRule.MINUTELY, interval: 2 } const rule = new RRule(options) - expect(rule.toText()).to.equal('every day') + expect(rule.toText()).toBe('every 2 minutes') }) - it('by default formats \'until\' correctly', () => { + it("by default formats 'until' correctly", () => { const rrule = new RRule({ freq: RRule.WEEKLY, - until: DateTime.utc(2012, 11, 10).toJSDate() + until: datetime(2012, 11, 10), }) - expect(rrule.toText()).to.equal('every week until November 10, 2012') + expect(rrule.toText()).toBe('every week until November 10, 2012') }) - it('formats \'until\' as desired if asked', () => { + it("formats 'until' as desired if asked", () => { const rrule = new RRule({ freq: RRule.WEEKLY, - until: DateTime.utc(2012, 11, 10).toJSDate() + until: datetime(2012, 11, 10), }) - const dateFormatter: DateFormatter = (year, month, day) => `${day}. ${month}, ${year}` + const dateFormatter: DateFormatter = (year, month, day) => + `${day}. ${month}, ${year}` - expect(rrule.toText(undefined, undefined, dateFormatter)).to.equal('every week until 10. November, 2012') + expect(rrule.toText(undefined, undefined, dateFormatter)).toBe( + 'every week until 10. November, 2012' + ) }) -}) \ No newline at end of file +}) diff --git a/test/optionstostring.test.ts b/test/optionstostring.test.ts index 4eb5e94e..b502622e 100644 --- a/test/optionstostring.test.ts +++ b/test/optionstostring.test.ts @@ -1,29 +1,44 @@ -import { Options } from "../src/types"; -import RRule from "../src/rrule"; -import { optionsToString } from "../src/optionstostring"; -import { expect } from "chai"; +import { Options } from '../src/types' +import { RRule } from '../src/rrule' +import { optionsToString } from '../src/optionstostring' +import { datetime } from './lib/utils' describe('optionsToString', () => { it('serializes valid single lines of rrules', function () { - const expectations: ([ Partial, string ][]) = [ - [{ freq: RRule.WEEKLY, until: new Date(Date.UTC(2010, 0, 1, 0, 0, 0)) }, 'RRULE:FREQ=WEEKLY;UNTIL=20100101T000000Z' ], - [{ dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), tzid: 'America/New_York' }, 'DTSTART;TZID=America/New_York:19970902T090000' ], + const expectations: [Partial, string][] = [ [ - { dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), freq: RRule.WEEKLY }, - 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=WEEKLY' + { freq: RRule.WEEKLY, until: datetime(2010, 1, 1, 0, 0, 0) }, + 'RRULE:FREQ=WEEKLY;UNTIL=20100101T000000Z', ], [ - { dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), tzid: 'America/New_York', freq: RRule.WEEKLY }, - 'DTSTART;TZID=America/New_York:19970902T090000\n' + - 'RRULE:FREQ=WEEKLY' - ] + { + dtstart: datetime(1997, 9, 2, 9, 0, 0), + tzid: 'America/New_York', + }, + 'DTSTART;TZID=America/New_York:19970902T090000', + ], + [ + { + dtstart: datetime(1997, 9, 2, 9, 0, 0), + freq: RRule.WEEKLY, + }, + 'DTSTART:19970902T090000Z\n' + 'RRULE:FREQ=WEEKLY', + ], + [ + { + dtstart: datetime(1997, 9, 2, 9, 0, 0), + tzid: 'America/New_York', + freq: RRule.WEEKLY, + }, + 'DTSTART;TZID=America/New_York:19970902T090000\n' + 'RRULE:FREQ=WEEKLY', + ], ] expectations.forEach(function (item) { const s = item[0] const s2 = item[1] - expect(optionsToString(s), JSON.stringify(s)).to.deep.equal(s2) + // JSON.stringify(s) + expect(optionsToString(s)).toEqual(s2) }) }) }) diff --git a/test/parseoptions.test.ts b/test/parseoptions.test.ts index a9c52e25..487f164e 100644 --- a/test/parseoptions.test.ts +++ b/test/parseoptions.test.ts @@ -1,15 +1,46 @@ import { parseOptions } from '../src/parseoptions' -import { expect } from 'chai' +import { RRule } from '../src' describe('TZID', () => { it('leaves null when null', () => { const options = parseOptions({ tzid: null }) - // tslint:disable-next-line:no-unused-expression - expect(options.parsedOptions.tzid).to.be.null + expect(options.parsedOptions.tzid).toBeNull() }) it('uses a string when passed in', () => { const options = parseOptions({ tzid: 'America/Los_Angeles' }) - expect(options.parsedOptions.tzid).to.equal('America/Los_Angeles') + expect(options.parsedOptions.tzid).toBe('America/Los_Angeles') + }) +}) + +describe('byweekday', () => { + it('works with a single numeric day', () => { + const options = parseOptions({ byweekday: 1 }) + expect(options.parsedOptions.byweekday).toEqual([1]) + }) + + it('works with a single Weekday day', () => { + const options = parseOptions({ byweekday: RRule.TU }) + expect(options.parsedOptions.byweekday).toEqual([1]) + }) + + it('works with a single string day', () => { + const options = parseOptions({ byweekday: 'TU' }) + expect(options.parsedOptions.byweekday).toEqual([1]) + }) + + it('works with a multiple numeric days', () => { + const options = parseOptions({ byweekday: [1, 2] }) + expect(options.parsedOptions.byweekday).toEqual([1, 2]) + }) + + it('works with a multiple Weekday days', () => { + const options = parseOptions({ byweekday: [RRule.TU, RRule.WE] }) + expect(options.parsedOptions.byweekday).toEqual([1, 2]) + }) + + it('works with a multiple string days', () => { + const options = parseOptions({ byweekday: ['TU', 'WE'] }) + expect(options.parsedOptions.byweekday).toEqual([1, 2]) }) }) diff --git a/test/parsestring.test.ts b/test/parsestring.test.ts index ade2397e..d96e86e7 100644 --- a/test/parsestring.test.ts +++ b/test/parsestring.test.ts @@ -1,68 +1,91 @@ -import RRule from '../src/rrule' -import { expect } from 'chai' +import { RRule } from '../src/rrule' import { parseString } from '../src/parsestring' -import { Options, Frequency } from '../src/types'; +import { Options, Frequency } from '../src/types' +import { datetime } from './lib/utils' describe('parseString', () => { it('parses valid single lines of rrules', function () { - const expectations: ([ string, Partial][]) = [ - ['FREQ=WEEKLY;UNTIL=20100101T000000Z', { freq: RRule.WEEKLY, until: new Date(Date.UTC(2010, 0, 1, 0, 0, 0)) }], + const expectations: [string, Partial][] = [ + [ + 'FREQ=WEEKLY;UNTIL=20100101T000000Z', + { freq: RRule.WEEKLY, until: datetime(2010, 1, 1, 0, 0, 0) }, + ], // Parse also `date` but return `date-time` - ['FREQ=WEEKLY;UNTIL=20100101', { freq: RRule.WEEKLY, until: new Date(Date.UTC(2010, 0, 1, 0, 0, 0)) }], - ['DTSTART;TZID=America/New_York:19970902T090000', { dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), tzid: 'America/New_York' }], - ['RRULE:DTSTART;TZID=America/New_York:19970902T090000', { dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), tzid: 'America/New_York' }] + [ + 'FREQ=WEEKLY;UNTIL=20100101', + { freq: RRule.WEEKLY, until: datetime(2010, 1, 1, 0, 0, 0) }, + ], + [ + 'DTSTART;TZID=America/New_York:19970902T090000', + { + dtstart: datetime(1997, 9, 2, 9, 0, 0), + tzid: 'America/New_York', + }, + ], + [ + 'RRULE:DTSTART;TZID=America/New_York:19970902T090000', + { + dtstart: datetime(1997, 9, 2, 9, 0, 0), + tzid: 'America/New_York', + }, + ], ] expectations.forEach(function (item) { const s = item[0] const s2 = item[1] - expect(parseString(s), s).to.deep.equal(s2) + // s + expect(parseString(s)).toEqual(s2) }) }) it('parses multiline rules', () => { - const expectations: ([ string, Partial][]) = [ + const expectations: [string, Partial][] = [ [ 'DTSTART;TZID=America/New_York:19970902T090000\nRRULE:FREQ=WEEKLY;UNTIL=20100101T000000Z', { - dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), + dtstart: datetime(1997, 9, 2, 9, 0, 0), tzid: 'America/New_York', freq: RRule.WEEKLY, - until: new Date(Date.UTC(2010, 0, 1, 0, 0, 0)) - } + until: datetime(2010, 1, 1, 0, 0, 0), + }, ], [ - 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3\n', + 'DTSTART:19970902T090000Z\n' + 'RRULE:FREQ=YEARLY;COUNT=3\n', { - dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), + dtstart: datetime(1997, 9, 2, 9, 0, 0), freq: RRule.YEARLY, - count: 3 - } - ] + count: 3, + }, + ], ] expectations.forEach(function (item) { const s = item[0] const s2 = item[1] - expect(parseString(s), s).to.deep.equal(s2) + // s + expect(parseString(s)).toEqual(s2) }) }) it('parses legacy dtstart in rrule', () => { - const expectations: ([ string, Partial][]) = [ - ['RRULE:FREQ=WEEKLY;DTSTART;TZID=America/New_York:19970902T090000', { - freq: Frequency.WEEKLY, - dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), - tzid: 'America/New_York' - }] + const expectations: [string, Partial][] = [ + [ + 'RRULE:FREQ=WEEKLY;DTSTART;TZID=America/New_York:19970902T090000', + { + freq: Frequency.WEEKLY, + dtstart: datetime(1997, 9, 2, 9, 0, 0), + tzid: 'America/New_York', + }, + ], ] expectations.forEach(function (item) { const s = item[0] const s2 = item[1] - expect(parseString(s), s).to.deep.equal(s2) + // s + expect(parseString(s)).toEqual(s2) }) }) }) diff --git a/test/rrule.test.ts b/test/rrule.test.ts index dbf90411..4269413d 100644 --- a/test/rrule.test.ts +++ b/test/rrule.test.ts @@ -1,41 +1,47 @@ -import { parse, datetime, testRecurring, expectedDate } from './lib/utils' -import { expect } from 'chai' +import { + parse, + datetime, + testRecurring, + expectedDate, + TEST_CTX, +} from './lib/utils' import { RRule, rrulestr, Frequency } from '../src/index' -import { DateTime } from 'luxon' import { set as setMockDate, reset as resetMockDate } from 'mockdate' -import { optionsToString } from '../src/optionstostring'; describe('RRule', function () { - // Enable additional toString() / fromString() tests - // for each testRecurring(). - this.ctx.ALSO_TEST_STRING_FUNCTIONS = true - - // Enable additional toText() / fromText() tests - // for each testRecurring(). - // Many of the tests fail because the conversion is only approximate, - // but it gives an idea about how well or bad it converts. - this.ctx.ALSO_TEST_NLP_FUNCTIONS = false - - // Thorough after()/before()/between() tests. - // NOTE: can take a longer time. - this.ctx.ALSO_TEST_BEFORE_AFTER_BETWEEN = true - - this.ctx.ALSO_TEST_SUBSECOND_PRECISION = true + beforeAll(() => { + // Enable additional toString() / fromString() tests + // for each testRecurring(). + TEST_CTX.ALSO_TESTSTRING_FUNCTIONS = true + + // Enable additional toText() / fromText() tests + // for each testRecurring(). + // Many of the tests fail because the conversion is only approximate, + // but it gives an idea about how well or bad it converts. + TEST_CTX.ALSO_TESTNLP_FUNCTIONS = false + + // Thorough after()/before()/between() tests. + // NOTE: can take a longer time. + TEST_CTX.ALSO_TESTBEFORE_AFTER_BETWEEN = true + + TEST_CTX.ALSO_TESTSUBSECOND_PRECISION = true + }) it('rrulestr https://github.com/jkbrzt/rrule/pull/164', function () { const s1 = 'RRULE:FREQ=WEEKLY;WKST=WE' const s2 = rrulestr(s1).toString() - expect(s1).equals(s2, s1 + ' => ' + s2) + expect(s1).toBe(s2) }) - + it('rrulestr itteration not infinite when interval 0', function () { - ['FREQ=YEARLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', - 'FREQ=MONTHLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', - 'FREQ=DAILY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', - 'FREQ=HOURLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', - 'FREQ=MINUTELY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', - 'FREQ=SECONDLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO'] - .map((s) => expect(rrulestr(s).count()).to.equal(0)) + ;[ + 'FREQ=YEARLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', + 'FREQ=MONTHLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', + 'FREQ=DAILY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', + 'FREQ=HOURLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', + 'FREQ=MINUTELY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', + 'FREQ=SECONDLY;INTERVAL=0;BYSETPOS=1;BYDAY=MO', + ].map((s) => expect(rrulestr(s).count()).toBe(0)) }) it('does not mutate the passed-in options object', function () { @@ -43,3532 +49,4038 @@ describe('RRule', function () { freq: RRule.MONTHLY, dtstart: new Date(2013, 0, 1), count: 3, - bymonthday: [28] + bymonthday: [28], } const rule = new RRule(options) - expect(options).deep.equals({ + expect(options).toEqual({ freq: RRule.MONTHLY, dtstart: new Date(2013, 0, 1), count: 3, - bymonthday: [28] + bymonthday: [28], }) - expect(rule.origOptions).deep.equals(options) + expect(rule.origOptions).toEqual(options) }) - testRecurring('missing Feb 28 https://github.com/jakubroztocil/rrule/issues/21', + testRecurring( + 'missing Feb 28 https://github.com/jakubroztocil/rrule/issues/21', new RRule({ freq: RRule.MONTHLY, - dtstart: new Date(Date.UTC(2013, 0, 1)), + dtstart: datetime(2013, 1, 1), count: 3, - bymonthday: [28] + bymonthday: [28], }), - [ - new Date(Date.UTC(2013, 0, 28)), - new Date(Date.UTC(2013, 1, 28)), - new Date(Date.UTC(2013, 2, 28)) - ] + [datetime(2013, 1, 28), datetime(2013, 2, 28), datetime(2013, 3, 28)] ) // ============================================================================= - // The original `dateutil.rrule` test suite converted from Py to JS. - // ============================================================================= + // The original `dateutil.rrule` test suite converted from Py to JS. + // ============================================================================= - testRecurring('testBefore', + testRecurring( + 'testBefore', { rrule: new RRule({ freq: RRule.DAILY, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), method: 'before', - args: [parse('19970905T090000')] + args: [parse('19970905T090000')], }, datetime(1997, 9, 4, 9, 0) ) - testRecurring('testBeforeInc', + testRecurring( + 'testBeforeInc', { rrule: new RRule({ freq: RRule.DAILY, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), method: 'before', - args: [parse('19970905T090000'), true] + args: [parse('19970905T090000'), true], }, datetime(1997, 9, 5, 9, 0) ) - testRecurring('testAfter', + testRecurring( + 'testAfter', { rrule: new RRule({ freq: RRule.DAILY, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), method: 'after', - args: [parse('19970904T090000')] + args: [parse('19970904T090000')], }, datetime(1997, 9, 5, 9, 0) ) - testRecurring('testAfterInc', + testRecurring( + 'testAfterInc', { rrule: new RRule({ freq: RRule.DAILY, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), method: 'after', - args: [parse('19970904T090000'), true] + args: [parse('19970904T090000'), true], }, datetime(1997, 9, 4, 9, 0) ) - testRecurring('testBetween', + testRecurring( + 'testBetween', { rrule: new RRule({ freq: RRule.DAILY, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), method: 'between', - args: [parse('19970902T090000'), parse('19970906T090000')] + args: [parse('19970902T090000'), parse('19970906T090000')], }, [ datetime(1997, 9, 3, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 5, 9, 0) + datetime(1997, 9, 5, 9, 0), ] ) - testRecurring('testBetweenInc', + testRecurring( + 'testBetweenInc', { rrule: new RRule({ freq: RRule.DAILY, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), method: 'between', - args: [parse('19970902T090000'), parse('19970906T090000'), true] + args: [parse('19970902T090000'), parse('19970906T090000'), true], }, [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 9, 0), datetime(1997, 9, 4, 9, 0), datetime(1997, 9, 5, 9, 0), - datetime(1997, 9, 6, 9, 0) + datetime(1997, 9, 6, 9, 0), ] ) - testRecurring('testYearly', + testRecurring( + 'testBetweenWithTZ', + { + rrule: new RRule({ + freq: RRule.WEEKLY, + dtstart: parse('20220613T090000'), + byweekday: [RRule.TU], + tzid: 'Europe/London', + }), + method: 'between', + args: [parse('20220613T093000'), parse('20220716T083000')], + }, + [ + expectedDate(datetime(2022, 6, 14, 9, 0), undefined, 'Europe/London'), + expectedDate(datetime(2022, 6, 21, 9, 0), undefined, 'Europe/London'), + expectedDate(datetime(2022, 6, 28, 9, 0), undefined, 'Europe/London'), + expectedDate(datetime(2022, 7, 5, 9, 0), undefined, 'Europe/London'), + expectedDate(datetime(2022, 7, 12, 9, 0), undefined, 'Europe/London'), + ] + ) + + testRecurring( + 'testYearly', new RRule({ freq: RRule.YEARLY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1998, 9, 2, 9, 0), - datetime(1999, 9, 2, 9, 0) + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testYearlyInterval', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyInterval', + new RRule({ + freq: RRule.YEARLY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1999, 9, 2, 9, 0), - datetime(2001, 9, 2, 9, 0) + datetime(2001, 9, 2, 9, 0), ] ) - testRecurring('testYearlyIntervalLarge', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyIntervalLarge', + new RRule({ + freq: RRule.YEARLY, count: 3, interval: 100, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(2097, 9, 2, 9, 0), - datetime(2197, 9, 2, 9, 0) + datetime(2197, 9, 2, 9, 0), ] ) - testRecurring('testYearlyByMonth', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonth', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 2, 9, 0), datetime(1998, 3, 2, 9, 0), - datetime(1999, 1, 2, 9, 0) + datetime(1999, 1, 2, 9, 0), ] ) - testRecurring('testYearlyByMonthDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthDay', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 9, 0), datetime(1997, 10, 1, 9, 0), - datetime(1997, 10, 3, 9, 0) + datetime(1997, 10, 3, 9, 0), ] ) - testRecurring('testYearlyByMonthAndMonthDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndMonthDay', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 9, 0), datetime(1998, 1, 7, 9, 0), - datetime(1998, 3, 5, 9, 0) + datetime(1998, 3, 5, 9, 0), ] ) - testRecurring('testYearlyByWeekDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByWeekDay', + new RRule({ + freq: RRule.YEARLY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testYearlyByNWeekDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByNWeekDay', + new RRule({ + freq: RRule.YEARLY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 25, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 12, 31, 9, 0) + datetime(1998, 12, 31, 9, 0), ] ) - testRecurring('testYearlyByNWeekDayLarge', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByNWeekDayLarge', + new RRule({ + freq: RRule.YEARLY, count: 3, byweekday: [RRule.TU.nth(13), RRule.TH.nth(-13)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 10, 2, 9, 0), datetime(1998, 3, 31, 9, 0), - datetime(1998, 10, 8, 9, 0) + datetime(1998, 10, 8, 9, 0), ] ) - testRecurring('testYearlyByMonthAndWeekDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndWeekDay', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 1, 8, 9, 0) + datetime(1998, 1, 8, 9, 0), ] ) - testRecurring('testYearlyByMonthAndNWeekDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndNWeekDay', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 6, 9, 0), datetime(1998, 1, 29, 9, 0), - datetime(1998, 3, 3, 9, 0) + datetime(1998, 3, 3, 9, 0), ] ) - testRecurring('testYearlyByMonthAndNWeekDayLarge', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndNWeekDayLarge', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(3), RRule.TH.nth(-3)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 15, 9, 0), datetime(1998, 1, 20, 9, 0), - datetime(1998, 3, 12, 9, 0) + datetime(1998, 3, 12, 9, 0), ] ) - testRecurring('testYearlyByMonthDayAndWeekDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 2, 3, 9, 0), - datetime(1998, 3, 3, 9, 0) + datetime(1998, 3, 3, 9, 0), ] ) - testRecurring('testYearlyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 3, 3, 9, 0), - datetime(2001, 3, 1, 9, 0) + datetime(2001, 3, 1, 9, 0), ] ) - testRecurring('testYearlyByYearDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByYearDay', + new RRule({ + freq: RRule.YEARLY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testYearlyByYearDayNeg', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByYearDayNeg', + new RRule({ + freq: RRule.YEARLY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testYearlyByMonthAndYearDay', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndYearDay', + new RRule({ + freq: RRule.YEARLY, count: 4, bymonth: [4, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 4, 10, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testYearlyByMonthAndYearDayNeg', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.YEARLY, count: 4, bymonth: [4, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 4, 10, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testYearlyByWeekNo', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByWeekNo', + new RRule({ + freq: RRule.YEARLY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 9, 0), datetime(1998, 5, 12, 9, 0), - datetime(1998, 5, 13, 9, 0) + datetime(1998, 5, 13, 9, 0), ] ) - testRecurring('testYearlyByWeekNoAndWeekDay', + testRecurring( + 'testYearlyByWeekNoAndWeekDay', // That's a nice one. The first days of week number one // may be in the last year. - new RRule({freq: RRule.YEARLY, + new RRule({ + freq: RRule.YEARLY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 9, 0), datetime(1999, 1, 4, 9, 0), - datetime(2000, 1, 3, 9, 0) + datetime(2000, 1, 3, 9, 0), ] ) - testRecurring('testYearlyByWeekNoAndWeekDayLarge', + testRecurring( + 'testYearlyByWeekNoAndWeekDayLarge', // Another nice test. The last days of week number 52/53 // may be in the next year. - new RRule({freq: RRule.YEARLY, + new RRule({ + freq: RRule.YEARLY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1998, 12, 27, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testYearlyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.YEARLY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1999, 1, 3, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testYearlyByEaster', - new RRule({ count: 3, - byeaster: 0, - dtstart: parse('19970902T090000') - }), + testRecurring( + 'testYearlyByEaster', + new RRule({ count: 3, byeaster: 0, dtstart: parse('19970902T090000') }), [ datetime(1998, 4, 12, 9, 0), datetime(1999, 4, 4, 9, 0), - datetime(2000, 4, 23, 9, 0) + datetime(2000, 4, 23, 9, 0), ] ) - testRecurring('testYearlyByEasterPos', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByEasterPos', + new RRule({ + freq: RRule.YEARLY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 9, 0), datetime(1999, 4, 5, 9, 0), - datetime(2000, 4, 24, 9, 0) + datetime(2000, 4, 24, 9, 0), ] ) - testRecurring('testYearlyByEasterNeg', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByEasterNeg', + new RRule({ + freq: RRule.YEARLY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 9, 0), datetime(1999, 4, 3, 9, 0), - datetime(2000, 4, 22, 9, 0) + datetime(2000, 4, 22, 9, 0), ] ) - testRecurring('testYearlyByWeekNoAndWeekDay53', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.YEARLY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 9, 0), datetime(2004, 12, 27, 9, 0), - datetime(2009, 12, 28, 9, 0) + datetime(2009, 12, 28, 9, 0), ] ) - testRecurring('testYearlyByHour', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByHour', + new RRule({ + freq: RRule.YEARLY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1998, 9, 2, 6, 0), - datetime(1998, 9, 2, 18, 0) + datetime(1998, 9, 2, 18, 0), ] ) - testRecurring('testYearlyByMinute', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMinute', + new RRule({ + freq: RRule.YEARLY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6), datetime(1997, 9, 2, 9, 18), - datetime(1998, 9, 2, 9, 6) + datetime(1998, 9, 2, 9, 6), ] ) - testRecurring('testYearlyBySecond', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyBySecond', + new RRule({ + freq: RRule.YEARLY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1998, 9, 2, 9, 0, 6) + datetime(1998, 9, 2, 9, 0, 6), ] ) - testRecurring('testYearlyByHourAndMinute', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByHourAndMinute', + new RRule({ + freq: RRule.YEARLY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6), datetime(1997, 9, 2, 18, 18), - datetime(1998, 9, 2, 6, 6) + datetime(1998, 9, 2, 6, 6), ] ) - testRecurring('testYearlyByHourAndSecond', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByHourAndSecond', + new RRule({ + freq: RRule.YEARLY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1998, 9, 2, 6, 0, 6) + datetime(1998, 9, 2, 6, 0, 6), ] ) - testRecurring('testYearlyByMinuteAndSecond', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByMinuteAndSecond', + new RRule({ + freq: RRule.YEARLY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testYearlyByHourAndMinuteAndSecond', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.YEARLY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testYearlyBySetPos', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testYearlyBySetPos', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonthday: 15, byhour: [6, 18], bysetpos: [3, -3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 11, 15, 18, 0), datetime(1998, 2, 15, 6, 0), - datetime(1998, 11, 15, 18, 0) + datetime(1998, 11, 15, 18, 0), ] ) - testRecurring('testYearlyBetweenInc', + testRecurring( + 'testYearlyBetweenInc', { rrule: new RRule({ freq: RRule.YEARLY, - dtstart: parse('20150101T000000') + dtstart: parse('20150101T000000'), }), method: 'between', - args: [parse('20160101T000000'), parse('20160101T000000'), true] + args: [parse('20160101T000000'), parse('20160101T000000'), true], }, - [ - datetime(2016, 1, 1) - ] + [datetime(2016, 1, 1)] ) - testRecurring('testYearlyBetweenIncLargeSpan', + testRecurring( + 'testYearlyBetweenIncLargeSpan', { rrule: new RRule({ freq: RRule.YEARLY, - dtstart: parse('19200101T000000') // Error because date lower than dateutil.ORDINAL_BASE + dtstart: parse('19200101T000000'), // Error because date lower than dateutil.ORDINAL_BASE }), method: 'between', - args: [parse('20160101T000000'), parse('20160101T000000'), true] + args: [parse('20160101T000000'), parse('20160101T000000'), true], }, - [ - datetime(2016, 1, 1) - ] + [datetime(2016, 1, 1)] ) - testRecurring('testMonthly', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthly', + new RRule({ + freq: RRule.MONTHLY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 10, 2, 9, 0), - datetime(1997, 11, 2, 9, 0) + datetime(1997, 11, 2, 9, 0), ] ) - testRecurring('testMonthlyInterval', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyInterval', + new RRule({ + freq: RRule.MONTHLY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 11, 2, 9, 0), - datetime(1998, 1, 2, 9, 0) + datetime(1998, 1, 2, 9, 0), ] ) - testRecurring('testMonthlyIntervalLarge', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyIntervalLarge', + new RRule({ + freq: RRule.MONTHLY, count: 3, interval: 18, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1999, 3, 2, 9, 0), - datetime(2000, 9, 2, 9, 0) + datetime(2000, 9, 2, 9, 0), ] ) - testRecurring('testMonthlyByMonth', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonth', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 2, 9, 0), datetime(1998, 3, 2, 9, 0), - datetime(1999, 1, 2, 9, 0) + datetime(1999, 1, 2, 9, 0), ] ) - testRecurring('testMonthlyByMonthDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 9, 0), datetime(1997, 10, 1, 9, 0), - datetime(1997, 10, 3, 9, 0) + datetime(1997, 10, 3, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndMonthDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndMonthDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 9, 0), datetime(1998, 1, 7, 9, 0), - datetime(1998, 3, 5, 9, 0) + datetime(1998, 3, 5, 9, 0), ] ) - testRecurring('testMonthlyByWeekDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByWeekDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testMonthlyByNWeekDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByNWeekDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 25, 9, 0), - datetime(1997, 10, 7, 9, 0) + datetime(1997, 10, 7, 9, 0), ] ) - testRecurring('testMonthlyByNWeekDayLarge', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByNWeekDayLarge', + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekday: [RRule.TU.nth(3), RRule.TH.nth(-3)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 11, 9, 0), datetime(1997, 9, 16, 9, 0), - datetime(1997, 10, 16, 9, 0) + datetime(1997, 10, 16, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndWeekDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndWeekDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 1, 8, 9, 0) + datetime(1998, 1, 8, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndNWeekDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndNWeekDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 6, 9, 0), datetime(1998, 1, 29, 9, 0), - datetime(1998, 3, 3, 9, 0) + datetime(1998, 3, 3, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndNWeekDayLarge', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndNWeekDayLarge', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(3), RRule.TH.nth(-3)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 15, 9, 0), datetime(1998, 1, 20, 9, 0), - datetime(1998, 3, 12, 9, 0) + datetime(1998, 3, 12, 9, 0), ] ) - testRecurring('testMonthlyByMonthDayAndWeekDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 2, 3, 9, 0), - datetime(1998, 3, 3, 9, 0) + datetime(1998, 3, 3, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 3, 3, 9, 0), - datetime(2001, 3, 1, 9, 0) + datetime(2001, 3, 1, 9, 0), ] ) - testRecurring('testMonthlyByYearDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByYearDay', + new RRule({ + freq: RRule.MONTHLY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testMonthlyByYearDayNeg', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByYearDayNeg', + new RRule({ + freq: RRule.MONTHLY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndYearDay', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndYearDay', + new RRule({ + freq: RRule.MONTHLY, count: 4, bymonth: [4, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 4, 10, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testMonthlyByMonthAndYearDayNeg', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.MONTHLY, count: 4, bymonth: [4, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 4, 10, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testMonthlyByWeekNo', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByWeekNo', + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 9, 0), datetime(1998, 5, 12, 9, 0), - datetime(1998, 5, 13, 9, 0) + datetime(1998, 5, 13, 9, 0), ] ) - testRecurring('testMonthlyByWeekNoAndWeekDay', + testRecurring( + 'testMonthlyByWeekNoAndWeekDay', // That's a nice one. The first days of week number one // may be in the last year. - new RRule({freq: RRule.MONTHLY, + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 9, 0), datetime(1999, 1, 4, 9, 0), - datetime(2000, 1, 3, 9, 0) + datetime(2000, 1, 3, 9, 0), ] ) - testRecurring('testMonthlyByWeekNoAndWeekDayLarge', + testRecurring( + 'testMonthlyByWeekNoAndWeekDayLarge', // Another nice test. The last days of week number 52/53 // may be in the next year. - new RRule({freq: RRule.MONTHLY, + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1998, 12, 27, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testMonthlyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1999, 1, 3, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testMonthlyByWeekNoAndWeekDay53', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.MONTHLY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 9, 0), datetime(2004, 12, 27, 9, 0), - datetime(2009, 12, 28, 9, 0) + datetime(2009, 12, 28, 9, 0), ] ) - testRecurring('testMonthlyByEaster', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByEaster', + new RRule({ + freq: RRule.MONTHLY, count: 3, byeaster: 0, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 12, 9, 0), datetime(1999, 4, 4, 9, 0), - datetime(2000, 4, 23, 9, 0) + datetime(2000, 4, 23, 9, 0), ] ) - testRecurring('testMonthlyByEasterPos', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByEasterPos', + new RRule({ + freq: RRule.MONTHLY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 9, 0), datetime(1999, 4, 5, 9, 0), - datetime(2000, 4, 24, 9, 0) + datetime(2000, 4, 24, 9, 0), ] ) - testRecurring('testMonthlyByEasterNeg', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByEasterNeg', + new RRule({ + freq: RRule.MONTHLY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 9, 0), datetime(1999, 4, 3, 9, 0), - datetime(2000, 4, 22, 9, 0) + datetime(2000, 4, 22, 9, 0), ] ) - testRecurring('testMonthlyByHour', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByHour', + new RRule({ + freq: RRule.MONTHLY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1997, 10, 2, 6, 0), - datetime(1997, 10, 2, 18, 0) + datetime(1997, 10, 2, 18, 0), ] ) - testRecurring('testMonthlyByMinute', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMinute', + new RRule({ + freq: RRule.MONTHLY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6), datetime(1997, 9, 2, 9, 18), - datetime(1997, 10, 2, 9, 6) + datetime(1997, 10, 2, 9, 6), ] ) - testRecurring('testMonthlyBySecond', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyBySecond', + new RRule({ + freq: RRule.MONTHLY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1997, 10, 2, 9, 0, 6) + datetime(1997, 10, 2, 9, 0, 6), ] ) - testRecurring('testMonthlyByHourAndMinute', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByHourAndMinute', + new RRule({ + freq: RRule.MONTHLY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6), datetime(1997, 9, 2, 18, 18), - datetime(1997, 10, 2, 6, 6) + datetime(1997, 10, 2, 6, 6), ] ) - testRecurring('testMonthlyByHourAndSecond', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByHourAndSecond', + new RRule({ + freq: RRule.MONTHLY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1997, 10, 2, 6, 0, 6) + datetime(1997, 10, 2, 6, 0, 6), ] ) - testRecurring('testMonthlyByMinuteAndSecond', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByMinuteAndSecond', + new RRule({ + freq: RRule.MONTHLY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testMonthlyByHourAndMinuteAndSecond', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.MONTHLY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testMonthlyBySetPos', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyBySetPos', + new RRule({ + freq: RRule.MONTHLY, count: 3, bymonthday: [13, 17], byhour: [6, 18], bysetpos: [3, -3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 13, 18, 0), datetime(1997, 9, 17, 6, 0), - datetime(1997, 10, 13, 18, 0) + datetime(1997, 10, 13, 18, 0), ] ) - testRecurring('testMonthlyNegByMonthDayJanFebForNonLeapYear', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyNegByMonthDayJanFebForNonLeapYear', + new RRule({ + freq: RRule.MONTHLY, count: 4, bymonthday: -1, - dtstart: parse('20131201T0900000') + dtstart: parse('20131201T0900000'), }), [ datetime(2013, 12, 31, 9, 0), datetime(2014, 1, 31, 9, 0), datetime(2014, 2, 28, 9, 0), - datetime(2014, 3, 31, 9, 0) + datetime(2014, 3, 31, 9, 0), ] ) - testRecurring('testMonthlyNegByMonthDayJanFebForLeapYear', - new RRule({freq: RRule.MONTHLY, + testRecurring( + 'testMonthlyNegByMonthDayJanFebForLeapYear', + new RRule({ + freq: RRule.MONTHLY, count: 4, bymonthday: -1, - dtstart: parse('20151201T0900000') + dtstart: parse('20151201T0900000'), }), [ datetime(2015, 12, 31, 9, 0), datetime(2016, 1, 31, 9, 0), datetime(2016, 2, 29, 9, 0), - datetime(2016, 3, 31, 9, 0) + datetime(2016, 3, 31, 9, 0), ] ) - testRecurring('testWeekly', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeekly', + new RRule({ + freq: RRule.WEEKLY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 9, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testWeeklyInterval', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyInterval', + new RRule({ + freq: RRule.WEEKLY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 16, 9, 0), - datetime(1997, 9, 30, 9, 0) + datetime(1997, 9, 30, 9, 0), ] ) - testRecurring('testWeeklyIntervalLarge', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyIntervalLarge', + new RRule({ + freq: RRule.WEEKLY, count: 3, interval: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1998, 1, 20, 9, 0), - datetime(1998, 6, 9, 9, 0) + datetime(1998, 6, 9, 9, 0), ] ) - testRecurring('testWeeklyByMonth', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonth', + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 6, 9, 0), datetime(1998, 1, 13, 9, 0), - datetime(1998, 1, 20, 9, 0) + datetime(1998, 1, 20, 9, 0), ] ) - testRecurring('testWeeklyByMonthDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 9, 0), datetime(1997, 10, 1, 9, 0), - datetime(1997, 10, 3, 9, 0) + datetime(1997, 10, 3, 9, 0), ] ) - testRecurring('testWeeklyByMonthAndMonthDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthAndMonthDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 9, 0), datetime(1998, 1, 7, 9, 0), - datetime(1998, 3, 5, 9, 0) + datetime(1998, 3, 5, 9, 0), ] ) - testRecurring('testWeeklyByWeekDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByWeekDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testWeeklyByNWeekDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByNWeekDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testWeeklyByMonthAndWeekDay', + testRecurring( + 'testWeeklyByMonthAndWeekDay', // This test is interesting, because it crosses the year // boundary in a weekly period to find day '1' as a // valid recurrence. - new RRule({freq: RRule.WEEKLY, + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 1, 8, 9, 0) + datetime(1998, 1, 8, 9, 0), ] ) - testRecurring('testWeeklyByMonthAndNWeekDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthAndNWeekDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 1, 8, 9, 0) + datetime(1998, 1, 8, 9, 0), ] ) - testRecurring('testWeeklyByMonthDayAndWeekDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 2, 3, 9, 0), - datetime(1998, 3, 3, 9, 0) + datetime(1998, 3, 3, 9, 0), ] ) - testRecurring('testWeeklyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.WEEKLY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 3, 3, 9, 0), - datetime(2001, 3, 1, 9, 0) + datetime(2001, 3, 1, 9, 0), ] ) - testRecurring('testWeeklyByYearDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByYearDay', + new RRule({ + freq: RRule.WEEKLY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testWeeklyByYearDayNeg', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByYearDayNeg', + new RRule({ + freq: RRule.WEEKLY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testWeeklyByMonthAndYearDay', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthAndYearDay', + new RRule({ + freq: RRule.WEEKLY, count: 4, bymonth: [1, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 1, 1, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testWeeklyByMonthAndYearDayNeg', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.WEEKLY, count: 4, bymonth: [1, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 1, 1, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testWeeklyByWeekNo', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByWeekNo', + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 9, 0), datetime(1998, 5, 12, 9, 0), - datetime(1998, 5, 13, 9, 0) + datetime(1998, 5, 13, 9, 0), ] ) - testRecurring('testWeeklyByWeekNoAndWeekDay', + testRecurring( + 'testWeeklyByWeekNoAndWeekDay', // That's a nice one. The first days of week number one // may be in the last year. - new RRule({freq: RRule.WEEKLY, + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 9, 0), datetime(1999, 1, 4, 9, 0), - datetime(2000, 1, 3, 9, 0) + datetime(2000, 1, 3, 9, 0), ] ) - testRecurring('testWeeklyByWeekNoAndWeekDayLarge', + testRecurring( + 'testWeeklyByWeekNoAndWeekDayLarge', // Another nice test. The last days of week number 52/53 // may be in the next year. - new RRule({freq: RRule.WEEKLY, + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1998, 12, 27, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testWeeklyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1999, 1, 3, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testWeeklyByWeekNoAndWeekDay53', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 9, 0), datetime(2004, 12, 27, 9, 0), - datetime(2009, 12, 28, 9, 0) + datetime(2009, 12, 28, 9, 0), ] ) - testRecurring('testWeeklyByEaster', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByEaster', + new RRule({ + freq: RRule.WEEKLY, count: 3, byeaster: 0, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 12, 9, 0), datetime(1999, 4, 4, 9, 0), - datetime(2000, 4, 23, 9, 0) + datetime(2000, 4, 23, 9, 0), ] ) - testRecurring('testWeeklyByEasterPos', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByEasterPos', + new RRule({ + freq: RRule.WEEKLY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 9, 0), datetime(1999, 4, 5, 9, 0), - datetime(2000, 4, 24, 9, 0) + datetime(2000, 4, 24, 9, 0), ] ) - testRecurring('testWeeklyByEasterNeg', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByEasterNeg', + new RRule({ + freq: RRule.WEEKLY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 9, 0), datetime(1999, 4, 3, 9, 0), - datetime(2000, 4, 22, 9, 0) + datetime(2000, 4, 22, 9, 0), ] ) - testRecurring('testWeeklyByHour', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByHour', + new RRule({ + freq: RRule.WEEKLY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1997, 9, 9, 6, 0), - datetime(1997, 9, 9, 18, 0) + datetime(1997, 9, 9, 18, 0), ] ) - testRecurring('testWeeklyByMinute', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMinute', + new RRule({ + freq: RRule.WEEKLY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6), datetime(1997, 9, 2, 9, 18), - datetime(1997, 9, 9, 9, 6) + datetime(1997, 9, 9, 9, 6), ] ) - testRecurring('testWeeklyBySecond', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyBySecond', + new RRule({ + freq: RRule.WEEKLY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1997, 9, 9, 9, 0, 6) + datetime(1997, 9, 9, 9, 0, 6), ] ) - testRecurring('testWeeklyByHourAndMinute', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByHourAndMinute', + new RRule({ + freq: RRule.WEEKLY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6), datetime(1997, 9, 2, 18, 18), - datetime(1997, 9, 9, 6, 6) + datetime(1997, 9, 9, 6, 6), ] ) - testRecurring('testWeeklyByHourAndSecond', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByHourAndSecond', + new RRule({ + freq: RRule.WEEKLY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1997, 9, 9, 6, 0, 6) + datetime(1997, 9, 9, 6, 0, 6), ] ) - testRecurring('testWeeklyByMinuteAndSecond', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByMinuteAndSecond', + new RRule({ + freq: RRule.WEEKLY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testWeeklyByHourAndMinuteAndSecond', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.WEEKLY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testWeeklyBySetPos', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWeeklyBySetPos', + new RRule({ + freq: RRule.WEEKLY, count: 3, byweekday: [RRule.TU, RRule.TH], byhour: [6, 18], bysetpos: [3, -3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1997, 9, 4, 6, 0), - datetime(1997, 9, 9, 18, 0) + datetime(1997, 9, 9, 18, 0), ] ) - testRecurring('testDaily', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDaily', + new RRule({ + freq: RRule.DAILY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 9, 0), - datetime(1997, 9, 4, 9, 0) + datetime(1997, 9, 4, 9, 0), ] ) - testRecurring('testDailyInterval', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyInterval', + new RRule({ + freq: RRule.DAILY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 6, 9, 0) + datetime(1997, 9, 6, 9, 0), ] ) - testRecurring('testDailyIntervalLarge', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyIntervalLarge', + new RRule({ + freq: RRule.DAILY, count: 3, interval: 92, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 12, 3, 9, 0), - datetime(1998, 3, 5, 9, 0) + datetime(1998, 3, 5, 9, 0), ] ) - testRecurring('testDailyByMonth', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonth', + new RRule({ + freq: RRule.DAILY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 2, 9, 0), - datetime(1998, 1, 3, 9, 0) + datetime(1998, 1, 3, 9, 0), ] ) - testRecurring('testDailyByMonthDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthDay', + new RRule({ + freq: RRule.DAILY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 9, 0), datetime(1997, 10, 1, 9, 0), - datetime(1997, 10, 3, 9, 0) + datetime(1997, 10, 3, 9, 0), ] ) - testRecurring('testDailyByMonthAndMonthDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthAndMonthDay', + new RRule({ + freq: RRule.DAILY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 9, 0), datetime(1998, 1, 7, 9, 0), - datetime(1998, 3, 5, 9, 0) + datetime(1998, 3, 5, 9, 0), ] ) - testRecurring('testDailyByWeekDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByWeekDay', + new RRule({ + freq: RRule.DAILY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testDailyByNWeekDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByNWeekDay', + new RRule({ + freq: RRule.DAILY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testDailyByMonthAndWeekDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthAndWeekDay', + new RRule({ + freq: RRule.DAILY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 1, 8, 9, 0) + datetime(1998, 1, 8, 9, 0), ] ) - testRecurring('testDailyByMonthAndNWeekDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthAndNWeekDay', + new RRule({ + freq: RRule.DAILY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 1, 6, 9, 0), - datetime(1998, 1, 8, 9, 0) + datetime(1998, 1, 8, 9, 0), ] ) - testRecurring('testDailyByMonthDayAndWeekDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.DAILY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 2, 3, 9, 0), - datetime(1998, 3, 3, 9, 0) + datetime(1998, 3, 3, 9, 0), ] ) - testRecurring('testDailyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.DAILY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 3, 3, 9, 0), - datetime(2001, 3, 1, 9, 0) + datetime(2001, 3, 1, 9, 0), ] ) - testRecurring('testDailyByYearDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByYearDay', + new RRule({ + freq: RRule.DAILY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testDailyByYearDayNeg', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByYearDayNeg', + new RRule({ + freq: RRule.DAILY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 9, 0), datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), - datetime(1998, 7, 19, 9, 0) + datetime(1998, 7, 19, 9, 0), ] ) - testRecurring('testDailyByMonthAndYearDay', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthAndYearDay', + new RRule({ + freq: RRule.DAILY, count: 4, bymonth: [1, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 1, 1, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testDailyByMonthAndYearDayNeg', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.DAILY, count: 4, bymonth: [1, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 9, 0), datetime(1998, 7, 19, 9, 0), datetime(1999, 1, 1, 9, 0), - datetime(1999, 7, 19, 9, 0) + datetime(1999, 7, 19, 9, 0), ] ) - testRecurring('testDailyByWeekNo', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByWeekNo', + new RRule({ + freq: RRule.DAILY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 9, 0), datetime(1998, 5, 12, 9, 0), - datetime(1998, 5, 13, 9, 0) + datetime(1998, 5, 13, 9, 0), ] ) - testRecurring('testDailyByWeekNoAndWeekDay', + testRecurring( + 'testDailyByWeekNoAndWeekDay', // That's a nice one. The first days of week number one // may be in the last year. - new RRule({freq: RRule.DAILY, + new RRule({ + freq: RRule.DAILY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 9, 0), datetime(1999, 1, 4, 9, 0), - datetime(2000, 1, 3, 9, 0) + datetime(2000, 1, 3, 9, 0), ] ) - testRecurring('testDailyByWeekNoAndWeekDayLarge', + testRecurring( + 'testDailyByWeekNoAndWeekDayLarge', // Another nice test. The last days of week number 52/53 // may be in the next year. - new RRule({freq: RRule.DAILY, + new RRule({ + freq: RRule.DAILY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1998, 12, 27, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testDailyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.DAILY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 9, 0), datetime(1999, 1, 3, 9, 0), - datetime(2000, 1, 2, 9, 0) + datetime(2000, 1, 2, 9, 0), ] ) - testRecurring('testDailyByWeekNoAndWeekDay53', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.DAILY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 9, 0), datetime(2004, 12, 27, 9, 0), - datetime(2009, 12, 28, 9, 0) + datetime(2009, 12, 28, 9, 0), ] ) - testRecurring('testDailyByEaster', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByEaster', + new RRule({ + freq: RRule.DAILY, count: 3, byeaster: 0, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 12, 9, 0), datetime(1999, 4, 4, 9, 0), - datetime(2000, 4, 23, 9, 0) + datetime(2000, 4, 23, 9, 0), ] ) - testRecurring('testDailyByEasterPos', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByEasterPos', + new RRule({ + freq: RRule.DAILY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 9, 0), datetime(1999, 4, 5, 9, 0), - datetime(2000, 4, 24, 9, 0) + datetime(2000, 4, 24, 9, 0), ] ) - testRecurring('testDailyByEasterNeg', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByEasterNeg', + new RRule({ + freq: RRule.DAILY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 9, 0), datetime(1999, 4, 3, 9, 0), - datetime(2000, 4, 22, 9, 0) + datetime(2000, 4, 22, 9, 0), ] ) - testRecurring('testDailyByHour', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByHour', + new RRule({ + freq: RRule.DAILY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1997, 9, 3, 6, 0), - datetime(1997, 9, 3, 18, 0) + datetime(1997, 9, 3, 18, 0), ] ) - testRecurring('testDailyByMinute', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMinute', + new RRule({ + freq: RRule.DAILY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6), datetime(1997, 9, 2, 9, 18), - datetime(1997, 9, 3, 9, 6) + datetime(1997, 9, 3, 9, 6), ] ) - testRecurring('testDailyBySecond', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyBySecond', + new RRule({ + freq: RRule.DAILY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1997, 9, 3, 9, 0, 6) + datetime(1997, 9, 3, 9, 0, 6), ] ) - testRecurring('testDailyByHourAndMinute', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByHourAndMinute', + new RRule({ + freq: RRule.DAILY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6), datetime(1997, 9, 2, 18, 18), - datetime(1997, 9, 3, 6, 6) + datetime(1997, 9, 3, 6, 6), ] ) - testRecurring('testDailyByHourAndSecond', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByHourAndSecond', + new RRule({ + freq: RRule.DAILY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1997, 9, 3, 6, 0, 6) + datetime(1997, 9, 3, 6, 0, 6), ] ) - testRecurring('testDailyByMinuteAndSecond', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByMinuteAndSecond', + new RRule({ + freq: RRule.DAILY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testDailyByHourAndMinuteAndSecond', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.DAILY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testDailyBySetPos', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDailyBySetPos', + new RRule({ + freq: RRule.DAILY, count: 3, byhour: [6, 18], byminute: [15, 45], bysetpos: [3, -3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 15), datetime(1997, 9, 3, 6, 45), - datetime(1997, 9, 3, 18, 15) + datetime(1997, 9, 3, 18, 15), ] ) - testRecurring('testHourly', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourly', + new RRule({ + freq: RRule.HOURLY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 10, 0), - datetime(1997, 9, 2, 11, 0) + datetime(1997, 9, 2, 11, 0), ] ) - testRecurring('testHourlyInterval', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyInterval', + new RRule({ + freq: RRule.HOURLY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 11, 0), - datetime(1997, 9, 2, 13, 0) + datetime(1997, 9, 2, 13, 0), ] ) - testRecurring('testHourlyIntervalLarge', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyIntervalLarge', + new RRule({ + freq: RRule.HOURLY, count: 3, interval: 769, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 10, 4, 10, 0), - datetime(1997, 11, 5, 11, 0) + datetime(1997, 11, 5, 11, 0), ] ) - testRecurring('testHourlyByMonth', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonth', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 1, 0), - datetime(1998, 1, 1, 2, 0) + datetime(1998, 1, 1, 2, 0), ] ) - testRecurring('testHourlyByMonthDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthDay', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 0, 0), datetime(1997, 9, 3, 1, 0), - datetime(1997, 9, 3, 2, 0) + datetime(1997, 9, 3, 2, 0), ] ) - testRecurring('testHourlyByMonthAndMonthDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthAndMonthDay', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 0, 0), datetime(1998, 1, 5, 1, 0), - datetime(1998, 1, 5, 2, 0) + datetime(1998, 1, 5, 2, 0), ] ) - testRecurring('testHourlyByWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 10, 0), - datetime(1997, 9, 2, 11, 0) + datetime(1997, 9, 2, 11, 0), ] ) - testRecurring('testHourlyByNWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByNWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 10, 0), - datetime(1997, 9, 2, 11, 0) + datetime(1997, 9, 2, 11, 0), ] ) - testRecurring('testHourlyByMonthAndWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthAndWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 1, 0), - datetime(1998, 1, 1, 2, 0) + datetime(1998, 1, 1, 2, 0), ] ) - testRecurring('testHourlyByMonthAndNWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthAndNWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 1, 0), - datetime(1998, 1, 1, 2, 0) + datetime(1998, 1, 1, 2, 0), ] ) - testRecurring('testHourlyByMonthDayAndWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 1, 0), - datetime(1998, 1, 1, 2, 0) + datetime(1998, 1, 1, 2, 0), ] ) - testRecurring('testHourlyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 1, 0), - datetime(1998, 1, 1, 2, 0) + datetime(1998, 1, 1, 2, 0), ] ) - testRecurring('testHourlyByYearDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByYearDay', + new RRule({ + freq: RRule.HOURLY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 0, 0), datetime(1997, 12, 31, 1, 0), datetime(1997, 12, 31, 2, 0), - datetime(1997, 12, 31, 3, 0) + datetime(1997, 12, 31, 3, 0), ] ) - testRecurring('testHourlyByYearDayNeg', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByYearDayNeg', + new RRule({ + freq: RRule.HOURLY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 0, 0), datetime(1997, 12, 31, 1, 0), datetime(1997, 12, 31, 2, 0), - datetime(1997, 12, 31, 3, 0) + datetime(1997, 12, 31, 3, 0), ] ) - testRecurring('testHourlyByMonthAndYearDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthAndYearDay', + new RRule({ + freq: RRule.HOURLY, count: 4, bymonth: [4, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 0, 0), datetime(1998, 4, 10, 1, 0), datetime(1998, 4, 10, 2, 0), - datetime(1998, 4, 10, 3, 0) + datetime(1998, 4, 10, 3, 0), ] ) - testRecurring('testHourlyByMonthAndYearDayNeg', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.HOURLY, count: 4, bymonth: [4, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 0, 0), datetime(1998, 4, 10, 1, 0), datetime(1998, 4, 10, 2, 0), - datetime(1998, 4, 10, 3, 0) + datetime(1998, 4, 10, 3, 0), ] ) - testRecurring('testHourlyByWeekNo', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByWeekNo', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 0, 0), datetime(1998, 5, 11, 1, 0), - datetime(1998, 5, 11, 2, 0) + datetime(1998, 5, 11, 2, 0), ] ) - testRecurring('testHourlyByWeekNoAndWeekDay', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByWeekNoAndWeekDay', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 0, 0), datetime(1997, 12, 29, 1, 0), - datetime(1997, 12, 29, 2, 0) + datetime(1997, 12, 29, 2, 0), ] ) - testRecurring('testHourlyByWeekNoAndWeekDayLarge', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByWeekNoAndWeekDayLarge', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 0, 0), datetime(1997, 12, 28, 1, 0), - datetime(1997, 12, 28, 2, 0) + datetime(1997, 12, 28, 2, 0), ] ) - testRecurring('testHourlyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 0, 0), datetime(1997, 12, 28, 1, 0), - datetime(1997, 12, 28, 2, 0) + datetime(1997, 12, 28, 2, 0), ] ) - testRecurring('testHourlyByWeekNoAndWeekDay53', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.HOURLY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 0, 0), datetime(1998, 12, 28, 1, 0), - datetime(1998, 12, 28, 2, 0) + datetime(1998, 12, 28, 2, 0), ] ) - testRecurring.skip('testHourlyByEaster', - new RRule({freq: RRule.HOURLY, + testRecurring.skip( + 'testHourlyByEaster', + new RRule({ + freq: RRule.HOURLY, count: 3, byeaster: 0, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 12, 0, 0), datetime(1998, 4, 12, 1, 0), - datetime(1998, 4, 12, 2, 0) + datetime(1998, 4, 12, 2, 0), ] ) - testRecurring.skip('testHourlyByEasterPos', - new RRule({freq: RRule.HOURLY, + testRecurring.skip( + 'testHourlyByEasterPos', + new RRule({ + freq: RRule.HOURLY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 0, 0), datetime(1998, 4, 13, 1, 0), - datetime(1998, 4, 13, 2, 0) + datetime(1998, 4, 13, 2, 0), ] ) - testRecurring.skip('testHourlyByEasterNeg', - new RRule({freq: RRule.HOURLY, + testRecurring.skip( + 'testHourlyByEasterNeg', + new RRule({ + freq: RRule.HOURLY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 0, 0), datetime(1998, 4, 11, 1, 0), - datetime(1998, 4, 11, 2, 0) + datetime(1998, 4, 11, 2, 0), ] ) - testRecurring('testHourlyByHour', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByHour', + new RRule({ + freq: RRule.HOURLY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1997, 9, 3, 6, 0), - datetime(1997, 9, 3, 18, 0) + datetime(1997, 9, 3, 18, 0), ] ) - testRecurring('testHourlyByMinute', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMinute', + new RRule({ + freq: RRule.HOURLY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6), datetime(1997, 9, 2, 9, 18), - datetime(1997, 9, 2, 10, 6) + datetime(1997, 9, 2, 10, 6), ] ) - testRecurring('testHourlyBySecond', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyBySecond', + new RRule({ + freq: RRule.HOURLY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1997, 9, 2, 10, 0, 6) + datetime(1997, 9, 2, 10, 0, 6), ] ) - testRecurring('testHourlyByHourAndMinute', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByHourAndMinute', + new RRule({ + freq: RRule.HOURLY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6), datetime(1997, 9, 2, 18, 18), - datetime(1997, 9, 3, 6, 6) + datetime(1997, 9, 3, 6, 6), ] ) - testRecurring('testHourlyByHourAndSecond', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByHourAndSecond', + new RRule({ + freq: RRule.HOURLY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1997, 9, 3, 6, 0, 6) + datetime(1997, 9, 3, 6, 0, 6), ] ) - testRecurring('testHourlyByMinuteAndSecond', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByMinuteAndSecond', + new RRule({ + freq: RRule.HOURLY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testHourlyByHourAndMinuteAndSecond', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.HOURLY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testHourlyBySetPos', - new RRule({freq: RRule.HOURLY, + testRecurring( + 'testHourlyBySetPos', + new RRule({ + freq: RRule.HOURLY, count: 3, byminute: [15, 45], bysecond: [15, 45], bysetpos: [3, -3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 15, 45), datetime(1997, 9, 2, 9, 45, 15), - datetime(1997, 9, 2, 10, 15, 45) + datetime(1997, 9, 2, 10, 15, 45), ] ) - testRecurring('testMinutely', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutely', + new RRule({ + freq: RRule.MINUTELY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 9, 1), - datetime(1997, 9, 2, 9, 2) + datetime(1997, 9, 2, 9, 2), ] ) - testRecurring('testMinutelyInterval', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyInterval', + new RRule({ + freq: RRule.MINUTELY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 9, 2), - datetime(1997, 9, 2, 9, 4) + datetime(1997, 9, 2, 9, 4), ] ) - testRecurring('testMinutelyIntervalLarge', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyIntervalLarge', + new RRule({ + freq: RRule.MINUTELY, count: 3, interval: 1501, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 10, 1), - datetime(1997, 9, 4, 11, 2) + datetime(1997, 9, 4, 11, 2), ] ) - testRecurring('testMinutelyByMonth', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonth', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 0, 1), - datetime(1998, 1, 1, 0, 2) + datetime(1998, 1, 1, 0, 2), ] ) - testRecurring('testMinutelyByMonthDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 0, 0), datetime(1997, 9, 3, 0, 1), - datetime(1997, 9, 3, 0, 2) + datetime(1997, 9, 3, 0, 2), ] ) - testRecurring('testMinutelyByMonthAndMonthDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthAndMonthDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 0, 0), datetime(1998, 1, 5, 0, 1), - datetime(1998, 1, 5, 0, 2) + datetime(1998, 1, 5, 0, 2), ] ) - testRecurring('testMinutelyByWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 9, 1), - datetime(1997, 9, 2, 9, 2) + datetime(1997, 9, 2, 9, 2), ] ) - testRecurring('testMinutelyByNWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByNWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 2, 9, 1), - datetime(1997, 9, 2, 9, 2) + datetime(1997, 9, 2, 9, 2), ] ) - testRecurring('testMinutelyByMonthAndWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthAndWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 0, 1), - datetime(1998, 1, 1, 0, 2) + datetime(1998, 1, 1, 0, 2), ] ) - testRecurring('testMinutelyByMonthAndNWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthAndNWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 0, 1), - datetime(1998, 1, 1, 0, 2) + datetime(1998, 1, 1, 0, 2), ] ) - testRecurring('testMinutelyByMonthDayAndWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 0, 1), - datetime(1998, 1, 1, 0, 2) + datetime(1998, 1, 1, 0, 2), ] ) - testRecurring('testMinutelyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0), datetime(1998, 1, 1, 0, 1), - datetime(1998, 1, 1, 0, 2) + datetime(1998, 1, 1, 0, 2), ] ) - testRecurring('testMinutelyByYearDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByYearDay', + new RRule({ + freq: RRule.MINUTELY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 0, 0), datetime(1997, 12, 31, 0, 1), datetime(1997, 12, 31, 0, 2), - datetime(1997, 12, 31, 0, 3) + datetime(1997, 12, 31, 0, 3), ] ) - testRecurring('testMinutelyByYearDayNeg', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByYearDayNeg', + new RRule({ + freq: RRule.MINUTELY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 0, 0), datetime(1997, 12, 31, 0, 1), datetime(1997, 12, 31, 0, 2), - datetime(1997, 12, 31, 0, 3) + datetime(1997, 12, 31, 0, 3), ] ) - testRecurring('testMinutelyByMonthAndYearDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthAndYearDay', + new RRule({ + freq: RRule.MINUTELY, count: 4, bymonth: [4, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 0, 0), datetime(1998, 4, 10, 0, 1), datetime(1998, 4, 10, 0, 2), - datetime(1998, 4, 10, 0, 3) + datetime(1998, 4, 10, 0, 3), ] ) - testRecurring('testMinutelyByMonthAndYearDayNeg', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.MINUTELY, count: 4, bymonth: [4, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 0, 0), datetime(1998, 4, 10, 0, 1), datetime(1998, 4, 10, 0, 2), - datetime(1998, 4, 10, 0, 3) + datetime(1998, 4, 10, 0, 3), ] ) - testRecurring('testMinutelyByWeekNo', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByWeekNo', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 0, 0), datetime(1998, 5, 11, 0, 1), - datetime(1998, 5, 11, 0, 2) + datetime(1998, 5, 11, 0, 2), ] ) - testRecurring('testMinutelyByWeekNoAndWeekDay', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByWeekNoAndWeekDay', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 0, 0), datetime(1997, 12, 29, 0, 1), - datetime(1997, 12, 29, 0, 2) + datetime(1997, 12, 29, 0, 2), ] ) - testRecurring('testMinutelyByWeekNoAndWeekDayLarge', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByWeekNoAndWeekDayLarge', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 0, 0), datetime(1997, 12, 28, 0, 1), - datetime(1997, 12, 28, 0, 2) + datetime(1997, 12, 28, 0, 2), ] ) - testRecurring('testMinutelyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 0, 0), datetime(1997, 12, 28, 0, 1), - datetime(1997, 12, 28, 0, 2) + datetime(1997, 12, 28, 0, 2), ] ) - testRecurring('testMinutelyByWeekNoAndWeekDay53', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.MINUTELY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 0, 0), datetime(1998, 12, 28, 0, 1), - datetime(1998, 12, 28, 0, 2) + datetime(1998, 12, 28, 0, 2), ] ) - testRecurring.skip('testMinutelyByEaster', - new RRule({freq: RRule.MINUTELY, + testRecurring.skip( + 'testMinutelyByEaster', + new RRule({ + freq: RRule.MINUTELY, count: 3, byeaster: 0, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 12, 0, 0), datetime(1998, 4, 12, 0, 1), - datetime(1998, 4, 12, 0, 2) + datetime(1998, 4, 12, 0, 2), ] ) - testRecurring.skip('testMinutelyByEasterPos', - new RRule({freq: RRule.MINUTELY, + testRecurring.skip( + 'testMinutelyByEasterPos', + new RRule({ + freq: RRule.MINUTELY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 0, 0), datetime(1998, 4, 13, 0, 1), - datetime(1998, 4, 13, 0, 2) + datetime(1998, 4, 13, 0, 2), ] ) - testRecurring.skip('testMinutelyByEasterNeg', - new RRule({freq: RRule.MINUTELY, + testRecurring.skip( + 'testMinutelyByEasterNeg', + new RRule({ + freq: RRule.MINUTELY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 0, 0), datetime(1998, 4, 11, 0, 1), - datetime(1998, 4, 11, 0, 2) + datetime(1998, 4, 11, 0, 2), ] ) - testRecurring('testMinutelyByHour', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByHour', + new RRule({ + freq: RRule.MINUTELY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0), datetime(1997, 9, 2, 18, 1), - datetime(1997, 9, 2, 18, 2) + datetime(1997, 9, 2, 18, 2), ] ) - testRecurring('testMinutelyByMinute', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMinute', + new RRule({ + freq: RRule.MINUTELY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6), datetime(1997, 9, 2, 9, 18), - datetime(1997, 9, 2, 10, 6) + datetime(1997, 9, 2, 10, 6), ] ) - testRecurring('testMinutelyBySecond', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyBySecond', + new RRule({ + freq: RRule.MINUTELY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1997, 9, 2, 9, 1, 6) + datetime(1997, 9, 2, 9, 1, 6), ] ) - testRecurring('testMinutelyByHourAndMinute', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByHourAndMinute', + new RRule({ + freq: RRule.MINUTELY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6), datetime(1997, 9, 2, 18, 18), - datetime(1997, 9, 3, 6, 6) + datetime(1997, 9, 3, 6, 6), ] ) - testRecurring('testMinutelyByHourAndSecond', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByHourAndSecond', + new RRule({ + freq: RRule.MINUTELY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1997, 9, 2, 18, 1, 6) + datetime(1997, 9, 2, 18, 1, 6), ] ) - testRecurring('testMinutelyByMinuteAndSecond', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByMinuteAndSecond', + new RRule({ + freq: RRule.MINUTELY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testMinutelyByHourAndMinuteAndSecond', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.MINUTELY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testMinutelyBySetPos', - new RRule({freq: RRule.MINUTELY, + testRecurring( + 'testMinutelyBySetPos', + new RRule({ + freq: RRule.MINUTELY, count: 3, bysecond: [15, 30, 45], bysetpos: [3, -3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 15), datetime(1997, 9, 2, 9, 0, 45), - datetime(1997, 9, 2, 9, 1, 15) + datetime(1997, 9, 2, 9, 1, 15), ] ) - testRecurring('testSecondly', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondly', + new RRule({ + freq: RRule.SECONDLY, count: 3, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 0), datetime(1997, 9, 2, 9, 0, 1), - datetime(1997, 9, 2, 9, 0, 2) + datetime(1997, 9, 2, 9, 0, 2), ] ) - testRecurring('testSecondlyInterval', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyInterval', + new RRule({ + freq: RRule.SECONDLY, count: 3, interval: 2, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 0), datetime(1997, 9, 2, 9, 0, 2), - datetime(1997, 9, 2, 9, 0, 4) + datetime(1997, 9, 2, 9, 0, 4), ] ) - testRecurring('testSecondlyIntervalLarge', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyIntervalLarge', + new RRule({ + freq: RRule.SECONDLY, count: 3, interval: 90061, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 0), datetime(1997, 9, 3, 10, 1, 1), - datetime(1997, 9, 4, 11, 2, 2) + datetime(1997, 9, 4, 11, 2, 2), ] ) - testRecurring('testSecondlyByMonth', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonth', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonth: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0, 0), datetime(1998, 1, 1, 0, 0, 1), - datetime(1998, 1, 1, 0, 0, 2) + datetime(1998, 1, 1, 0, 0, 2), ] ) - testRecurring('testSecondlyByMonthDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonthday: [1, 3], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 3, 0, 0, 0), datetime(1997, 9, 3, 0, 0, 1), - datetime(1997, 9, 3, 0, 0, 2) + datetime(1997, 9, 3, 0, 0, 2), ] ) - testRecurring('testSecondlyByMonthAndMonthDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthAndMonthDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonth: [1, 3], bymonthday: [5, 7], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 5, 0, 0, 0), datetime(1998, 1, 5, 0, 0, 1), - datetime(1998, 1, 5, 0, 0, 2) + datetime(1998, 1, 5, 0, 0, 2), ] ) - testRecurring('testSecondlyByWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 0), datetime(1997, 9, 2, 9, 0, 1), - datetime(1997, 9, 2, 9, 0, 2) + datetime(1997, 9, 2, 9, 0, 2), ] ) - testRecurring('testSecondlyByNWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByNWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 0), datetime(1997, 9, 2, 9, 0, 1), - datetime(1997, 9, 2, 9, 0, 2) + datetime(1997, 9, 2, 9, 0, 2), ] ) - testRecurring('testSecondlyByMonthAndWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthAndWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0, 0), datetime(1998, 1, 1, 0, 0, 1), - datetime(1998, 1, 1, 0, 0, 2) + datetime(1998, 1, 1, 0, 0, 2), ] ) - testRecurring('testSecondlyByMonthAndNWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthAndNWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonth: [1, 3], byweekday: [RRule.TU.nth(1), RRule.TH.nth(-1)], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0, 0), datetime(1998, 1, 1, 0, 0, 1), - datetime(1998, 1, 1, 0, 0, 2) + datetime(1998, 1, 1, 0, 0, 2), ] ) - testRecurring('testSecondlyByMonthDayAndWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthDayAndWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0, 0), datetime(1998, 1, 1, 0, 0, 1), - datetime(1998, 1, 1, 0, 0, 2) + datetime(1998, 1, 1, 0, 0, 2), ] ) - testRecurring('testSecondlyByMonthAndMonthDayAndWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthAndMonthDayAndWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, bymonth: [1, 3], bymonthday: [1, 3], byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 1, 1, 0, 0, 0), datetime(1998, 1, 1, 0, 0, 1), - datetime(1998, 1, 1, 0, 0, 2) + datetime(1998, 1, 1, 0, 0, 2), ] ) - testRecurring('testSecondlyByYearDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByYearDay', + new RRule({ + freq: RRule.SECONDLY, count: 4, byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 0, 0, 0), datetime(1997, 12, 31, 0, 0, 1), datetime(1997, 12, 31, 0, 0, 2), - datetime(1997, 12, 31, 0, 0, 3) + datetime(1997, 12, 31, 0, 0, 3), ] ) - testRecurring('testSecondlyByYearDayNeg', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByYearDayNeg', + new RRule({ + freq: RRule.SECONDLY, count: 4, byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 31, 0, 0, 0), datetime(1997, 12, 31, 0, 0, 1), datetime(1997, 12, 31, 0, 0, 2), - datetime(1997, 12, 31, 0, 0, 3) + datetime(1997, 12, 31, 0, 0, 3), ] ) - testRecurring('testSecondlyByMonthAndYearDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthAndYearDay', + new RRule({ + freq: RRule.SECONDLY, count: 4, bymonth: [4, 7], byyearday: [1, 100, 200, 365], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 0, 0, 0), datetime(1998, 4, 10, 0, 0, 1), datetime(1998, 4, 10, 0, 0, 2), - datetime(1998, 4, 10, 0, 0, 3) + datetime(1998, 4, 10, 0, 0, 3), ] ) - testRecurring('testSecondlyByMonthAndYearDayNeg', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMonthAndYearDayNeg', + new RRule({ + freq: RRule.SECONDLY, count: 4, bymonth: [4, 7], byyearday: [-365, -266, -166, -1], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 10, 0, 0, 0), datetime(1998, 4, 10, 0, 0, 1), datetime(1998, 4, 10, 0, 0, 2), - datetime(1998, 4, 10, 0, 0, 3) + datetime(1998, 4, 10, 0, 0, 3), ] ) - testRecurring('testSecondlyByWeekNo', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByWeekNo', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekno: 20, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 5, 11, 0, 0, 0), datetime(1998, 5, 11, 0, 0, 1), - datetime(1998, 5, 11, 0, 0, 2) + datetime(1998, 5, 11, 0, 0, 2), ] ) - testRecurring('testSecondlyByWeekNoAndWeekDay', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByWeekNoAndWeekDay', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekno: 1, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 29, 0, 0, 0), datetime(1997, 12, 29, 0, 0, 1), - datetime(1997, 12, 29, 0, 0, 2) + datetime(1997, 12, 29, 0, 0, 2), ] ) - testRecurring('testSecondlyByWeekNoAndWeekDayLarge', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByWeekNoAndWeekDayLarge', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekno: 52, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 0, 0, 0), datetime(1997, 12, 28, 0, 0, 1), - datetime(1997, 12, 28, 0, 0, 2) + datetime(1997, 12, 28, 0, 0, 2), ] ) - testRecurring('testSecondlyByWeekNoAndWeekDayLast', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByWeekNoAndWeekDayLast', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekno: -1, byweekday: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 12, 28, 0, 0, 0), datetime(1997, 12, 28, 0, 0, 1), - datetime(1997, 12, 28, 0, 0, 2) + datetime(1997, 12, 28, 0, 0, 2), ] ) - testRecurring('testSecondlyByWeekNoAndWeekDay53', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByWeekNoAndWeekDay53', + new RRule({ + freq: RRule.SECONDLY, count: 3, byweekno: 53, byweekday: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 12, 28, 0, 0, 0), datetime(1998, 12, 28, 0, 0, 1), - datetime(1998, 12, 28, 0, 0, 2) + datetime(1998, 12, 28, 0, 0, 2), ] ) - testRecurring.skip('testSecondlyByEaster', - new RRule({freq: RRule.SECONDLY, + testRecurring.skip( + 'testSecondlyByEaster', + new RRule({ + freq: RRule.SECONDLY, count: 3, byeaster: 0, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 12, 0, 0, 0), datetime(1998, 4, 12, 0, 0, 1), - datetime(1998, 4, 12, 0, 0, 2) + datetime(1998, 4, 12, 0, 0, 2), ] ) - testRecurring.skip('testSecondlyByEasterPos', - new RRule({freq: RRule.SECONDLY, + testRecurring.skip( + 'testSecondlyByEasterPos', + new RRule({ + freq: RRule.SECONDLY, count: 3, byeaster: 1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 13, 0, 0, 0), datetime(1998, 4, 13, 0, 0, 1), - datetime(1998, 4, 13, 0, 0, 2) + datetime(1998, 4, 13, 0, 0, 2), ] ) - testRecurring.skip('testSecondlyByEasterNeg', - new RRule({freq: RRule.SECONDLY, + testRecurring.skip( + 'testSecondlyByEasterNeg', + new RRule({ + freq: RRule.SECONDLY, count: 3, byeaster: -1, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1998, 4, 11, 0, 0, 0), datetime(1998, 4, 11, 0, 0, 1), - datetime(1998, 4, 11, 0, 0, 2) + datetime(1998, 4, 11, 0, 0, 2), ] ) - testRecurring('testSecondlyByHour', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByHour', + new RRule({ + freq: RRule.SECONDLY, count: 3, byhour: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 0), datetime(1997, 9, 2, 18, 0, 1), - datetime(1997, 9, 2, 18, 0, 2) + datetime(1997, 9, 2, 18, 0, 2), ] ) - testRecurring('testSecondlyByMinute', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMinute', + new RRule({ + freq: RRule.SECONDLY, count: 3, byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 0), datetime(1997, 9, 2, 9, 6, 1), - datetime(1997, 9, 2, 9, 6, 2) + datetime(1997, 9, 2, 9, 6, 2), ] ) - testRecurring('testSecondlyBySecond', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyBySecond', + new RRule({ + freq: RRule.SECONDLY, count: 3, bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0, 6), datetime(1997, 9, 2, 9, 0, 18), - datetime(1997, 9, 2, 9, 1, 6) + datetime(1997, 9, 2, 9, 1, 6), ] ) - testRecurring('testSecondlyByHourAndMinute', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByHourAndMinute', + new RRule({ + freq: RRule.SECONDLY, count: 3, byhour: [6, 18], byminute: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 0), datetime(1997, 9, 2, 18, 6, 1), - datetime(1997, 9, 2, 18, 6, 2) + datetime(1997, 9, 2, 18, 6, 2), ] ) - testRecurring('testSecondlyByHourAndSecond', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByHourAndSecond', + new RRule({ + freq: RRule.SECONDLY, count: 3, byhour: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 0, 6), datetime(1997, 9, 2, 18, 0, 18), - datetime(1997, 9, 2, 18, 1, 6) + datetime(1997, 9, 2, 18, 1, 6), ] ) - testRecurring('testSecondlyByMinuteAndSecond', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByMinuteAndSecond', + new RRule({ + freq: RRule.SECONDLY, count: 3, byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 6, 6), datetime(1997, 9, 2, 9, 6, 18), - datetime(1997, 9, 2, 9, 18, 6) + datetime(1997, 9, 2, 9, 18, 6), ] ) - testRecurring('testSecondlyByHourAndMinuteAndSecond', - new RRule({freq: RRule.SECONDLY, + testRecurring( + 'testSecondlyByHourAndMinuteAndSecond', + new RRule({ + freq: RRule.SECONDLY, count: 3, byhour: [6, 18], byminute: [6, 18], bysecond: [6, 18], - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 18, 6, 6), datetime(1997, 9, 2, 18, 6, 18), - datetime(1997, 9, 2, 18, 18, 6) + datetime(1997, 9, 2, 18, 18, 6), ] ) - testRecurring('testUntilNotMatching', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testUntilNotMatching', + new RRule({ + freq: RRule.DAILY, count: 3, dtstart: parse('19970902T090000'), - until: parse('19970905T080000') + until: parse('19970905T080000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 9, 0), - datetime(1997, 9, 4, 9, 0) + datetime(1997, 9, 4, 9, 0), ] ) - testRecurring('testUntilMatching', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testUntilMatching', + new RRule({ + freq: RRule.DAILY, count: 3, dtstart: parse('19970902T090000'), - until: parse('19970904T090000') + until: parse('19970904T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 9, 0), - datetime(1997, 9, 4, 9, 0) + datetime(1997, 9, 4, 9, 0), ] ) - testRecurring('testUntilSingle', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testUntilSingle', + new RRule({ + freq: RRule.DAILY, count: 3, dtstart: parse('19970902T090000'), - until: parse('19970902T090000') + until: parse('19970902T090000'), }), - [ - datetime(1997, 9, 2, 9, 0) - ] + [datetime(1997, 9, 2, 9, 0)] ) - testRecurring('testUntilEmpty', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testUntilEmpty', + new RRule({ + freq: RRule.DAILY, count: 3, dtstart: parse('19970902T090000'), - until: parse('19970901T090000') + until: parse('19970901T090000'), }), [] ) - testRecurring('testUntilWithDate', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testUntilWithDate', + new RRule({ + freq: RRule.DAILY, count: 3, dtstart: parse('19970902T090000'), - until: datetime(1997, 9, 5) + until: datetime(1997, 9, 5), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 9, 0), - datetime(1997, 9, 4, 9, 0) + datetime(1997, 9, 4, 9, 0), ] ) - testRecurring('testWkStIntervalMO', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWkStIntervalMO', + new RRule({ + freq: RRule.WEEKLY, count: 3, interval: 2, byweekday: [RRule.TU, RRule.SU], wkst: RRule.MO, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 7, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testWkStIntervalSU', - new RRule({freq: RRule.WEEKLY, + testRecurring( + 'testWkStIntervalSU', + new RRule({ + freq: RRule.WEEKLY, count: 3, interval: 2, byweekday: [RRule.TU, RRule.SU], wkst: RRule.SU, - dtstart: parse('19970902T090000') + dtstart: parse('19970902T090000'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 14, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testDTStartIsDate', - new RRule({freq: RRule.DAILY, - count: 3, - dtstart: datetime(1997, 9, 2) - }), + testRecurring( + 'testDTStartIsDate', + new RRule({ freq: RRule.DAILY, count: 3, dtstart: datetime(1997, 9, 2) }), [ datetime(1997, 9, 2, 0, 0), datetime(1997, 9, 3, 0, 0), - datetime(1997, 9, 4, 0, 0) + datetime(1997, 9, 4, 0, 0), ] ) - testRecurring('testDTStartWithMicroseconds', - new RRule({freq: RRule.DAILY, + testRecurring( + 'testDTStartWithMicroseconds', + new RRule({ + freq: RRule.DAILY, count: 3, - dtstart: parse('19970902T090000.5') + dtstart: parse('19970902T090000.5'), }), [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 3, 9, 0), - datetime(1997, 9, 4, 9, 0) + datetime(1997, 9, 4, 9, 0), ] ) - testRecurring('testMaxYear', - new RRule({freq: RRule.YEARLY, + testRecurring( + 'testMaxYear', + new RRule({ + freq: RRule.YEARLY, count: 3, bymonth: 2, bymonthday: 31, - dtstart: parse('99970902T090000') + dtstart: parse('99970902T090000'), }), [] ) - testRecurring('testSubsecondStartYearly', + testRecurring( + 'testSubsecondStartYearly', new RRule({ freq: RRule.YEARLY, count: 1, - dtstart: new Date(1420063200001) + dtstart: new Date(1420063200001), }), - [ - new Date(1420063200001) - ] + [new Date(1420063200001)] ) - testRecurring('testSubsecondStartMonthlyByMonthDay', + testRecurring( + 'testSubsecondStartMonthlyByMonthDay', new RRule({ freq: RRule.MONTHLY, count: 1, bysetpos: [-1, 1], - dtstart: new Date(1356991200001) + dtstart: new Date(1356991200001), }), - [ - new Date(1356991200001) - ] + [new Date(1356991200001)] ) it('testAfterBefore', function () { - 'YEARLY,MONTHLY,DAILY,HOURLY,MINUTELY,SECONDLY'.split(',').forEach(function (freqStr: keyof typeof Frequency) { + ;( + ['YEARLY', 'MONTHLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] as const + ).forEach(function (freqStr: keyof typeof Frequency) { const date = new Date(1356991200001) const rr = new RRule({ freq: RRule[freqStr], - dtstart: date + dtstart: date, }) - expect(date.getTime()).equals(rr.options.dtstart.getTime(), - 'the supplied dtstart differs from RRule.options.dtstart') - let res: Date = rr.before(rr.after(rr.options.dtstart)) + expect(date.getTime()).toBe(rr.options.dtstart.getTime()) + const res: Date = rr.before(rr.after(rr.options.dtstart)) let resTimestamp: number if (res != null) resTimestamp = res.getTime() - expect(resTimestamp).equals(rr.options.dtstart.getTime(), - 'after dtstart , followed by before does not return dtstart') + expect(resTimestamp).toBe(rr.options.dtstart.getTime()) }) }) it('testConvertAndBack', function () { - [6, RRule.SU].forEach(function (wkst) { + ;[6, RRule.SU].forEach(function (wkst) { const rr = new RRule({ - dtstart: new Date(Date.UTC(2017, 9, 17, 0, 30, 0, 0)), - until: new Date(Date.UTC(2017, 11, 22, 1, 30, 0, 0)), + dtstart: datetime(2017, 10, 17, 0, 30, 0), + until: datetime(2017, 12, 22, 1, 30, 0), freq: RRule.MONTHLY, interval: 1, bysetpos: 17, - byweekday: [RRule.SU, RRule.MO, RRule.TU, RRule.WE, RRule.TH, RRule.FR, RRule.SA], + byweekday: [ + RRule.SU, + RRule.MO, + RRule.TU, + RRule.WE, + RRule.TH, + RRule.FR, + RRule.SA, + ], wkst: wkst, byhour: 11, byminute: 0, - bysecond: 0 + bysecond: 0, }) const rrstr = rr.toString() - expect(rrstr).equals('DTSTART:20171017T003000Z\nRRULE:UNTIL=20171222T013000Z;FREQ=MONTHLY;INTERVAL=1;BYSETPOS=17;BYDAY=SU,MO,TU,WE,TH,FR,SA;WKST=SU;BYHOUR=11;BYMINUTE=0;BYSECOND=0') + expect(rrstr).toBe( + 'DTSTART:20171017T003000Z\nRRULE:UNTIL=20171222T013000Z;FREQ=MONTHLY;INTERVAL=1;BYSETPOS=17;BYDAY=SU,MO,TU,WE,TH,FR,SA;WKST=SU;BYHOUR=11;BYMINUTE=0;BYSECOND=0' + ) const newrr = RRule.fromString(rrstr) - expect(rrstr).equals(newrr.toString()) + expect(rrstr).toBe(newrr.toString()) }) }) it('testByHourValues', function () { - [ - ['DTSTART:20171101T010000Z\nRRULE:UNTIL=20171214T013000Z;FREQ=DAILY;INTERVAL=2;WKST=MO;BYHOUR=11,12;BYMINUTE=30;BYSECOND=0', 'every 2 days at 11 and 12 until December 13, 2017'], - ['DTSTART:20171101T010000Z\nRRULE:UNTIL=20171214T013000Z;FREQ=DAILY;INTERVAL=2;WKST=MO;BYHOUR=11;BYMINUTE=30;BYSECOND=0', 'every 2 days at 11 until December 13, 2017'] + ;[ + [ + 'DTSTART:20171101T010000Z\nRRULE:UNTIL=20171214T013000Z;FREQ=DAILY;INTERVAL=2;WKST=MO;BYHOUR=11,12;BYMINUTE=30;BYSECOND=0', + 'every 2 days at 11 and 12 until December 13, 2017', + ], + [ + 'DTSTART:20171101T010000Z\nRRULE:UNTIL=20171214T013000Z;FREQ=DAILY;INTERVAL=2;WKST=MO;BYHOUR=11;BYMINUTE=30;BYSECOND=0', + 'every 2 days at 11 until December 13, 2017', + ], ].forEach(function (pair) { const rule = pair[0] const rr = RRule.fromString(rule) - // tslint:disable-next-line:no-unused-expression - expect(rr.toText()).to.be.ok + expect(rr.toText()).toBeTruthy() // assert.equal(rr.toText(), pair[1]) -- can't test this because it reports in local time which varies by machine }) }) it('calculates daily recurrences correctly across DST boundaries', () => { - const rrule = RRule.fromString('DTSTART=20181101T110000Z;UNTIL=20181106T110000Z;FREQ=DAILY') - expect(rrule.all()).to.deep.equal([ + const rrule = RRule.fromString( + 'DTSTART=20181101T110000Z;UNTIL=20181106T110000Z;FREQ=DAILY' + ) + expect(rrule.all()).toEqual([ new Date('2018-11-01T11:00:00.000Z'), new Date('2018-11-02T11:00:00.000Z'), new Date('2018-11-03T11:00:00.000Z'), new Date('2018-11-04T11:00:00.000Z'), new Date('2018-11-05T11:00:00.000Z'), - new Date('2018-11-06T11:00:00.000Z') + new Date('2018-11-06T11:00:00.000Z'), ]) }) it('calculates weekly recurrences correctly across DST boundaries', () => { - const rrule = RRule.fromString('DTSTART=20181031T180000Z\nRRULE:FREQ=WEEKLY;UNTIL=20181115T050000Z') - expect(rrule.all()).to.deep.equal([ + const rrule = RRule.fromString( + 'DTSTART=20181031T180000Z\nRRULE:FREQ=WEEKLY;UNTIL=20181115T050000Z' + ) + expect(rrule.all()).toEqual([ new Date('2018-10-31T18:00:00.000Z'), new Date('2018-11-07T18:00:00.000Z'), - new Date('2018-11-14T18:00:00.000Z') + new Date('2018-11-14T18:00:00.000Z'), ]) }) it('calculates byweekday recurrences correctly across DST boundaries', () => { - let rule = new RRule({ + const rule = new RRule({ freq: RRule.WEEKLY, - dtstart: new Date(Date.UTC(2018, 9, 0, 0, 0, 0)), + dtstart: datetime(2018, 10, 0, 0, 0, 0), interval: 1, byweekday: [RRule.SU, RRule.WE], - until: new Date(Date.UTC(2018, 9, 9, 0, 0, 0)) + until: datetime(2018, 10, 9, 0, 0, 0), }) - expect(rule.all()).to.deep.equal([ + expect(rule.all()).toEqual([ new Date('2018-09-30T00:00:00.000Z'), new Date('2018-10-03T00:00:00.000Z'), - new Date('2018-10-07T00:00:00.000Z') + new Date('2018-10-07T00:00:00.000Z'), ]) }) @@ -3580,10 +4092,10 @@ describe('RRule', function () { freq: RRule.WEEKLY, interval: 1, dtstart: new Date(startEvent), - until: new Date(endSearch) + until: new Date(endSearch), }) - expect(rrule.all()).to.deep.equal([ + expect(rrule.all()).toEqual([ new Date('2018-08-10T10:00:00.000Z'), new Date('2018-08-17T10:00:00.000Z'), new Date('2018-08-24T10:00:00.000Z'), @@ -3600,7 +4112,7 @@ describe('RRule', function () { new Date('2018-11-09T10:00:00.000Z'), new Date('2018-11-16T10:00:00.000Z'), new Date('2018-11-23T10:00:00.000Z'), - new Date('2018-11-30T10:00:00.000Z') + new Date('2018-11-30T10:00:00.000Z'), ]) }) @@ -3612,104 +4124,94 @@ describe('RRule', function () { freq: RRule.MONTHLY, interval: 1, dtstart: start, - until: end + until: end, }) - expect(rrule.all()).to.deep.equal([ + expect(rrule.all()).toEqual([ new Date('2018-08-06T05:00:00.000Z'), new Date('2018-09-06T05:00:00.000Z'), - new Date('2018-10-06T05:00:00.000Z') + new Date('2018-10-06T05:00:00.000Z'), ]) }) it('generates around dst (#249)', () => { - const ruleString = 'DTSTART:20181101T120000Z\nRRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;COUNT=4;WKST=SU'; - const rrule = RRule.fromString(ruleString); + const ruleString = + 'DTSTART:20181101T120000Z\nRRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR;COUNT=4;WKST=SU' + const rrule = RRule.fromString(ruleString) - expect(rrule.all()).to.deep.equal([ + expect(rrule.all()).toEqual([ new Date('2018-11-02T12:00:00.000Z'), new Date('2018-11-05T12:00:00.000Z'), new Date('2018-11-07T12:00:00.000Z'), - new Date('2018-11-09T12:00:00.000Z') + new Date('2018-11-09T12:00:00.000Z'), ]) }) it('handles 3-digit years properly (#202)', () => { const rrule = new RRule({ count: 1, - dtstart: new Date(Date.UTC(990, 0, 1, 0, 0, 0)) + dtstart: datetime(990, 1, 1, 0, 0, 0), }) const ruleString = rrule.toString() const rrule2 = RRule.fromString(ruleString) - expect(ruleString).to.equal('DTSTART:09900101T000000Z\nRRULE:COUNT=1') - expect(rrule2.count()).to.equal(1) - expect(rrule2.all()).to.deep.equal([ - new Date(Date.UTC(990, 0, 1, 0, 0, 0)) - ]) + expect(ruleString).toBe('DTSTART:09900101T000000Z\nRRULE:COUNT=1') + expect(rrule2.count()).toBe(1) + expect(rrule2.all()).toEqual([datetime(990, 1, 1, 0, 0, 0)]) }) - describe('time zones', () => { + describe('time zones, when recurrence is in dst', () => { const targetZone = 'America/Los_Angeles' - const startDate = DateTime.utc(2013, 8, 6, 11, 0, 0) - const dtstart = startDate.toJSDate() + const startDate = datetime(2013, 8, 6, 11, 0, 0) + const dtstart = startDate - it('generates correct recurrences when recurrence is in dst and current time is standard time', () => { - const currentLocalDate = DateTime.local(2013, 2, 6, 11, 0, 0) - setMockDate(currentLocalDate.toJSDate()) + it('generates correct recurrences when current time is standard time', () => { + const currentLocalDate = new Date(2013, 1, 6, 11, 0, 0) + setMockDate(currentLocalDate) const rule = new RRule({ dtstart, count: 1, - tzid: targetZone + tzid: targetZone, }) const recurrence = rule.all()[0] const expected = expectedDate(startDate, currentLocalDate, targetZone) - expect(recurrence) - .to.deep.equal( - expected - ) + expect(recurrence).toEqual(expected) resetMockDate() }) - it('generates correct recurrences when recurrence is in dst and current time is dst', () => { - const currentLocalDate = DateTime.local(2013, 8, 6, 11, 0, 0) - setMockDate(currentLocalDate.toJSDate()) + it('generates correct recurrences when current time is dst', () => { + const currentLocalDate = new Date(2013, 7, 6, 11, 0, 0) + setMockDate(currentLocalDate) const rule = new RRule({ dtstart, count: 1, - tzid: targetZone + tzid: targetZone, }) const recurrence = rule.all()[0] const expected = expectedDate(startDate, currentLocalDate, targetZone) - expect(recurrence) - .to.deep.equal( - expected - ) + expect(recurrence).toEqual(expected) resetMockDate() }) - it('generates correct recurrences when recurrence is in dst and current time is standard time', () => { - const currentLocalDate = DateTime.local(2013, 2, 6, 11, 0, 0) - setMockDate(currentLocalDate.toJSDate()) + it('generates correct recurrences using after and current time is standard time', () => { + const currentLocalDate = new Date(2013, 1, 6, 11, 0, 0) + setMockDate(currentLocalDate) const rule = new RRule({ dtstart, count: 1, - tzid: targetZone + tzid: targetZone, }) const recurrence = rule.after(new Date(0)) const expected = expectedDate(startDate, currentLocalDate, targetZone) - expect(recurrence) - .to.deep.equal( - expected - ) + expect(recurrence).toEqual(expected) resetMockDate() }) @@ -3717,19 +4219,31 @@ describe('RRule', function () { it('throws an error when dtstart is invalid', () => { const invalidDate = new Date(undefined) - const validDate = new Date(Date.UTC(2017, 0, 1)) - expect(() => new RRule({ dtstart: invalidDate })).to.throw('Invalid options: dtstart') - expect(() => new RRule({ dtstart: validDate, until: invalidDate })).to.throw('Invalid options: until') + const validDate = datetime(2017, 1, 1) + expect(() => new RRule({ dtstart: invalidDate })).toThrow( + 'Invalid options: dtstart' + ) + expect(() => new RRule({ dtstart: validDate, until: invalidDate })).toThrow( + 'Invalid options: until' + ) const rule = new RRule({ - dtstart: new Date(Date.UTC(2017, 0, 1)), + dtstart: datetime(2017, 1, 1), freq: Frequency.DAILY, - interval: 1 + interval: 1, }) - expect(() => rule.after(invalidDate)).to.throw('Invalid date passed in to RRule.after') - expect(() => rule.before(invalidDate)).to.throw('Invalid date passed in to RRule.before') - expect(() => rule.between(invalidDate, validDate)).to.throw('Invalid date passed in to RRule.between') - expect(() => rule.between(validDate, invalidDate)).to.throw('Invalid date passed in to RRule.between') + expect(() => rule.after(invalidDate)).toThrow( + 'Invalid date passed in to RRule.after' + ) + expect(() => rule.before(invalidDate)).toThrow( + 'Invalid date passed in to RRule.before' + ) + expect(() => rule.between(invalidDate, validDate)).toThrow( + 'Invalid date passed in to RRule.between' + ) + expect(() => rule.between(validDate, invalidDate)).toThrow( + 'Invalid date passed in to RRule.between' + ) }) }) diff --git a/test/rruleset.test.ts b/test/rruleset.test.ts index 43c887f2..1534d9b7 100644 --- a/test/rruleset.test.ts +++ b/test/rruleset.test.ts @@ -1,53 +1,75 @@ -import { parse, datetime, testRecurring, expectedDate } from './lib/utils' +import { + parse, + datetime, + testRecurring, + expectedDate, + TEST_CTX, +} from './lib/utils' import { RRule, RRuleSet, rrulestr, Frequency } from '../src' -import { DateTime } from 'luxon' -import { expect } from 'chai' import { set as setMockDate, reset as resetMockDate } from 'mockdate' describe('RRuleSet', function () { - // Enable additional toString() / fromString() tests - // for each testRecurring(). - // this.ctx.ALSO_TEST_STRING_FUNCTIONS = false - - // Thorough after()/before()/between() tests. - // NOTE: can take a longer time. - this.ctx.ALSO_TEST_BEFORE_AFTER_BETWEEN = true + beforeAll(() => { + // Enable additional toString() / fromString() tests + // for each testRecurring(). + TEST_CTX.ALSO_TESTSTRING_FUNCTIONS = false + + // Enable additional toText() / fromText() tests + // for each testRecurring(). + // Many of the tests fail because the conversion is only approximate, + // but it gives an idea about how well or bad it converts. + TEST_CTX.ALSO_TESTNLP_FUNCTIONS = false + + // Thorough after()/before()/between() tests. + // NOTE: can take a longer time. + TEST_CTX.ALSO_TESTBEFORE_AFTER_BETWEEN = false + + TEST_CTX.ALSO_TESTSUBSECOND_PRECISION = false + }) - testRecurring('testSet', + testRecurring( + 'testSet', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - byweekday: RRule.TU, - dtstart: parse('19970902T090000') - })) - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 1, - byweekday: RRule.TH, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + byweekday: RRule.TU, + dtstart: parse('19970902T090000'), + }) + ) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 1, + byweekday: RRule.TH, + dtstart: parse('19970902T090000'), + }) + ) return set }, [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testSetDate', + testRecurring( + 'testSetDate', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 1, - byweekday: RRule.TU, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 1, + byweekday: RRule.TU, + dtstart: parse('19970902T090000'), + }) + ) set.rdate(datetime(1997, 9, 4, 9)) set.rdate(datetime(1997, 9, 9, 9)) return set @@ -55,45 +77,53 @@ describe('RRuleSet', function () { [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testSetExRule', + testRecurring( + 'testSetExRule', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 6, - byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') - })) - set.exrule(new RRule({ - freq: RRule.YEARLY, - count: 3, - byweekday: RRule.TH, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 6, + byweekday: [RRule.TU, RRule.TH], + dtstart: parse('19970902T090000'), + }) + ) + set.exrule( + new RRule({ + freq: RRule.YEARLY, + count: 3, + byweekday: RRule.TH, + dtstart: parse('19970902T090000'), + }) + ) return set }, [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 9, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testSetExDate', + testRecurring( + 'testSetExDate', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 6, - byweekday: [RRule.TU, RRule.TH], - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 6, + byweekday: [RRule.TU, RRule.TH], + dtstart: parse('19970902T090000'), + }) + ) set.exdate(datetime(1997, 9, 4, 9)) set.exdate(datetime(1997, 9, 11, 9)) set.exdate(datetime(1997, 9, 18, 9)) @@ -102,20 +132,23 @@ describe('RRuleSet', function () { [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 9, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testSetExDateRevOrder', + testRecurring( + 'testSetExDateRevOrder', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.MONTHLY, - count: 5, - bymonthday: 10, - dtstart: parse('20040101T090000') - })) + set.rrule( + new RRule({ + freq: RRule.MONTHLY, + count: 5, + bymonthday: 10, + dtstart: parse('20040101T090000'), + }) + ) set.exdate(datetime(2004, 4, 10, 9, 0)) set.exdate(datetime(2004, 2, 10, 9, 0)) return set @@ -123,11 +156,12 @@ describe('RRuleSet', function () { [ datetime(2004, 1, 10, 9, 0), datetime(2004, 3, 10, 9, 0), - datetime(2004, 5, 10, 9, 0) + datetime(2004, 5, 10, 9, 0), ] ) - testRecurring('testSetDateAndExDate', + testRecurring( + 'testSetDateAndExDate', function () { const set = new RRuleSet() @@ -145,11 +179,12 @@ describe('RRuleSet', function () { [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 9, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testSetDateAndExRule', + testRecurring( + 'testSetDateAndExRule', function () { const set = new RRuleSet() @@ -159,287 +194,314 @@ describe('RRuleSet', function () { set.rdate(datetime(1997, 9, 11, 9)) set.rdate(datetime(1997, 9, 16, 9)) set.rdate(datetime(1997, 9, 18, 9)) - set.exrule(new RRule({ - freq: RRule.YEARLY, - count: 3, - byweekday: RRule.TH, - dtstart: parse('19970902T090000') - })) + set.exrule( + new RRule({ + freq: RRule.YEARLY, + count: 3, + byweekday: RRule.TH, + dtstart: parse('19970902T090000'), + }) + ) return set }, [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 9, 9, 0), - datetime(1997, 9, 16, 9, 0) + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testSetCachePre', + testRecurring( + 'testSetCachePre', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - byweekday: RRule.TU, - dtstart: parse('19970902T090000') - })) - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 1, - byweekday: RRule.TH, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + byweekday: RRule.TU, + dtstart: parse('19970902T090000'), + }) + ) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 1, + byweekday: RRule.TH, + dtstart: parse('19970902T090000'), + }) + ) return set }, [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testSetCachePost', + testRecurring( + 'testSetCachePost', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - byweekday: RRule.TU, - dtstart: parse('19970902T090000') - })) - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 1, - byweekday: RRule.TH, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + byweekday: RRule.TU, + dtstart: parse('19970902T090000'), + }) + ) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 1, + byweekday: RRule.TH, + dtstart: parse('19970902T090000'), + }) + ) set.all() return set }, [ datetime(1997, 9, 2, 9, 0), datetime(1997, 9, 4, 9, 0), - datetime(1997, 9, 9, 9, 0) + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testSetInfiniteAll', + testRecurring( + 'testSetInfiniteAll', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - dtstart: parse('19970902T090000') - })) - set.exrule(new RRule({ - freq: RRule.YEARLY, - count: 10, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + dtstart: parse('19970902T090000'), + }) + ) + set.exrule( + new RRule({ + freq: RRule.YEARLY, + count: 10, + dtstart: parse('19970902T090000'), + }) + ) return { rrule: set, method: 'all', args: [ - function (_: any, count: number) { + function (_: unknown, count: number) { return count < 3 - } - ] + }, + ], } }, [ datetime(2007, 9, 2, 9, 0), datetime(2008, 9, 2, 9, 0), - datetime(2009, 9, 2, 9, 0) + datetime(2009, 9, 2, 9, 0), ] ) - testRecurring('testSetInfiniteBetween', + testRecurring( + 'testSetInfiniteBetween', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - dtstart: parse('19970902T090000') - })) - set.exrule(new RRule({ - freq: RRule.YEARLY, - count: 10, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + dtstart: parse('19970902T090000'), + }) + ) + set.exrule( + new RRule({ + freq: RRule.YEARLY, + count: 10, + dtstart: parse('19970902T090000'), + }) + ) return { rrule: set, method: 'between', - args: [ - datetime(2000, 9, 2, 9, 0), - datetime(2010, 9, 2, 9, 0) - ] + args: [datetime(2000, 9, 2, 9, 0), datetime(2010, 9, 2, 9, 0)], } }, [ datetime(2007, 9, 2, 9, 0), datetime(2008, 9, 2, 9, 0), - datetime(2009, 9, 2, 9, 0) + datetime(2009, 9, 2, 9, 0), ] ) - testRecurring('testSetInfiniteBefore', + testRecurring( + 'testSetInfiniteBefore', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - dtstart: parse('19970902T090000') - })) - set.exrule(new RRule({ - freq: RRule.YEARLY, - count: 10, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + dtstart: parse('19970902T090000'), + }) + ) + set.exrule( + new RRule({ + freq: RRule.YEARLY, + count: 10, + dtstart: parse('19970902T090000'), + }) + ) return { rrule: set, method: 'before', - args: [ - datetime(2015, 9, 2, 9, 0), - false - ] + args: [datetime(2015, 9, 2, 9, 0), false], } }, - [ - datetime(2014, 9, 2, 9, 0) - ] + [datetime(2014, 9, 2, 9, 0)] ) - testRecurring('testSetInfiniteAfter', + testRecurring( + 'testSetInfiniteAfter', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - dtstart: parse('19970902T090000') - })) - set.exrule(new RRule({ - freq: RRule.YEARLY, - count: 10, - dtstart: parse('19970902T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + dtstart: parse('19970902T090000'), + }) + ) + set.exrule( + new RRule({ + freq: RRule.YEARLY, + count: 10, + dtstart: parse('19970902T090000'), + }) + ) return { rrule: set, method: 'after', - args: [ - datetime(2000, 9, 2, 9, 0), - false - ] + args: [datetime(2000, 9, 2, 9, 0), false], } }, - [ - datetime(2007, 9, 2, 9, 0) - ] + [datetime(2007, 9, 2, 9, 0)] ) - testRecurring('testBefore70', + testRecurring( + 'testBefore70', function () { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - dtstart: parse('19600101T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + dtstart: parse('19600101T090000'), + }) + ) return { rrule: set, - method: 'all' + method: 'all', } }, - [ - datetime(1960, 1, 1, 9, 0), - datetime(1961, 1, 1, 9, 0) - ] + [datetime(1960, 1, 1, 9, 0), datetime(1961, 1, 1, 9, 0)] ) describe('valueOf', () => { it('generates rrule strings correctly', () => { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - dtstart: parse('19600101T090000') - })) + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + dtstart: parse('19600101T090000'), + }) + ) - expect(set.valueOf()).to.deep.equal([ - "DTSTART:19600101T090000Z", - "RRULE:FREQ=YEARLY;COUNT=2" + expect(set.valueOf()).toEqual([ + 'DTSTART:19600101T090000Z', + 'RRULE:FREQ=YEARLY;COUNT=2', ]) }) it('generates multiline rules', () => { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - dtstart: parse('19600101T090000') - })) - - set.rrule(new RRule({ - freq: RRule.WEEKLY, - count: 3, - })) - - expect(set.valueOf()).to.deep.equal([ - "DTSTART:19600101T090000Z", - "RRULE:FREQ=YEARLY;COUNT=2", - "RRULE:FREQ=WEEKLY;COUNT=3" + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + dtstart: parse('19600101T090000'), + }) + ) + + set.rrule( + new RRule({ + freq: RRule.WEEKLY, + count: 3, + }) + ) + + expect(set.valueOf()).toEqual([ + 'DTSTART:19600101T090000Z', + 'RRULE:FREQ=YEARLY;COUNT=2', + 'RRULE:FREQ=WEEKLY;COUNT=3', ]) }) it('generates rules with tzid', () => { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - dtstart: parse('19600101T090000'), - tzid: 'America/New_York' - })) - - set.rrule(new RRule({ - freq: RRule.WEEKLY, - count: 3, - })) - - expect(set.valueOf()).to.deep.equal([ - "DTSTART;TZID=America/New_York:19600101T090000", - "RRULE:FREQ=YEARLY;COUNT=2", - "RRULE:FREQ=WEEKLY;COUNT=3" + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + dtstart: parse('19600101T090000'), + tzid: 'America/New_York', + }) + ) + + set.rrule( + new RRule({ + freq: RRule.WEEKLY, + count: 3, + }) + ) + + expect(set.valueOf()).toEqual([ + 'DTSTART;TZID=America/New_York:19600101T090000', + 'RRULE:FREQ=YEARLY;COUNT=2', + 'RRULE:FREQ=WEEKLY;COUNT=3', ]) }) it('generates a value with RDATE with tzid', () => { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - dtstart: parse('19600101T090000'), - tzid: 'America/New_York' - })) - - set.rdate( - parse('19610201T090000'), + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + dtstart: parse('19600101T090000'), + tzid: 'America/New_York', + }) ) - set.rdate( - parse('19610301T090000'), - ) + set.rdate(parse('19610201T090000')) - expect(set.valueOf()).to.deep.equal([ - "DTSTART;TZID=America/New_York:19600101T090000", - "RRULE:FREQ=YEARLY;COUNT=2", - "RDATE;TZID=America/New_York:19610201T090000,19610301T090000" + set.rdate(parse('19610301T090000')) + + expect(set.valueOf()).toEqual([ + 'DTSTART;TZID=America/New_York:19600101T090000', + 'RRULE:FREQ=YEARLY;COUNT=2', + 'RDATE;TZID=America/New_York:19610201T090000,19610301T090000', ]) }) @@ -448,16 +510,12 @@ describe('RRuleSet', function () { set.tzid('America/New_York') - set.rdate( - parse('19610201T090000'), - ) + set.rdate(parse('19610201T090000')) - set.rdate( - parse('19610301T090000'), - ) + set.rdate(parse('19610301T090000')) - expect(set.toString()).to.deep.equal( - "RDATE;TZID=America/New_York:19610201T090000,19610301T090000" + expect(set.toString()).toEqual( + 'RDATE;TZID=America/New_York:19610201T090000,19610301T090000' ) }) @@ -466,77 +524,85 @@ describe('RRuleSet', function () { set.tzid('UTC') - set.rdate( - parse('19610201T090000'), - ) + set.rdate(parse('19610201T090000')) - set.rdate( - parse('19610301T090000'), - ) + set.rdate(parse('19610301T090000')) - expect(set.toString()).to.deep.equal( - "RDATE:19610201T090000Z,19610301T090000Z" - ) + expect(set.toString()).toEqual('RDATE:19610201T090000Z,19610301T090000Z') }) it('parses RDATE strings without an RRULE', () => { - const set = rrulestr("RDATE;TZID=America/New_York:19610201T090000,19610301T090000") as RRuleSet - expect(set).to.be.instanceof(RRuleSet) - expect(set.tzid()).to.equal('America/New_York') + const set = rrulestr( + 'RDATE;TZID=America/New_York:19610201T090000,19610301T090000' + ) as RRuleSet + expect(set).toBeInstanceOf(RRuleSet) + expect(set.tzid()).toBe('America/New_York') }) it('generates EXDATE with tzid', () => { const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 2, - dtstart: parse('19600101T090000'), - tzid: 'America/New_York' - })) - - set.exdate( - parse('19610201T090000'), + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 2, + dtstart: parse('19600101T090000'), + tzid: 'America/New_York', + }) ) - set.exdate( - parse('19610301T090000'), - ) + set.exdate(parse('19610201T090000')) + + set.exdate(parse('19610301T090000')) - expect(set.valueOf()).to.deep.equal([ - "DTSTART;TZID=America/New_York:19600101T090000", - "RRULE:FREQ=YEARLY;COUNT=2", - "EXDATE;TZID=America/New_York:19610201T090000,19610301T090000" + expect(set.valueOf()).toEqual([ + 'DTSTART;TZID=America/New_York:19600101T090000', + 'RRULE:FREQ=YEARLY;COUNT=2', + 'EXDATE;TZID=America/New_York:19610201T090000,19610301T090000', ]) }) it('generates correcty zoned recurrences when a tzid is present', () => { const targetZone = 'America/New_York' - const currentLocalDate = DateTime.local(2000, 2, 6, 11, 0, 0) - setMockDate(currentLocalDate.toJSDate()) + const currentLocalDate = new Date(2000, 1, 6, 11, 0, 0) + setMockDate(currentLocalDate) const set = new RRuleSet() - set.rrule(new RRule({ - freq: RRule.YEARLY, - count: 4, - dtstart: DateTime.fromISO('20000101T090000').toJSDate(), - tzid: targetZone - })) - - set.exdate( - DateTime.fromISO('20010101T090000').toJSDate(), + set.rrule( + new RRule({ + freq: RRule.YEARLY, + count: 4, + dtstart: datetime(2000, 1, 1, 9, 0, 0), + tzid: targetZone, + }) ) - set.rdate( - DateTime.fromISO('20020301T090000').toJSDate(), - ) - - expect(set.all()).to.deep.equal([ - expectedDate(DateTime.fromISO('20000101T090000'), currentLocalDate, targetZone), - expectedDate(DateTime.fromISO('20020101T090000'), currentLocalDate, targetZone), - expectedDate(DateTime.fromISO('20020301T090000'), currentLocalDate, targetZone), - expectedDate(DateTime.fromISO('20030101T090000'), currentLocalDate, targetZone), + set.exdate(datetime(2001, 1, 1, 9, 0, 0)) + + set.rdate(datetime(2002, 3, 1, 9, 0, 0)) + + expect(set.all()).toEqual([ + expectedDate( + datetime(2000, 1, 1, 9, 0, 0), + currentLocalDate, + targetZone + ), + expectedDate( + datetime(2002, 1, 1, 9, 0, 0), + currentLocalDate, + targetZone + ), + expectedDate( + datetime(2002, 3, 1, 9, 0, 0), + currentLocalDate, + targetZone + ), + expectedDate( + datetime(2003, 1, 1, 9, 0, 0), + currentLocalDate, + targetZone + ), ]) resetMockDate() @@ -545,30 +611,38 @@ describe('RRuleSet', function () { it('permits only an rdate with a timezone', () => { const set = new RRuleSet() set.tzid('America/Los_Angeles') - set.rdate(new Date(Date.UTC(2010, 10, 10, 10, 0, 0))) + set.rdate(datetime(2010, 11, 10, 10, 0, 0)) - expect(set.valueOf()).to.deep.equal(['RDATE;TZID=America/Los_Angeles:20101110T100000']) - expect(set.toString()).to.equal('RDATE;TZID=America/Los_Angeles:20101110T100000') + expect(set.valueOf()).toEqual([ + 'RDATE;TZID=America/Los_Angeles:20101110T100000', + ]) + expect(set.toString()).toBe( + 'RDATE;TZID=America/Los_Angeles:20101110T100000' + ) const set2 = rrulestr(set.toString()) - expect(set2.toString()).to.equal('RDATE;TZID=America/Los_Angeles:20101110T100000') + expect(set2.toString()).toBe( + 'RDATE;TZID=America/Los_Angeles:20101110T100000' + ) }) it('generates correcty zoned recurrences when a tzid is present but no rrule is present', () => { const targetZone = 'America/New_York' - const currentLocalDate = DateTime.local(2000, 2, 6, 11, 0, 0) - setMockDate(currentLocalDate.toJSDate()) + const currentLocalDate = new Date(2000, 1, 6, 11, 0, 0) + setMockDate(currentLocalDate) const set = new RRuleSet() set.tzid(targetZone) - set.rdate( - DateTime.fromISO('20020301T090000').toJSDate(), - ) + set.rdate(new Date(Date.parse('2002-03-01T09:00:00'))) - expect(set.all()).to.deep.equal([ - expectedDate(DateTime.fromISO('20020301T090000'), currentLocalDate, targetZone) + expect(set.all()).toEqual([ + expectedDate( + new Date(Date.parse('2002-03-01T09:00:00')), + currentLocalDate, + targetZone + ), ]) resetMockDate() @@ -576,17 +650,17 @@ describe('RRuleSet', function () { }) describe('with end date', () => { - let cursor: DateTime + let cursor: Date beforeEach(() => { - cursor = DateTime.utc(2017, 12, 25, 16, 0, 0) + cursor = datetime(2017, 12, 25, 16, 0, 0) }) it('updates the ruleset to exclude recurrence date', () => { const legacy = ['RRULE:DTSTART=19990104T110000Z;FREQ=DAILY;INTERVAL=1'] const repeat = ['DTSTART:19990104T110000Z', 'RRULE:FREQ=DAILY;INTERVAL=1'] - const recurrenceDate = DateTime.utc(2017, 8, 21, 16, 0, 0) + const recurrenceDate = datetime(2017, 8, 21, 16, 0, 0) expectRecurrence([repeat, legacy]).toAmendExdate(recurrenceDate, [ 'DTSTART:19990104T110000Z', @@ -600,16 +674,16 @@ describe('RRuleSet', function () { const repeat = ['DTSTART:19990104T110000Z', 'RRULE:FREQ=DAILY;INTERVAL=1'] const exrule = new RRule({ - dtstart: new Date(Date.UTC(1999, 0, 4, 11, 0, 0)), + dtstart: datetime(1999, 1, 4, 11, 0, 0), freq: Frequency.WEEKLY, interval: 2, - count: 1 + count: 1, }) expectRecurrence([repeat, legacy]).toAmendExrule(exrule, [ 'DTSTART:19990104T110000Z', 'RRULE:FREQ=DAILY;INTERVAL=1', - 'EXRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=1' + 'EXRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=1', ]) }) @@ -617,10 +691,12 @@ describe('RRuleSet', function () { const legacy = ['RRULE:DTSTART=20171201T080000Z;FREQ=WEEKLY'] const original = ['DTSTART:20171201T080000Z', 'RRULE:FREQ=WEEKLY'] - expectRecurrence([original, legacy]).toBeUpdatedWithEndDate([ - 'DTSTART:20171201T080000Z', - 'RRULE:FREQ=WEEKLY;UNTIL=20171224T235959Z', - ].join('\n')) + expectRecurrence([original, legacy]).toBeUpdatedWithEndDate( + [ + 'DTSTART:20171201T080000Z', + 'RRULE:FREQ=WEEKLY;UNTIL=20171224T235959Z', + ].join('\n') + ) }) it('replaces an existing end date with a new one', () => { @@ -632,10 +708,12 @@ describe('RRuleSet', function () { 'RRULE:FREQ=WEEKLY;UNTIL=20180301T080000Z', ] - expectRecurrence([original, legacy]).toBeUpdatedWithEndDate([ - 'DTSTART:20171201T080000Z', - 'RRULE:FREQ=WEEKLY;UNTIL=20171224T235959Z', - ].join('\n')) + expectRecurrence([original, legacy]).toBeUpdatedWithEndDate( + [ + 'DTSTART:20171201T080000Z', + 'RRULE:FREQ=WEEKLY;UNTIL=20171224T235959Z', + ].join('\n') + ) }) it('handles rule in a timezone', () => { @@ -647,25 +725,38 @@ describe('RRuleSet', function () { 'RRULE:FREQ=WEEKLY', ] - expectRecurrence([original, legacy]).toBeUpdatedWithEndDate([ - 'DTSTART;TZID=America/New_York:20171201T080000', - 'RRULE:FREQ=WEEKLY;UNTIL=20171224T235959', - ].join('\n')) + expectRecurrence([original, legacy]).toBeUpdatedWithEndDate( + [ + 'DTSTART;TZID=America/New_York:20171201T080000', + 'RRULE:FREQ=WEEKLY;UNTIL=20171224T235959', + ].join('\n') + ) }) const updateWithEndDate = ( recurrence: string[], - updatedCursor: DateTime, + updatedCursor: Date ): string => { - const newEndDate = updatedCursor.minus({ days: 1 }).endOf('day') + const oneDay = 24 * 60 * 60 * 1000 + const oneDayEarlier = new Date(updatedCursor.getTime() - oneDay) + const newEndDate = new Date( + Date.UTC( + oneDayEarlier.getUTCFullYear(), + oneDayEarlier.getUTCMonth(), + oneDayEarlier.getUTCDate(), + 23, + 59, + 59 + ) + ) const rrule = rrulestr(recurrence.join('\n')) const newRuleSet = new RRuleSet() const rule = new RRule({ - ...rrule.origOptions, - until: newEndDate.toJSDate(), - }) + ...rrule.origOptions, + until: newEndDate, + }) newRuleSet.rrule(rule) @@ -674,18 +765,22 @@ describe('RRuleSet', function () { const amendRuleSetWithExceptionDate = ( recurrence: string[], - cursor: DateTime, + cursor: Date ): string => { - const ruleSet = rrulestr(recurrence.join('\n'), { forceset: true }) as RRuleSet - ruleSet.exdate(cursor.toJSDate()) + const ruleSet = rrulestr(recurrence.join('\n'), { + forceset: true, + }) as RRuleSet + ruleSet.exdate(cursor) return ruleSet.toString() } const amendRuleSetWithExceptionRule = ( recurrence: string[], - exrule: RRule, + exrule: RRule ): string => { - const ruleSet = rrulestr(recurrence.join('\n'), { forceset: true }) as RRuleSet + const ruleSet = rrulestr(recurrence.join('\n'), { + forceset: true, + }) as RRuleSet ruleSet.exrule(exrule) return ruleSet.toString() } @@ -693,82 +788,96 @@ describe('RRuleSet', function () { function expectRecurrence(recurrences: string[][]) { return { toAmendExrule(excluded: RRule, expected: string[]) { - recurrences.forEach(recurrence => { + recurrences.forEach((recurrence) => { const actual = amendRuleSetWithExceptionRule(recurrence, excluded) - expect(actual).to.equal(expected.join('\n')) + expect(actual).toBe(expected.join('\n')) }) }, - toAmendExdate(excluded: DateTime, expected: string[]) { - recurrences.forEach(recurrence => { + toAmendExdate(excluded: Date, expected: string[]) { + recurrences.forEach((recurrence) => { const actual = amendRuleSetWithExceptionDate(recurrence, excluded) - expect(actual).to.equal(expected.join('\n')) + expect(actual).toBe(expected.join('\n')) }) }, toBeUpdatedWithEndDate(expected: string) { - recurrences.forEach(recurrence => { + recurrences.forEach((recurrence) => { const actual = updateWithEndDate(recurrence, cursor) - expect(actual).to.equal(expected) + expect(actual).toBe(expected) }) }, } } }) + it('throws a RangeError on an rruleset with invalid TZID and exdate', () => { + const set = new RRuleSet() + set.rrule( + new RRule({ + count: 1, + dtstart: parse('19970902T090000'), + tzid: 'America/Unknown', + }) + ) + set.exdate(parse('19970902T090000')) + + expect(() => set.all().map(String)).toThrow(RangeError) + }) + it('throws an error if non-rrules are added via rrule or exrule', () => { const set = new RRuleSet() - expect(() => set.rrule('foo' as any)).to.throw() - expect(() => set.exrule('foo' as any)).to.throw() + expect(() => set.rrule('foo' as unknown as RRule)).toThrow() + expect(() => set.exrule('foo' as unknown as RRule)).toThrow() }) it('throws an error if non-dates are added via rdate or exdate', () => { const set = new RRuleSet() - expect(() => set.rdate('foo' as any)).to.throw() - expect(() => set.exdate('foo' as any)).to.throw() + expect(() => set.rdate('foo' as unknown as Date)).toThrow() + expect(() => set.exdate('foo' as unknown as Date)).toThrow() }) describe('getters', () => { it('rrules()', () => { - let set = new RRuleSet(); - let rrule = new RRule({ + const set = new RRuleSet() + const rrule = new RRule({ freq: RRule.YEARLY, count: 2, dtstart: parse('19600101T090000'), - tzid: 'America/New_York' - }); - set.rrule(rrule); + tzid: 'America/New_York', + }) + set.rrule(rrule) + + expect(set.rrules().map((e) => e.toString())).toEqual([rrule.toString()]) + }) - expect(set.rrules().map(e => e.toString())).eql([rrule.toString()]); - }); - it('exrules()', () => { - let set = new RRuleSet(); - let rrule = new RRule({ + const set = new RRuleSet() + const rrule = new RRule({ freq: RRule.YEARLY, count: 2, dtstart: parse('19600101T090000'), - tzid: 'America/New_York' - }); - set.exrule(rrule); + tzid: 'America/New_York', + }) + set.exrule(rrule) - expect(set.exrules().map(e => e.toString())).eql([rrule.toString()]); - }); + expect(set.exrules().map((e) => e.toString())).toEqual([rrule.toString()]) + }) it('rdates()', () => { - let set = new RRuleSet(); - let dt = parse('19610201T090000'); - set.rdate(dt); - - expect(set.rdates()).eql([dt]); - }); + const set = new RRuleSet() + const dt = parse('19610201T090000') + set.rdate(dt) + + expect(set.rdates()).toEqual([dt]) + }) it('exdates()', () => { - let set = new RRuleSet(); - let dt = parse('19610201T090000'); - set.exdate(dt); - - expect(set.exdates()).eql([dt]); - }); - }); -}); \ No newline at end of file + const set = new RRuleSet() + const dt = parse('19610201T090000') + set.exdate(dt) + + expect(set.exdates()).toEqual([dt]) + }) + }) +}) diff --git a/test/rrulestr.test.ts b/test/rrulestr.test.ts index 1ae2d511..66b5604d 100644 --- a/test/rrulestr.test.ts +++ b/test/rrulestr.test.ts @@ -1,304 +1,299 @@ -import { parse, datetime, datetimeUTC, testRecurring } from './lib/utils' +import { parse, datetime, testRecurring, TEST_CTX } from './lib/utils' import { RRule, RRuleSet, rrulestr, Frequency } from '../src' -import { expect } from 'chai' -import { Days } from '../src/rrule'; -import { parseInput } from '../src/rrulestr'; +import { Days } from '../src/rrule' +import { parseInput } from '../src/rrulestr' describe('rrulestr', function () { - // Enable additional toString() / fromString() tests - // for each testRecurring(). - this.ctx.ALSO_TEST_STRING_FUNCTIONS = false - - // Enable additional toText() / fromText() tests - // for each testRecurring(). - // Many of the tests fail because the conversion is only approximate, - // but it gives an idea about how well or bad it converts. - this.ctx.ALSO_TEST_NLP_FUNCTIONS = false - - // Thorough after()/before()/between() tests. - // NOTE: can take a longer time. - this.ctx.ALSO_TEST_BEFORE_AFTER_BETWEEN = true + beforeAll(() => { + // Enable additional toString() / fromString() tests + // for each testRecurring(). + TEST_CTX.ALSO_TESTSTRING_FUNCTIONS = false + + // Enable additional toText() / fromText() tests + // for each testRecurring(). + // Many of the tests fail because the conversion is only approximate, + // but it gives an idea about how well or bad it converts. + TEST_CTX.ALSO_TESTNLP_FUNCTIONS = false + + // Thorough after()/before()/between() tests. + // NOTE: can take a longer time. + TEST_CTX.ALSO_TESTBEFORE_AFTER_BETWEEN = true + + TEST_CTX.ALSO_TESTSUBSECOND_PRECISION = false + }) it('parses an rrule', () => { - expect(rrulestr( - 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3\n' - )).to.be.instanceof(RRule) + expect( + rrulestr('DTSTART:19970902T090000Z\n' + 'RRULE:FREQ=YEARLY;COUNT=3\n') + ).toBeInstanceOf(RRule) }) it('parses an rrule without frequency', () => { - const rRuleString = 'DTSTART:19970902T090000Z'; - const parsedRRuleSet = rrulestr( - rRuleString, { forceset: true } - ) as RRuleSet; - expect(parsedRRuleSet.toString()).to.be.equal(rRuleString); - - const parsedRRule = rrulestr(rRuleString) as RRule; - expect(parsedRRule.toString()).to.be.equal(rRuleString); + const rRuleString = 'DTSTART:19970902T090000Z' + const parsedRRuleSet = rrulestr(rRuleString, { forceset: true }) as RRuleSet + expect(parsedRRuleSet.toString()).toBe(rRuleString) + + const parsedRRule = rrulestr(rRuleString) as RRule + expect(parsedRRule.toString()).toBe(rRuleString) }) it('parses an rruleset when forceset=true', () => { - expect(rrulestr( - 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3\n', - { - forceset: true - } - )).to.be.instanceof(RRuleSet) + expect( + rrulestr('DTSTART:19970902T090000Z\n' + 'RRULE:FREQ=YEARLY;COUNT=3\n', { + forceset: true, + }) + ).toBeInstanceOf(RRuleSet) }) it('parses an rruleset when there are multiple rrules', () => { - expect(rrulestr( - 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n' + - 'RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n' - )).to.be.instanceof(RRuleSet) + expect( + rrulestr( + 'DTSTART:19970902T090000Z\n' + + 'RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n' + + 'RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n' + ) + ).toBeInstanceOf(RRuleSet) }) - testRecurring('testStr', - rrulestr( - 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3\n' - ), + testRecurring( + 'testStr', + rrulestr('DTSTART:19970902T090000Z\n' + 'RRULE:FREQ=YEARLY;COUNT=3\n'), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1998, 9, 2, 9, 0), - datetimeUTC(1999, 9, 2, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1998, 9, 2, 9, 0), + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrCase', - rrulestr( - 'dtstart:19970902T090000Z\n' + - 'rrule:freq=yearly;count=3\n' - ), + testRecurring( + 'testStrCase', + rrulestr('dtstart:19970902T090000Z\n' + 'rrule:freq=yearly;count=3\n'), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1998, 9, 2, 9, 0), - datetimeUTC(1999, 9, 2, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1998, 9, 2, 9, 0), + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrSpaces', - rrulestr( - ' DTSTART:19970902T090000Z ' + - ' RRULE:FREQ=YEARLY;COUNT=3 ' - ), + testRecurring( + 'testStrSpaces', + rrulestr(' DTSTART:19970902T090000Z ' + ' RRULE:FREQ=YEARLY;COUNT=3 '), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1998, 9, 2, 9, 0), - datetimeUTC(1999, 9, 2, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1998, 9, 2, 9, 0), + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrSpacesAndLines', + testRecurring( + 'testStrSpacesAndLines', rrulestr( - ' DTSTART:19970902T090000Z \n' + - ' \n RRULE:FREQ=YEARLY;COUNT=3 \n' + ' DTSTART:19970902T090000Z \n' + ' \n RRULE:FREQ=YEARLY;COUNT=3 \n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1998, 9, 2, 9, 0), - datetimeUTC(1999, 9, 2, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1998, 9, 2, 9, 0), + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrNoDTStart', - rrulestr( - 'RRULE:FREQ=YEARLY;COUNT=3\n', - { - dtstart: parse('19970902T090000') - } - ), + testRecurring( + 'testStrNoDTStart', + rrulestr('RRULE:FREQ=YEARLY;COUNT=3\n', { + dtstart: parse('19970902T090000'), + }), [ datetime(1997, 9, 2, 9, 0), datetime(1998, 9, 2, 9, 0), - datetime(1999, 9, 2, 9, 0) + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrValueOnly', - rrulestr( - 'FREQ=YEARLY;COUNT=3\n', - { - dtstart: parse('19970902T090000') - } - ), + testRecurring( + 'testStrValueOnly', + rrulestr('FREQ=YEARLY;COUNT=3\n', { + dtstart: parse('19970902T090000'), + }), [ datetime(1997, 9, 2, 9, 0), datetime(1998, 9, 2, 9, 0), - datetime(1999, 9, 2, 9, 0) + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrUnfold', - rrulestr( - 'FREQ=YEA\n RLY;COUNT=3\n', - { - unfold: true, - dtstart: parse('19970902T090000') - } - ), + testRecurring( + 'testStrUnfold', + rrulestr('FREQ=YEA\n RLY;COUNT=3\n', { + unfold: true, + dtstart: parse('19970902T090000'), + }), [ datetime(1997, 9, 2, 9, 0), datetime(1998, 9, 2, 9, 0), - datetime(1999, 9, 2, 9, 0) + datetime(1999, 9, 2, 9, 0), ] ) - testRecurring('testStrSet', + testRecurring( + 'testStrSet', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n' + - 'RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n' + 'RRULE:FREQ=YEARLY;COUNT=2;BYDAY=TU\n' + + 'RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TH\n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1997, 9, 4, 9, 0), - datetimeUTC(1997, 9, 9, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1997, 9, 4, 9, 0), + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testStrSetDate', + testRecurring( + 'testStrSetDate', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TU\n' + - 'RDATE:19970904T090000Z\n' + - 'RDATE:19970909T090000Z\n' + 'RRULE:FREQ=YEARLY;COUNT=1;BYDAY=TU\n' + + 'RDATE:19970904T090000Z\n' + + 'RDATE:19970909T090000Z\n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1997, 9, 4, 9, 0), - datetimeUTC(1997, 9, 9, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1997, 9, 4, 9, 0), + datetime(1997, 9, 9, 9, 0), ] ) - testRecurring('testStrSetExRule', + testRecurring( + 'testStrSetExRule', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n' + - 'EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n' + 'RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n' + + 'EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1997, 9, 9, 9, 0), - datetimeUTC(1997, 9, 16, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1997, 9, 9, 9, 0), + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testStrSetExDate', + testRecurring( + 'testStrSetExDate', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n' + - 'EXDATE:19970904T090000Z\n' + - 'EXDATE:19970911T090000Z\n' + - 'EXDATE:19970918T090000Z\n' + 'RRULE:FREQ=YEARLY;COUNT=6;BYDAY=TU,TH\n' + + 'EXDATE:19970904T090000Z\n' + + 'EXDATE:19970911T090000Z\n' + + 'EXDATE:19970918T090000Z\n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1997, 9, 9, 9, 0), - datetimeUTC(1997, 9, 16, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1997, 9, 9, 9, 0), + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testStrSetDateAndExDate', + testRecurring( + 'testStrSetDateAndExDate', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RDATE:19970902T090000Z\n' + - 'RDATE:19970904T090000Z\n' + - 'RDATE:19970909T090000Z\n' + - 'RDATE:19970911T090000Z\n' + - 'RDATE:19970916T090000Z\n' + - 'RDATE:19970918T090000Z\n' + - 'EXDATE:19970904T090000Z\n' + - 'EXDATE:19970911T090000Z\n' + - 'EXDATE:19970918T090000Z\n' + 'RDATE:19970902T090000Z\n' + + 'RDATE:19970904T090000Z\n' + + 'RDATE:19970909T090000Z\n' + + 'RDATE:19970911T090000Z\n' + + 'RDATE:19970916T090000Z\n' + + 'RDATE:19970918T090000Z\n' + + 'EXDATE:19970904T090000Z\n' + + 'EXDATE:19970911T090000Z\n' + + 'EXDATE:19970918T090000Z\n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1997, 9, 9, 9, 0), - datetimeUTC(1997, 9, 16, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1997, 9, 9, 9, 0), + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testStrSetDateAndExRule', + testRecurring( + 'testStrSetDateAndExRule', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RDATE:19970902T090000Z\n' + - 'RDATE:19970904T090000Z\n' + - 'RDATE:19970909T090000Z\n' + - 'RDATE:19970911T090000Z\n' + - 'RDATE:19970916T090000Z\n' + - 'RDATE:19970918T090000Z\n' + - 'EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n' + 'RDATE:19970902T090000Z\n' + + 'RDATE:19970904T090000Z\n' + + 'RDATE:19970909T090000Z\n' + + 'RDATE:19970911T090000Z\n' + + 'RDATE:19970916T090000Z\n' + + 'RDATE:19970918T090000Z\n' + + 'EXRULE:FREQ=YEARLY;COUNT=3;BYDAY=TH\n' ), [ - datetimeUTC(1997, 9, 2, 9, 0), - datetimeUTC(1997, 9, 9, 9, 0), - datetimeUTC(1997, 9, 16, 9, 0) + datetime(1997, 9, 2, 9, 0), + datetime(1997, 9, 9, 9, 0), + datetime(1997, 9, 16, 9, 0), ] ) - testRecurring('testStrKeywords', + testRecurring( + 'testStrKeywords', rrulestr( 'DTSTART:19970902T030000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=3;' + - 'BYMONTH=3;byweekday=TH;BYMONTHDAY=3;' + - 'BYHOUR=3;BYMINUTE=3;BYSECOND=3\n' + 'RRULE:FREQ=YEARLY;COUNT=3;INTERVAL=3;' + + 'BYMONTH=3;byweekday=TH;BYMONTHDAY=3;' + + 'BYHOUR=3;BYMINUTE=3;BYSECOND=3\n' ), [ - datetimeUTC(2033, 3, 3, 3, 3, 3), - datetimeUTC(2039, 3, 3, 3, 3, 3), - datetimeUTC(2072, 3, 3, 3, 3, 3) + datetime(2033, 3, 3, 3, 3, 3), + datetime(2039, 3, 3, 3, 3, 3), + datetime(2072, 3, 3, 3, 3, 3), ] ) - testRecurring('testStrNWeekDay', + testRecurring( + 'testStrNWeekDay', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3;BYDAY=1TU,-1TH\n' + 'RRULE:FREQ=YEARLY;COUNT=3;BYDAY=1TU,-1TH\n' ), [ - datetimeUTC(1997, 12, 25, 9, 0), - datetimeUTC(1998, 1, 6, 9, 0), - datetimeUTC(1998, 12, 31, 9, 0) + datetime(1997, 12, 25, 9, 0), + datetime(1998, 1, 6, 9, 0), + datetime(1998, 12, 31, 9, 0), ] ) - testRecurring('testStrNWeekDayLarge', + testRecurring( + 'testStrNWeekDayLarge', rrulestr( 'DTSTART:19970902T090000Z\n' + - 'RRULE:FREQ=YEARLY;COUNT=3;BYDAY=13TU,-13TH\n' + 'RRULE:FREQ=YEARLY;COUNT=3;BYDAY=13TU,-13TH\n' ), [ - datetimeUTC(1997, 10, 2, 9, 0), - datetimeUTC(1998, 3, 31, 9, 0), - datetimeUTC(1998, 10, 8, 9, 0) + datetime(1997, 10, 2, 9, 0), + datetime(1998, 3, 31, 9, 0), + datetime(1998, 10, 8, 9, 0), ] ) it('parses without TZID', () => { - const rrule = rrulestr( - 'DTSTART:19970902T090000\nRRULE:FREQ=WEEKLY' - ) + const rrule = rrulestr('DTSTART:19970902T090000\nRRULE:FREQ=WEEKLY') - expect(rrule.origOptions).to.deep.include({ + expect(rrule.origOptions).toMatchObject({ freq: Frequency.WEEKLY, - dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), + dtstart: datetime(1997, 9, 2, 9, 0, 0), }) }) it('parses TZID', () => { const rrule = rrulestr( 'DTSTART;TZID=America/New_York:19970902T090000\n' + - 'RRULE:FREQ=DAILY;UNTIL=19980902T090000' + 'RRULE:FREQ=DAILY;UNTIL=19980902T090000' ) - expect(rrule.origOptions).to.deep.include({ + expect(rrule.origOptions).toMatchObject({ tzid: 'America/New_York', freq: Frequency.DAILY, - dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), - until: new Date(Date.UTC(1998, 8, 2, 9, 0, 0)) + dtstart: datetime(1997, 9, 2, 9, 0, 0), + until: datetime(1998, 9, 2, 9, 0, 0), }) }) @@ -307,11 +302,11 @@ describe('rrulestr', function () { 'RRULE:UNTIL=19990404T110000Z;DTSTART=19990104T110000Z;FREQ=WEEKLY;BYDAY=TU,WE' ) - expect(rrule.options).to.deep.include({ - until: new Date(Date.UTC(1999, 3, 4, 11, 0, 0)), - dtstart: new Date(Date.UTC(1999, 0, 4, 11, 0, 0)), + expect(rrule.options).toMatchObject({ + until: datetime(1999, 4, 4, 11, 0, 0), + dtstart: datetime(1999, 1, 4, 11, 0, 0), freq: Frequency.WEEKLY, - byweekday: [Days.TU.weekday, Days.WE.weekday] + byweekday: [Days.TU.weekday, Days.WE.weekday], }) }) @@ -320,58 +315,58 @@ describe('rrulestr', function () { 'RRULE:UNTIL=19990404T110000Z;DTSTART;TZID=America/New_York:19990104T110000Z;FREQ=WEEKLY;BYDAY=TU,WE' ) - expect(rrule.options).to.deep.include({ - until: new Date(Date.UTC(1999, 3, 4, 11, 0, 0)), - dtstart: new Date(Date.UTC(1999, 0, 4, 11, 0, 0)), + expect(rrule.options).toMatchObject({ + until: datetime(1999, 4, 4, 11, 0, 0), + dtstart: datetime(1999, 1, 4, 11, 0, 0), freq: Frequency.WEEKLY, tzid: 'America/New_York', - byweekday: [Days.TU.weekday, Days.WE.weekday] + byweekday: [Days.TU.weekday, Days.WE.weekday], }) }) it('parses a DTSTART if it is the first param', () => { const rrule = rrulestr( - "RRULE:DTSTART;TZID=America/Los_Angeles:20180719T111500;FREQ=DAILY;INTERVAL=1" + 'RRULE:DTSTART;TZID=America/Los_Angeles:20180719T111500;FREQ=DAILY;INTERVAL=1' ) - expect(rrule.options).to.deep.include({ - dtstart: new Date(Date.UTC(2018, 6, 19, 11, 15, 0)), + expect(rrule.options).toMatchObject({ + dtstart: datetime(2018, 7, 19, 11, 15, 0), freq: Frequency.DAILY, interval: 1, - tzid: 'America/Los_Angeles' + tzid: 'America/Los_Angeles', }) }) it('parses an RDATE with no TZID param', () => { const rruleset = rrulestr( - "DTSTART:20180719T111500Z\n"+ - "RRULE:FREQ=DAILY;INTERVAL=1\n" + - "RDATE:20180720T111500Z\n"+ - "EXDATE:20180721T111500Z" + 'DTSTART:20180719T111500Z\n' + + 'RRULE:FREQ=DAILY;INTERVAL=1\n' + + 'RDATE:20180720T111500Z\n' + + 'EXDATE:20180721T111500Z' ) as RRuleSet - expect(rruleset.valueOf()).to.deep.equal([ - "DTSTART:20180719T111500Z", - "RRULE:FREQ=DAILY;INTERVAL=1", - "RDATE:20180720T111500Z", - "EXDATE:20180721T111500Z" - ]) + expect(rruleset.valueOf()).toEqual([ + 'DTSTART:20180719T111500Z', + 'RRULE:FREQ=DAILY;INTERVAL=1', + 'RDATE:20180720T111500Z', + 'EXDATE:20180721T111500Z', + ]) }) it('parses an RDATE with a TZID param', () => { const rruleset = rrulestr( - "DTSTART;TZID=America/Los_Angeles:20180719T111500\n"+ - "RRULE:FREQ=DAILY;INTERVAL=1\n" + - "RDATE;TZID=America/Los_Angeles:20180720T111500\n"+ - "EXDATE;TZID=America/Los_Angeles:20180721T111500" + 'DTSTART;TZID=America/Los_Angeles:20180719T111500\n' + + 'RRULE:FREQ=DAILY;INTERVAL=1\n' + + 'RDATE;TZID=America/Los_Angeles:20180720T111500\n' + + 'EXDATE;TZID=America/Los_Angeles:20180721T111500' ) as RRuleSet - expect(rruleset.valueOf()).to.deep.equal([ - "DTSTART;TZID=America/Los_Angeles:20180719T111500", - "RRULE:FREQ=DAILY;INTERVAL=1", - "RDATE;TZID=America/Los_Angeles:20180720T111500", - "EXDATE;TZID=America/Los_Angeles:20180721T111500" - ]) + expect(rruleset.valueOf()).toEqual([ + 'DTSTART;TZID=America/Los_Angeles:20180719T111500', + 'RRULE:FREQ=DAILY;INTERVAL=1', + 'RDATE;TZID=America/Los_Angeles:20180720T111500', + 'EXDATE;TZID=America/Los_Angeles:20180721T111500', + ]) }) }) @@ -379,31 +374,31 @@ describe('parseInput', () => { it('parses an input into a structure', () => { const output = parseInput( 'DTSTART;TZID=America/New_York:19970902T090000\n' + - 'RRULE:FREQ=DAILY;UNTIL=19980902T090000;INTERVAL=1\n' + - 'RDATE:19970902T090000Z\n' + - 'RDATE:19970904T090000Z\n' + - 'EXDATE:19970904T090000Z\n' + - 'EXRULE:FREQ=WEEKLY;INTERVAL=2\n' - , {}) - expect(output).to.deep.include({ - dtstart: new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), + 'RRULE:FREQ=DAILY;UNTIL=19980902T090000;INTERVAL=1\n' + + 'RDATE:19970902T090000Z\n' + + 'RDATE:19970904T090000Z\n' + + 'EXDATE:19970904T090000Z\n' + + 'EXRULE:FREQ=WEEKLY;INTERVAL=2\n', + {} + ) + expect(output).toMatchObject({ + dtstart: datetime(1997, 9, 2, 9, 0, 0), tzid: 'America/New_York', - rrulevals: [{ - interval: 1, - freq: Frequency.DAILY, - until: new Date(Date.UTC(1998, 8, 2, 9, 0, 0)) - }], - exdatevals: [ - new Date(Date.UTC(1997, 8, 4, 9, 0, 0)), + rrulevals: [ + { + interval: 1, + freq: Frequency.DAILY, + until: datetime(1998, 9, 2, 9, 0, 0), + }, ], - rdatevals: [ - new Date(Date.UTC(1997, 8, 2, 9, 0, 0)), - new Date(Date.UTC(1997, 8, 4, 9, 0, 0)), + exdatevals: [datetime(1997, 9, 4, 9, 0, 0)], + rdatevals: [datetime(1997, 9, 2, 9, 0, 0), datetime(1997, 9, 4, 9, 0, 0)], + exrulevals: [ + { + interval: 2, + freq: Frequency.WEEKLY, + }, ], - exrulevals: [{ - interval: 2, - freq: Frequency.WEEKLY - }] }) }) }) diff --git a/test/tslint.json b/test/tslint.json deleted file mode 100644 index bc325e44..00000000 --- a/test/tslint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": ["../tslint"], - "no-unused-expression": false -} diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..d014c045 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "baseUrl": "./dist/esm", + "outDir": "./dist/esm", + "declaration": true, + "declarationMap": true, + "noImplicitAny": true, + "sourceMap": true, + "module": "es2015", + "moduleResolution": "node", + "noEmitOnError": true, + "target": "es5", + "importHelpers": true, + "esModuleInterop": true, + "rootDirs": ["./src/"] + }, + "include": ["./src/**/*"], + "exclude": ["node_modules", "./test/**/*"] +} diff --git a/tsconfig.json b/tsconfig.json index 35747320..d89ed13a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,19 +1,15 @@ { "compilerOptions": { - "outDir": "./dist/esm", - "declaration": true, - "declarationMap": true, + "noEmit": true, "noImplicitAny": true, "sourceMap": true, - "module": "es2015", - "moduleResolution": "node", + "module": "commonjs", "noEmitOnError": true, - "target": "es5", - "jsx": "react", - "strictNullChecks": true, - "importHelpers": true, - "rootDirs": ["./src/", "./test/", "./demo/"] + "esModuleInterop": true, + "target": "es6", + "baseUrl": ".", + "rootDirs": ["./src/", "./test/"] }, - "include": ["./src/**/*", "./demo/**/*"], - "exclude": ["node_modules", "./test/**/*"] + "include": ["./src/**/*", "./test/**/*"], + "exclude": ["node_modules"] } diff --git a/tsconfig.test.json b/tsconfig.test.json deleted file mode 100644 index 69243529..00000000 --- a/tsconfig.test.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "outDir": "./dist/es6", - "declaration": true, - "noImplicitAny": true, - "sourceMap": true, - "module": "commonjs", - "noEmitOnError": true, - "target": "es6", - "jsx": "react", - "baseUrl": ".", - "rootDirs": [ - "./src/", - "./test/", - ] - }, - "include": [ - "./src/**/*", - "./test/**/*" - ], - "exclude": [ - "node_modules", - ] -} \ No newline at end of file diff --git a/tslint.json b/tslint.json deleted file mode 100644 index a356f3e5..00000000 --- a/tslint.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "extends": ["tslint-eslint-rules"], - "rules": { - // TSLint rules. - "no-internal-module": true, - "typedef-whitespace": [ - true, - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } - ], - "await-promise": true, - "curly": [true, "ignore-same-line"], - "deprecation": true, - "label-position": true, - "no-arg": true, - "no-conditional-assignment": true, - "no-duplicate-imports": true, - "no-duplicate-variable": true, - "no-empty": true, - "no-eval": true, - "no-reference-import": true, - "no-return-await": true, - "no-switch-case-fall-through": true, - "no-unused-expression": [ - true, - "allow-fast-null-checks", - "allow-tagged-template" - ], - "no-use-before-declare": true, - "no-var-keyword": true, - "radix": true, - "space-within-parens": [true, 0], - "triple-equals": [true, "allow-null-check"], - "use-isnan": true, - "eofline": true, - "ter-indent": [ - true, - 2, - { - "SwitchCase": 1 - } - ], - "no-trailing-whitespace": true, - "trailing-comma": [ - true, - { - "multiline": "never", - "singleline": "never" - } - ], - "class-name": true, - "comment-format": [true, "check-space"], - "jsdoc-format": true, - "new-parens": true, - "no-angle-bracket-type-assertion": true, - "no-consecutive-blank-lines": true, - "no-floating-promises": true, - "no-misused-new": true, - "no-string-throw": true, - "no-unnecessary-qualifier": true, - "no-unnecessary-type-assertion": true, - "one-line": [ - true, - "check-catch", - "check-finally", - "check-else", - "check-open-brace", - "check-whitespace" - ], - "one-variable-per-declaration": true, - "quotemark": [true, "single", "avoid-escape", "jsx-single"], - "semicolon": [true, "never"], - "space-before-function-paren": [true, "always"], - "unified-signatures": true, - "variable-name": [ - true, - "ban-keywords", - "check-format", - "allow-leading-underscore", - "allow-pascal-case" - ], - "whitespace": [ - true, - "check-branch", - "check-decl", - "check-operator", - // 'check-module', - "check-rest-spread", - "check-type", - "check-typecast", - "check-type-operator", - "check-preblock" - ], - // TSLint ESLint rules. - "no-constant-condition": [ - true, - { - "checkLoops": false - } - ], - "no-control-regex": true, - "no-duplicate-case": true, - "no-empty-character-class": true, - "no-ex-assign": true, - "no-extra-boolean-cast": true, - "no-inner-declarations": [true, "functions"], - "no-invalid-regexp": true, - "ter-no-irregular-whitespace": true, - "no-regex-spaces": true, - "ter-no-sparse-arrays": true, - "ter-func-call-spacing": [true, "never"], - "no-unexpected-multiline": true, - "valid-typeof": true, - "ter-arrow-spacing": [ - true, - { - "before": true, - "after": true - } - ], - "no-multi-spaces": true, - "handle-callback-err": [true, "^(err|error)$"], - "block-spacing": [true, "always"], - "brace-style": [ - true, - "1tbs", - { - "allowSingleLine": true - } - ], - "object-curly-spacing": [true, "always"] - } -} diff --git a/webpack.config.js b/webpack.config.js index 42e04419..5601263c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,113 +1,51 @@ -const webpack = require("webpack"); -const path = require("path"); -const CopyWebpackPlugin = require("copy-webpack-plugin"); -const HtmlWebpackPlugin = require("html-webpack-plugin"); -const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); +const path = require('path') +const TerserPlugin = require('terser-webpack-plugin') +const UnminifiedWebpackPlugin = require('unminified-webpack-plugin') const paths = { - demo: { - source: path.resolve(__dirname, 'demo'), - styles: path.resolve(__dirname, "demo", "demo.css"), - template: path.resolve(__dirname, "demo", "index.html") - }, source: path.resolve(__dirname, 'src'), - demoDist: path.resolve(__dirname, "dist", "esm", "demo"), - es5: path.resolve(__dirname, "dist", "es5"), - esm: path.resolve(__dirname, "dist", "esm") -}; + es5: path.resolve(__dirname, 'dist', 'es5'), +} const commonConfig = { output: { - filename: '[name].js', + filename: '[name].min.js', path: paths.es5, library: 'rrule', libraryTarget: 'umd', - globalObject: "typeof self !== 'undefined' ? self : this" + globalObject: "typeof self !== 'undefined' ? self : this", }, devtool: 'source-map', mode: 'production', resolve: { - extensions: ['.js', '.ts'] + extensions: ['.js', '.ts'], }, module: { rules: [ { exclude: /node_modules/, - loader: "ts-loader", - test: /\.ts$/ - } - ] + loader: 'ts-loader', + test: /\.ts$/, + options: { + configFile: 'tsconfig.build.json', + }, + }, + ], }, optimization: { minimize: true, - minimizer: [ - new UglifyJsPlugin({ - exclude: /\.ts$/, - include: /\.min\.js$/ - }) - ] - } -}; - -const rruleConfig = Object.assign({ - entry: { - rrule: path.join(paths.source, "index.ts"), - 'rrule.min': path.join(paths.source, "index.ts") - }, - externals: { - luxon: 'luxon' - }, -}, commonConfig); - -const rruleWithLuxonConfig = Object.assign({ - entry: { - 'rrule-tz': path.join(paths.source, "index.ts"), - 'rrule-tz.min': path.join(paths.source, "index.ts") + minimizer: [new TerserPlugin()], }, -}, commonConfig); + plugins: [new UnminifiedWebpackPlugin()], +} -const demoConfig = { - entry: { - demo: path.join(paths.demo.source, "demo.ts"), - }, - module: { - rules: [ - { - test: /\.js$/, - use: ["source-map-loader"], - enforce: "pre" - }, - { - exclude: /node_modules/, - loader: "ts-loader", - test: /\.ts$/ - } - ] - }, - output: { - filename: "demo.js", - path: paths.demoDist - }, - resolve: { - extensions: [".js", ".ts"] - }, - plugins: [ - new webpack.ProvidePlugin({ - $: "jquery", - jQuery: "jquery" - }), - new CopyWebpackPlugin([ - { - from: paths.demo.styles, - to: paths.demoDist - } - ]), - new HtmlWebpackPlugin({ - template: paths.demo.template - }) - ], - devtool: "source-map", - mode: "production" -}; +const rruleConfig = Object.assign( + { + entry: { + rrule: path.join(paths.source, 'index.ts'), + }, + }, + commonConfig +) -module.exports = [rruleConfig, rruleWithLuxonConfig, demoConfig]; +module.exports = [rruleConfig] diff --git a/yarn.lock b/yarn.lock index 399899cd..1e1781bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,1769 +2,2751 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c" +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@babel/highlight" "7.0.0-beta.51" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@babel/generator@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.51.tgz#6c7575ffde761d07485e04baedc0392c6d9e30f6" - dependencies: - "@babel/types" "7.0.0-beta.51" +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== + +"@babel/compat-data@^7.22.9": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.3" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.7.5": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" + integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.2" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.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" + +"@babel/generator@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" jsesc "^2.5.1" - lodash "^4.17.5" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/helper-function-name@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz#21b4874a227cf99ecafcc30a90302da5a2640561" - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.51" - "@babel/template" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" - -"@babel/helper-get-function-arity@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz#3281b2d045af95c172ce91b20825d85ea4676411" - dependencies: - "@babel/types" "7.0.0-beta.51" -"@babel/helper-split-export-declaration@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz#8a6c3f66c4d265352fc077484f9f6e80a51ab978" +"@babel/generator@^7.23.3", "@babel/generator@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" + integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== dependencies: - "@babel/types" "7.0.0-beta.51" + "@babel/types" "^7.23.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" -"@babel/highlight@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d" - dependencies: +"@babel/helper-compilation-targets@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" + integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + 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.18.0" + "@babel/types" "^7.18.0" + +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.17.7": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" + integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== + dependencies: + "@babel/types" "^7.18.2" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helpers@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" + integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@babel/parser@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.51.tgz#27cec2df409df60af58270ed8f6aa55409ea86f6" - -"@babel/template@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.51.tgz#9602a40aebcf357ae9677e2532ef5fc810f5fbff" - dependencies: - "@babel/code-frame" "7.0.0-beta.51" - "@babel/parser" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" - lodash "^4.17.5" - -"@babel/traverse@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.51.tgz#981daf2cec347a6231d3aa1d9e1803b03aaaa4a8" - dependencies: - "@babel/code-frame" "7.0.0-beta.51" - "@babel/generator" "7.0.0-beta.51" - "@babel/helper-function-name" "7.0.0-beta.51" - "@babel/helper-split-export-declaration" "7.0.0-beta.51" - "@babel/parser" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.17.5" + js-tokens "^4.0.0" -"@babel/types@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9" +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - esutils "^2.0.2" - lodash "^4.17.5" - to-fast-properties "^2.0.0" + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" -"@types/assert@^0.0.31": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/assert/-/assert-0.0.31.tgz#d1f70595a72d02555b7ecd28eb4c68f1b6918d6d" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" + integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== -"@types/chai@^4.1.4": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.4.tgz#5ca073b330d90b4066d6ce18f60d57f2084ce8ca" +"@babel/parser@^7.16.7", "@babel/parser@^7.18.0": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" + integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== -"@types/jquery@^3.3.29": - version "3.3.29" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.29.tgz#680a2219ce3c9250483722fccf5570d1e2d08abd" +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - "@types/sizzle" "*" - -"@types/luxon@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.2.2.tgz#3b402da20bd8ca357123851e062d2142cdbdd9bc" + "@babel/helper-plugin-utils" "^7.8.0" -"@types/mocha@^5.2.5": - version "5.2.5" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" - -"@types/mockdate@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mockdate/-/mockdate-2.0.0.tgz#aaf388a1ead3b0f5ed6dc1611956ea7b40a57d3c" - -"@types/node@^10.12.18": - version "10.12.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" - -"@types/sizzle@*": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" - dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" - -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" - -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" - dependencies: - debug "^3.1.0" - -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" - dependencies: - "@webassemblyjs/wast-printer" "1.5.13" - -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" - -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" - dependencies: - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" - -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" - dependencies: - ieee754 "^1.1.11" - -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" - dependencies: - long "4.0.0" - -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" - -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" - mamacro "^0.0.3" - -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: - acorn "^5.0.0" + "@babel/helper-plugin-utils" "^7.10.4" -acorn@^5.0.0, acorn@^5.6.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" -ajv@^6.1.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.1" + "@babel/helper-plugin-utils" "^7.10.4" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" + "@babel/helper-plugin-utils" "^7.8.0" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: - color-convert "^1.9.0" + "@babel/helper-plugin-utils" "^7.22.5" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" +"@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - default-require-extensions "^1.0.0" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" +"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" + integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.2" + debug "^4.1.0" + globals "^11.1.0" -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" +"@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" + integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.3" + "@babel/types" "^7.23.3" + debug "^4.1.0" + globals "^11.1.0" -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.3.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" + integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" +"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" + integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== dependencies: - sprintf-js "~1.0.2" + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" +"@es-joy/jsdoccomment@~0.31.0": + version "0.31.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz#dbc342cc38eb6878c12727985e693eaef34302bc" + integrity sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ== dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + comment-parser "1.3.1" + esquery "^1.4.0" + jsdoc-type-pratt-parser "~3.1.0" -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" +"@eslint/eslintrc@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" + integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.3.2" + globals "^13.15.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" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.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" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@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.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@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 "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + 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.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.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" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== dependencies: - util "0.10.3" + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -async@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" + type-detect "4.0.8" -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== -browserify-cipher@^1.0.0: +"@tsconfig/node14@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== -browserify-des@^1.0.0: +"@tsconfig/node16@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/assert@^1.4.3": + version "1.5.6" + resolved "https://registry.yarnpkg.com/@types/assert/-/assert-1.5.6.tgz#a8b5a94ce5fb8f4ba65fdc37fc9507609114189e" + integrity sha512-Y7gDJiIqb9qKUHfBQYOWGngUpLORtirAVPuj/CWJrU2C6ZM4/y3XLwuwfGMF8s7QzW746LQZx23m0+1FSgjfug== + +"@types/babel__core@^7.1.14": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.4.tgz#26a87347e6c6f753b3668398e34496d6d9ac6ac0" + integrity sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg== dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" +"@types/babel__generator@*": + version "7.6.7" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" + integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" + "@babel/types" "^7.0.0" -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== dependencies: - pako "~1.0.5" + "@babel/types" "^7.20.7" -buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" -buffer-from@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" +"@types/eslint@*": + version "8.4.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" + integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + "@types/node" "*" -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +"@types/is-windows@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-0.2.0.tgz#6f24ee48731d31168ea510610d6dd15e5fc9c6ff" + integrity sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8= -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" +"@types/istanbul-lib-coverage@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" + "@types/istanbul-lib-coverage" "*" -caching-transform@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: - md5-hex "^1.2.0" - mkdirp "^0.5.1" - write-file-atomic "^1.1.4" + "@types/istanbul-lib-report" "*" -camel-case@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" +"@types/jest@^29.5.8": + version "29.5.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.8.tgz#ed5c256fe2bc7c38b1915ee5ef1ff24a3427e120" + integrity sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g== dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" + expect "^29.0.0" + pretty-format "^29.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" +"@types/mockdate@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/mockdate/-/mockdate-3.0.0.tgz#ed140c46c4542964621e553d181faf62cadc973a" + integrity sha512-p2mDrXSBlcpz1JFRTzeF12g4yGpHgh8HKoOWUw6gE/+W/s+oXPfip/n1Z+qLyE7wU1NSWCslexEEd1FAlNCWPQ== dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + mockdate "*" -chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" +"@types/node@*", "@types/node@^17.0.41": + version "17.0.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.41.tgz#1607b2fd3da014ae5d4d1b31bc792a39348dfb9b" + integrity sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw== -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.31" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.31.tgz#8fd0089803fd55d8a285895a18b88cb71a99683c" + integrity sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz#fdf59c905354139046b41b3ed95d1609913d0758" + integrity sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw== + dependencies: + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/type-utils" "5.27.1" + "@typescript-eslint/utils" "5.27.1" + debug "^4.3.4" + functional-red-black-tree "^1.0.1" + ignore "^5.2.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.27.1.tgz#3a4dcaa67e45e0427b6ca7bb7165122c8b569639" + integrity sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ== + dependencies: + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/typescript-estree" "5.27.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz#4d1504392d01fe5f76f4a5825991ec78b7b7894d" + integrity sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg== + dependencies: + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/visitor-keys" "5.27.1" + +"@typescript-eslint/type-utils@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz#369f695199f74c1876e395ebea202582eb1d4166" + integrity sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw== + dependencies: + "@typescript-eslint/utils" "5.27.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.27.1.tgz#34e3e629501349d38be6ae97841298c03a6ffbf1" + integrity sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg== + +"@typescript-eslint/typescript-estree@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz#7621ee78607331821c16fffc21fc7a452d7bc808" + integrity sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw== + dependencies: + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/visitor-keys" "5.27.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.27.1.tgz#b4678b68a94bc3b85bf08f243812a6868ac5128f" + integrity sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.27.1" + "@typescript-eslint/types" "5.27.1" + "@typescript-eslint/typescript-estree" "5.27.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.27.1": + version "5.27.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz#05a62666f2a89769dac2e6baa48f74e8472983af" + integrity sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ== + dependencies: + "@typescript-eslint/types" "5.27.1" + eslint-visitor-keys "^3.3.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + envinfo "^7.7.3" -chardet@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" - -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== -chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" +abab@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: - tslib "^1.9.0" + clean-stack "^2.0.0" + indent-string "^4.0.0" -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - inherits "^2.0.1" - safe-buffer "^5.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" -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + type-fest "^0.21.3" -clean-css@4.1.x: - version "4.1.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" - dependencies: - source-map "0.5.x" +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + color-convert "^1.9.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" + color-convert "^2.0.1" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" +ansi-styles@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== -color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - color-name "1.1.1" - -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + normalize-path "^3.0.0" + picomatch "^2.0.4" -commander@2.16.x, commander@^2.12.1, commander@~2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" +array-includes@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: - date-now "^0.1.4" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@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" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + 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" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" + fill-range "^7.0.1" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" +browserslist@^4.14.5, browserslist@^4.20.2: + version "4.20.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" + integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== + dependencies: + caniuse-lite "^1.0.30001349" + electron-to-chromium "^1.4.147" + escalade "^3.1.1" + node-releases "^2.0.5" + picocolors "^1.0.0" -copy-webpack-plugin@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" +browserslist@^4.21.9: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - globby "^7.1.1" - is-glob "^4.0.0" - loader-utils "^1.1.0" - minimatch "^3.0.4" - p-limit "^1.0.0" - serialize-javascript "^1.4.0" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" -cosmiconfig@^5.0.2: - version "5.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" + node-int64 "^0.4.0" -coverage@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/coverage/-/coverage-0.0.0.tgz#fe35dfd6258e2cce0295e37145e689ae7f156620" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" +c8@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/c8/-/c8-5.0.4.tgz#a247fd6a4cbc19b33dae17178a7d903a8dd7fa79" + integrity sha512-MgWIJ3HYe4NTtqwD+v16OdHvfqSzSLOmsptMuUxkzsYMoZzEeUv3yVep2d84qFjgio/3WbVEd9bkYQCFSDKeMw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + find-up "^4.0.0" + foreground-child "^2.0.0" + furi "^1.3.0" + istanbul-lib-coverage "^2.0.5" + istanbul-lib-report "^2.0.8" + istanbul-reports "^2.2.6" + rimraf "^3.0.0" + test-exclude "^5.2.3" + v8-to-istanbul "^3.2.3" + yargs "^14.0.0" + yargs-parser "^14.0.0" + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" -cross-spawn@^4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001349: + version "1.0.30001350" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001350.tgz#f0acc6472469d066a4357765eb73be5973eda918" + integrity sha512-NZBql38Pzd+rAu5SPXv+qmTWGQuFsRiemHCJCAPvkoDxWV19/xqL2YHF32fDJ9SDLdLqfax8+S0CO3ncDCp9Iw== + +caniuse-lite@^1.0.30001541: + version "1.0.30001561" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da" + integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== + +chalk@^2.0.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: - lru-cache "^4.0.1" - which "^1.2.9" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-select@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -css-what@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== -debug-log@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -debug@3.1.0, debug@^3.1.0: +cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: - ms "2.0.0" + restore-cursor "^3.1.0" -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: - ms "2.0.0" + slice-ansi "^3.0.0" + string-width "^4.2.0" -decamelize@^1.0.0, decamelize@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: - xregexp "4.0.0" + slice-ansi "^5.0.0" + string-width "^5.0.0" -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: - type-detect "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: - strip-bom "^2.0.0" + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + color-name "1.1.3" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - is-descriptor "^0.1.0" + color-name "~1.1.4" -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.14, colorette@^2.0.16, colorette@^2.0.17: + version "2.0.17" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.17.tgz#5dd4c0d15e2984b7433cb4a9f2ead45063b80c47" + integrity sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g== + +commander@^2.20.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" + integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== + +comment-parser@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b" + integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: - is-descriptor "^1.0.0" + safe-buffer "~5.1.1" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + safe-buffer "~5.1.1" -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" +coverage@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/coverage/-/coverage-0.4.1.tgz#71297733f6f54af749f64a58520dbae8d81ca966" + integrity sha512-Nwe6RSpwaUR6R++b5QukGrbu3rpeSOGZ805f6IXwG63pIaJZ7NV5osfDgJ43Fz0B9IwXha+jwArWB8Tpngi8lA== dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + c8 "^5.0.1" + foreground-child "^1.5.6" + normalize-package-data "^2.5.0" + slash "^3.0.0" + test-exclude "^5.2.3" + which "^1.3.1" + yargs-parser "^13.1.1" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +cross-spawn@^4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" -diff@3.5.0, diff@^3.1.0, diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" +debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: - arrify "^1.0.1" - path-type "^3.0.0" + ms "2.0.0" -doctrine@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - esutils "^1.1.6" - isarray "0.0.1" + ms "^2.1.1" -dom-converter@~0.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: - utila "~0.3" + ms "^2.1.1" -dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" +debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" + ms "2.1.2" -domain-browser@^1.1.1: +decamelize@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -domelementtype@1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -domhandler@2.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" - dependencies: - domelementtype "1" +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -domutils@1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== dependencies: - domelementtype "1" + strip-bom "^4.0.0" -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - dom-serializer "0" - domelementtype "1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - once "^1.4.0" + path-type "^4.0.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -entities@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + esutils "^2.0.2" -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - prr "~1.0.1" + esutils "^2.0.2" -error-ex@^1.2.0, error-ex@^1.3.1: +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.4.147: + version "1.4.148" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.148.tgz#437430e03c58ccd1d05701f66980afe54d2253ec" + integrity sha512-8MJk1bcQUAYkuvCyWZxaldiwoDG0E0AMzBGA6cv3WfuvJySiPgfidEPBFCRRH3cZm6SVZwo/oRlK1ehi1QNEIQ== + +electron-to-chromium@^1.4.535: + version "1.4.580" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.580.tgz#2f8f70f70733a6be1fb6f31de1224e6dc4bb196d" + integrity sha512-T5q3pjQon853xxxHUq3ZP68ZpvJHuSMY2+BZaW3QzjS4HvNuvsMmZ/+lU+nCrftre1jFZ+OSlExynXWBihnXzw== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== dependencies: - es-to-primitive "^1.1.1" + call-bind "^1.0.2" + es-to-primitive "^1.2.1" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== -eslint-scope@^4.0.0: +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - esrecurse "^4.1.0" + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + dependencies: + debug "^3.2.7" + find-up "^2.1.0" + +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + dependencies: + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" + has "^1.0.3" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jsdoc@^39.3.2: + version "39.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.2.tgz#b9c3becdbd860a75b8bd07bd04a0eaaad7c79403" + integrity sha512-RSGN94RYzIJS/WfW3l6cXzRLfJWxvJgNQZ4w0WCaxJWDJMigtwTsILEAfKqmmPkT2rwMH/s3C7G5ChDE6cwPJg== + dependencies: + "@es-joy/jsdoccomment" "~0.31.0" + comment-parser "1.3.1" + debug "^4.3.4" + escape-string-regexp "^4.0.0" + esquery "^1.4.0" + semver "^7.3.7" + spdx-expression-parse "^3.0.1" + +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" estraverse "^4.1.1" +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.17.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" + integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== + dependencies: + "@eslint/eslintrc" "^1.3.0" + "@humanwhocodes/config-array" "^0.9.2" + 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.3.2" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.15.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + 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" + v8-compile-cache "^2.0.3" + +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: - estraverse "^4.1.0" + estraverse "^5.1.0" -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + 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" + +execa@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== + dependencies: + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: - assign-symbols "^1.0.0" - is-extendable "^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" -external-editor@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.0.tgz#dc35c48c6f98a30ca27a20e9687d7f3c77704bb6" - dependencies: - chardet "^0.5.0" - iconv-lite "^0.4.22" - tmp "^0.0.33" +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: - escape-string-regexp "^1.0.5" + reusify "^1.0.4" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + bser "2.1.1" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" + flat-cache "^3.0.4" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" + to-regex-range "^5.0.1" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" +find-cache-dir@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" + locate-path "^5.0.0" + path-exists "^4.0.0" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" +flatted@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -foreground-child@^1.5.3, foreground-child@^1.5.6: +foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" dependencies: cross-spawn "^4" signal-exit "^3.0.0" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: - minipass "^2.2.1" + cross-spawn "^7.0.0" + signal-exit "^3.0.2" -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +furi@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/furi/-/furi-1.3.0.tgz#5fd4186d805ae80a3acd29efaf954761003391f8" + integrity sha512-TYoXEeRLKHXNWcCBP0VH1psPktQ9G8Y0GfZwMXCvwVbhbfNx7JItKWhB5mMBYufNjqxEHq+Ivd1nLtr5vQyVoQ== dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" + "@types/is-windows" "^0.2.0" + is-windows "^1.0.2" -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" +get-stream@^6.0.0, get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.2, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -global-modules-path@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" - globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" -globby@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" +globals@^13.15.0: + version "13.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + type-fest "^0.20.2" -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - -handlebars@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - dependencies: - async "^1.4.0" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + +graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +handlebars@^4.1.2: + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== + dependencies: + neo-async "^2.6.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" + uglify-js "^3.1.4" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-value@^1.0.0: +has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" + get-intrinsic "^1.1.1" -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-values@^1.0.0: +has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + has-symbols "^1.0.2" -has@^1.0.1: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@1.1.1, he@1.1.x: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" + is-stream "^2.0.0" + type-fest "^0.8.0" hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" -html-minifier@^3.2.3: - version "3.5.19" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.19.tgz#ed53c4b7326fe507bc3a1adbcc3bbb56660a2ebd" - dependencies: - camel-case "3.0.x" - clean-css "4.1.x" - commander "2.16.x" - he "1.1.x" - param-case "2.1.x" - relateurl "0.2.x" - uglify-js "3.4.x" - -html-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" - dependencies: - html-minifier "^3.2.3" - loader-utils "^0.2.16" - lodash "^4.17.3" - pretty-error "^2.0.2" - tapable "^1.0.0" - toposort "^1.0.0" - util.promisify "1.0.0" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -htmlparser2@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" - dependencies: - domelementtype "1" - domhandler "2.1" - domutils "1.1" - readable-stream "1.0" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" +human-signals@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== -husky@^1.0.0-rc.13: - version "1.0.0-rc.13" - resolved "https://registry.yarnpkg.com/husky/-/husky-1.0.0-rc.13.tgz#49c3cc210bfeac24d4ad272f770b7505c9091828" - dependencies: - cosmiconfig "^5.0.2" - execa "^0.9.0" - find-up "^3.0.0" - get-stdin "^6.0.0" - is-ci "^1.1.0" - pkg-dir "^3.0.0" - please-upgrade-node "^3.1.1" - read-pkg "^4.0.1" - run-node "^1.0.0" - slash "^2.0.0" +husky@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" + integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw== -iconv-lite@^0.4.22, iconv-lite@^0.4.4: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.11, ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + safer-buffer ">= 2.1.2 < 3.0.0" -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: - minimatch "^3.0.4" + parent-module "^1.0.0" + resolve-from "^4.0.0" -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.0.0.tgz#e8c20303ddc15bbfc2c12a6213710ccd9e1413d8" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -interpret@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - -invariant@^2.2.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== dependencies: - kind-of "^3.0.2" + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: - binary-extensions "^1.0.0" + has-bigints "^1.0.1" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-builtin-module@^1.0.0: version "1.0.0" @@ -1772,298 +2754,772 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - -is-ci@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - dependencies: - ci-info "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: - kind-of "^6.0.0" + has "^1.0.3" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0: +is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: - has "^1.0.1" + call-bind "^1.0.2" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - -istanbul-lib-coverage@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== -istanbul-lib-hook@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" - dependencies: - append-transform "^0.4.0" +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^2.1.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.2.tgz#b287cbae2b5f65f3567b05e2e29b275eaf92d25e" +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: - "@babel/generator" "7.0.0-beta.51" - "@babel/parser" "7.0.0-beta.51" - "@babel/template" "7.0.0-beta.51" - "@babel/traverse" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" - istanbul-lib-coverage "^2.0.1" - semver "^5.5.0" + append-transform "^2.0.0" -istanbul-lib-report@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz#2df12188c0fa77990c0d2176d2d0ba3394188259" +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@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" + +istanbul-lib-instrument@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" + integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== dependencies: - istanbul-lib-coverage "^1.1.2" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" - -istanbul-lib-source-maps@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" + 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@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" -istanbul-reports@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.0.tgz#c6c2867fa65f59eb7dcedb7f845dfc76aaee70f9" +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: - handlebars "^4.0.11" - -jquery@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" -"js-tokens@^3.0.0 || ^4.0.0": +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + +istanbul-reports@^3.0.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.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.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@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.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@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.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@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/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + natural-compare "^1.4.0" + pretty-format "^29.7.0" + semver "^7.5.3" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.7.0, js-yaml@^3.9.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdoc-type-pratt-parser@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz#a4a56bdc6e82e5865ffd9febc5b1a227ff28e67e" + integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw== + jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: - is-buffer "^1.1.5" + minimist "^1.2.0" -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" + prelude-ls "^1.2.1" + type-check "~0.4.0" -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" +lilconfig@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== -loader-utils@^0.2.16: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.0.1.tgz#899e78065ab29b88fdd922482411121664ef66be" + integrity sha512-Ykaf4QTi0a02BF7cnq7JIPGOJxH4TkNMWhSlJdH9wOekd0X+gog47Jfh/0L31DqZe5AiydLGC7LkPqpaNm+Kvg== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.17" + commander "^9.3.0" + debug "^4.3.4" + execa "^6.1.0" + lilconfig "2.0.5" + listr2 "^4.0.5" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-inspect "^1.12.2" + pidtree "^0.6.0" + string-argv "^0.3.1" + yaml "^2.1.1" + +listr2@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -2071,337 +3527,208 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - -lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.5, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" -lru-cache@^4.0.1, lru-cache@^4.1.1: +lru-cache@^4.0.1: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" -luxon@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.3.3.tgz#e66e8537a62c9b351ba69b766d7fb70b07ab5e57" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - pify "^3.0.0" - -make-error@^1.1.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + yallist "^3.0.2" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - object-visit "^1.0.0" + pify "^4.0.1" + semver "^5.6.0" -md5-hex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: - md5-o-matic "^0.1.1" + semver "^6.0.0" -md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" + tmpl "1.0.5" -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" +micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - source-map "^0.6.1" + braces "^3.0.2" + picomatch "^2.3.1" -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + mime-db "1.52.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -mockdate@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-2.0.2.tgz#5ae0c0eaf8fe23e009cd01f9889b42c4f634af12" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" +mockdate@*, mockdate@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/mockdate/-/mockdate-3.0.5.tgz#789be686deb3149e7df2b663d2bc4392bc3284fb" + integrity sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -needle@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: - lower-case "^1.1.1" + process-on-spawn "^1.0.0" -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== normalize-package-data@^2.3.2: version "2.4.0" @@ -2412,126 +3739,117 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - -npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: - boolbase "~1.0.0" + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -nyc@^12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-12.0.2.tgz#8a4a4ed690966c11ec587ff87eea0c12c974ba99" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: - archy "^1.0.0" - arrify "^1.0.1" - caching-transform "^1.0.0" - convert-source-map "^1.5.1" - debug-log "^1.0.1" - default-require-extensions "^1.0.0" - find-cache-dir "^0.1.1" - find-up "^2.1.0" - foreground-child "^1.5.3" - glob "^7.0.6" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.1.0" - istanbul-lib-instrument "^2.1.0" - istanbul-lib-report "^1.1.3" - istanbul-lib-source-maps "^1.2.5" - istanbul-reports "^1.4.1" - md5-hex "^1.2.0" - merge-source-map "^1.1.0" - micromatch "^3.1.10" - mkdirp "^0.5.0" - resolve-from "^2.0.0" - rimraf "^2.6.2" - signal-exit "^3.0.1" - spawn-wrap "^1.4.2" - test-exclude "^4.2.0" - yargs "11.1.0" - yargs-parser "^8.0.0" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + path-key "^3.0.0" -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + +nyc@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== + 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" -object-keys@^1.0.8: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" +object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: - isobject "^3.0.1" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: - mimic-fn "^1.0.0" + mimic-fn "^4.0.0" optimist@^0.6.1: version "0.6.1" @@ -2540,102 +3858,100 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + 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" -p-limit@^1.0.0, p-limit@^1.1.0: +p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== dependencies: p-try "^2.0.0" +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@2.1.x: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - dependencies: - no-case "^2.2.0" + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - error-ex "^1.2.0" + callsites "^3.0.0" parse-json@^4.0.0: version "4.0.0" @@ -2644,568 +3960,504 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: - pinkie-promise "^2.0.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" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - pinkie "^2.0.0" + find-up "^4.0.0" -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -pkg-dir@^1.0.0: +prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - find-up "^1.0.0" + fast-diff "^1.1.2" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" +prettier@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" + integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - find-up "^3.0.0" + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" -please-upgrade-node@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== dependencies: - semver-compare "^1.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + fromentries "^1.2.0" -pretty-error@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: - renderkid "^2.0.1" - utila "~0.4" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + kleur "^3.0.3" + sisteransi "^1.0.5" pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +pure-rand@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" + integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - dependencies: - safe-buffer "^5.1.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" + find-up "^3.0.0" + read-pkg "^3.0.0" -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: + load-json-file "^4.0.0" normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@1.0: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" + path-type "^3.0.0" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -relateurl@0.2.x: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + resolve "^1.9.0" -renderkid@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== dependencies: - css-select "^1.1.0" - dom-converter "~0.1" - htmlparser2 "~3.3.0" - strip-ansi "^3.0.0" - utila "~0.3" + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + dependencies: + es6-error "^4.0.1" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -resolve-cwd@^2.0.0: +require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - resolve-from "^3.0.0" + resolve-from "^5.0.0" -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.3.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" +resolve@^1.10.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16" + integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" +resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: - onetime "^2.0.0" + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" +rimraf@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b" + integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg== dependencies: - glob "^7.0.5" + glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" + glob "^7.1.3" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - is-promise "^2.1.0" - -run-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" + queue-microtask "^1.2.2" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" +rxjs@^7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: - aproba "^1.1.1" + tslib "^2.1.0" -rxjs@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - dependencies: - tslib "^1.9.0" +safe-buffer@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - -"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.5.0: +"semver@2 || 3 || 4 || 5": version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" +semver@^7.3.4, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" + lru-cache "^6.0.0" -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" +semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + lru-cache "^6.0.0" -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + kind-of "^6.0.2" -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - shebang-regex "^1.0.0" + shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - kind-of "^3.2.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" -source-map-loader@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271" - dependencies: - async "^2.5.0" - loader-utils "^1.1.0" +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" +source-map-loader@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" -source-map-support@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.8: - version "0.5.8" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.8.tgz#04f5581713a8a65612d0175fbf3a01f80a162613" +source-map-support@^0.5.16, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - dependencies: - amdefine ">=0.0.4" - source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -spawn-wrap@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: - foreground-child "^1.5.6" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.6.2" + 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 "^1.3.0" + which "^2.0.1" spdx-correct@^3.0.0: version "3.0.0" @@ -3225,430 +4477,416 @@ spdx-expression-parse@^3.0.0: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" +spdx-expression-parse@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: - safe-buffer "^5.1.1" + escape-string-regexp "^2.0.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" + char-regex "^1.0.2" + strip-ansi "^6.0.0" -stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^4.1.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: - ansi-regex "^2.0.0" + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-ansi@^4.0.0: +strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-bom@^2.0.0: +strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@5.4.0, supports-color@^5.3.0, supports-color@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - has-flag "^1.0.0" + has-flag "^4.0.0" -tapable@^1.0.0: +supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - -tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -test-exclude@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" - dependencies: - arrify "^1.0.1" - micromatch "^3.1.8" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" + integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.7.2" + +terser@^5.7.2: + version "5.14.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.0.tgz#eefeec9af5153f55798180ee2617f390bdd285e2" + integrity sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" -through@^2.3.6: +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - dependencies: - setimmediate "^1.0.4" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toposort@^1.0.0: - version "1.0.7" - resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -ts-loader@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.4.2.tgz#778d4464b24436873c78f7f9e914d88194c2a248" - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^3.1.4" - semver "^5.0.1" - -ts-node@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff" - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-jest@^29.1.1: + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== + dependencies: + 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.5.3" + yargs-parser "^21.0.1" + +ts-loader@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.0.tgz#980f4dbfb60e517179e15e10ed98e454b132159f" + integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-node@^10.8.1: + version "10.8.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" + integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== + dependencies: + "@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" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" -tslib@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.6" + strip-bom "^3.0.0" -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" -tslint-eslint-rules@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz#e488cc9181bf193fe5cd7bfca213a7695f1737b5" - dependencies: - doctrine "0.7.2" - tslib "1.9.0" - tsutils "^3.0.0" - -tslint@^5.11.0: - version "5.11.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" - dependencies: - babel-code-frame "^6.22.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^3.2.0" - glob "^7.1.1" - js-yaml "^3.7.0" - minimatch "^3.0.4" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.8.0" - tsutils "^2.27.2" +tslib@^2.1.0, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tsutils@^2.27.2: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" -tsutils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.0.0.tgz#0c5070a17a0503e056da038c48b5a1870a50a9ad" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + prelude-ls "^1.2.1" -type-detect@^4.0.0: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb" - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - dependencies: - commander "~2.13.0" - source-map "~0.6.1" +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -uglify-js@3.4.x: - version "3.4.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.6.tgz#bc546d53f3e02b05d97d0ca5a7abfe0fb0384ddb" - dependencies: - commander "~2.16.0" - source-map "~0.6.1" +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + is-typedarray "^1.0.0" -uglifyjs-webpack-plugin@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" +typescript@^4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" + integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" +uglify-js@^3.1.4: + version "3.7.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.2.tgz#cb1a601e67536e9ed094a92dd1e333459643d3f9" + integrity sha512-uhRwZcANNWVLrxLfNFEdltoPNhECUR3lc+UdJoG9CBpMcSnKyWA94tc3eAujB1GcMY5Uwq8ZMp4qWpxWYDQmaA== dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" + commander "~2.20.3" + source-map "~0.6.1" -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - unique-slug "^2.0.0" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" -unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - dependencies: - imurmurhash "^0.1.4" +unminified-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unminified-webpack-plugin/-/unminified-webpack-plugin-3.0.0.tgz#7b67a052cb8ea408334ff4301bc9526e28ce8797" + integrity sha512-XUUzicg2OMIrxYYJPfFBXU3wvmQL9SXDY+OCEHTB1FFoy6Im9vfFcO6tz29IUtGc8QdLvyqb0o7ua0YQ4P2+oQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + escalade "^3.1.1" + picocolors "^1.0.0" -uri-js@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" +v8-to-istanbul@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-3.2.6.tgz#42333fe6b2a9849b108ff781af6faa1a61390eac" + integrity sha512-M6zzkVjsr+6sFdWPCuq7fjg9oCOXlssin05Yhobt9jMqHlEhw8AQ4/ClDiLCVWzXjpS2ezik53mhgSivw0XwmQ== dependencies: - inherits "2.0.1" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" +v8-to-istanbul@^9.0.1: + version "9.1.3" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz#ea456604101cd18005ac2cae3cdd1aa058a6306b" + integrity sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg== dependencies: - inherits "2.0.3" - -utila@~0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - -v8-compile-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -3657,211 +4895,295 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - indexof "0.0.1" + makeerror "1.0.12" -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" +watchpack@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: - chokidar "^2.0.2" + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" - neo-async "^2.5.0" -webpack-cli@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994" - dependencies: - chalk "^2.4.1" - cross-spawn "^6.0.5" - enhanced-resolve "^4.0.0" - global-modules-path "^2.1.0" - import-local "^1.0.0" - inquirer "^6.0.0" - interpret "^1.1.0" - loader-utils "^1.1.0" - supports-color "^5.4.0" - v8-compile-cache "^2.0.0" - yargs "^12.0.1" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" +webpack-cli@^4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.73.0: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525" - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9, which@^1.3.0: +which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: - errno "~0.1.7" + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - graceful-fs "^4.1.11" imurmurhash "^0.1.4" - slide "^1.1.5" - -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" +yaml@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" + integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs-parser@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" +yargs-parser@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-14.0.0.tgz#42e25777b06718ec99eac2c3a98ad3de73b6818f" + integrity sha512-zn/Mnx+tbFjkCFUodEpjXckNS65NfpB5oyqOkDDEG/8uxlfLZJu2IoBLQFjukUkn9rBbGkVYNzrDh6qy4NUd3g== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" +yargs-parser@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08" + integrity sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs@11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^14.0.0: + version "14.2.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.2.tgz#2769564379009ff8597cdd38fba09da9b493c4b5" + integrity sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^3.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + y18n "^4.0.0" + yargs-parser "^15.0.0" -yargs@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: - cliui "^4.0.0" - decamelize "^2.0.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" + 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 "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^4.2.0" which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==