pax_global_header00006660000000000000000000000064147725417310014525gustar00rootroot0000000000000052 comment=93c85a384853a728184e5820d1a75e84383b1e82 moment-luxon-93c85a3/000077500000000000000000000000001477254173100145305ustar00rootroot00000000000000moment-luxon-93c85a3/.agignore000066400000000000000000000000311477254173100163160ustar00rootroot00000000000000/build package-lock.json moment-luxon-93c85a3/.babelrc000066400000000000000000000000571477254173100161250ustar00rootroot00000000000000{ "presets": [ "@babel/preset-env" ] } moment-luxon-93c85a3/.editorconfig000066400000000000000000000002751477254173100172110ustar00rootroot00000000000000root = true [*] charset = utf-8 indent_size = 2 end_of_line = lf indent_style = space insert_final_newline = false trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false moment-luxon-93c85a3/.gitattributes000066400000000000000000000001541477254173100174230ustar00rootroot00000000000000scripts/* linguist-vendored docker/* linguist-vendored site/** linguist-vendored .husky/* linguist-vendored moment-luxon-93c85a3/.github/000077500000000000000000000000001477254173100160705ustar00rootroot00000000000000moment-luxon-93c85a3/.github/ISSUE_TEMPLATE/000077500000000000000000000000001477254173100202535ustar00rootroot00000000000000moment-luxon-93c85a3/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000011271477254173100227460ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: "" labels: bug --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Please share a minimal code example that triggers the problem: **Actual vs Expected behavior** A clear and concise description of what you expected to happen. **Desktop (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. Chrome 84, safari 14.0] - Luxon version [e.g. 1.25.0] - Your timezone [e.g. "America/New_York"] **Additional context** Add any other context about the problem here. moment-luxon-93c85a3/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011151477254173100237760ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: "" labels: enhancement --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. moment-luxon-93c85a3/.github/workflows/000077500000000000000000000000001477254173100201255ustar00rootroot00000000000000moment-luxon-93c85a3/.github/workflows/test.yml000066400000000000000000000014151477254173100216300ustar00rootroot00000000000000name: Test on: push: branches: [master] pull_request: branches: [master] jobs: build-and-test: runs-on: ubuntu-latest env: LANG: en_US.utf8 LIMIT_JEST: yes TZ: America/New_York strategy: matrix: node-version: - 18.20.6 # latest 18.x - 20.18.3 # latest 20.x - 22.14.0 # latest 22.x steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: "npm" - run: npm ci - run: npm run build - run: npm run format-check - run: npm run test - run: npm run site - run: bash <(curl -s https://codecov.io/bash)moment-luxon-93c85a3/.gitignore000066400000000000000000000001651477254173100165220ustar00rootroot00000000000000node_modules .tern-port /build #* .#* coverage/ .DS_Store .external-ecmascript.js .idea .vscode test/scratch.test.js moment-luxon-93c85a3/.husky/000077500000000000000000000000001477254173100157515ustar00rootroot00000000000000moment-luxon-93c85a3/.husky/.gitignore000066400000000000000000000000021477254173100177310ustar00rootroot00000000000000_ moment-luxon-93c85a3/.husky/pre-commit000077500000000000000000000000721477254173100177520ustar00rootroot00000000000000#!/bin/sh . "$(dirname "$0")/_/husky.sh" npx lint-staged moment-luxon-93c85a3/.prettierrc000066400000000000000000000000261477254173100167120ustar00rootroot00000000000000{ "printWidth": 100 } moment-luxon-93c85a3/CHANGELOG.md000066400000000000000000000212501477254173100163410ustar00rootroot00000000000000# Changelog # 3.6.1 (2025-03-31) - Add Fallback for `minimalDays` being removed from Intl.WeekInfo - Fix various caches when JS keywords like "constructor" are used for names # 3.6.0 (2025-03-25) - Add `Interval.lastDateTime` - Fix a bug that could cause wrong timezone calculations when multiple timezones are in use # 3.5.0 (2024-08-03) - Various performance improvements - throwOnInvalid causes the constructor to throw if the year is invalid # 3.4.4 (2023-11-12) - Localized week support (#1454) - Added custom inspect for Node (#1526) - Fix sorting in `Interval.splitAt` (#1524) # 3.4.3 (2023-09-05) - Fixes another regression from 3.4.0 (#1496) # 3.4.2 (2023-08-26) - Fixes regression from 3.4.1 (#1493) # 3.4.1 (2023-08-23) - Fixes for regressions from 3.4.0 (#1482 and #1488) # 3.4.0 (2023-08-08) - Fix type checking on input zones - Fix Islamic months listing - Fix normalize() for negative inputs # 3.3.0 (2023-03-03) - Fix off-by-one in Interval#count (#1308) - Support formatting for custom zones (#1377) - Fix parsing for narrow spaces (#1369) - Handle leap year issue with AD 100 (#1390) - Allow parsing of just an offset # 3.2.1 (2023-01-04) - Fix for RFC-2822 regex vulnerability - Better handling of BCP tags with -x- extensions # 3.2.0 (2022-12-29) - Allow timeZone to be specified as an intl option - Fix for diff's handling of end-of-month when crossing leap years (#1340) - Add Interval.toLocaleString() (#1320) # 3.1.1 (2022-11-28) - Add Settings.twoDigitCutoffYear # 3.1.0 (2022-10-31) - Add Duration.rescale # 3.0.4 (2022-09-24) - Fix quarters in diffs (#1279) - Export package.json in package (#1239) # 3.0.2 (2022-08-28) - Lots of doc changes - Added DateTime.expandFormat - Added support for custom conversion matrices in Durations # 3.0.1 (2022-07-09) - Add DateTime.parseFormatForOpts # 3.0.0 (2022-07-09) - Add "default" as an option for specifying a zone, and change "system" to really mean the system zone (breaking change) # 2.5.0 (2022-07-09) - Support for ESM-style node imports - Fix Wednesday parsing for RFC 850 strings - Increase number of digits allowed in ISO durations ## 2.4.0 (2022-05-08) - Add support for parsing the ISO zone extension, like `2022-05-08T20:42:00.000-04:00[America/New_York]` - Add an `extendedZone` option to `toISO()` and `toISOTime` - Improvements to `DateTime.isInDST()` - Fix for parsing in Vietnames (and probably other languages) ## 2.3.2 (2022-04-17) - Fix timezone calculations for negative years - add week formatting token "w" for durations - fix weekday computation for years 0-100 ## 2.3.1 (2022-02-23) - Added an `includeOffsetSpace` option to `toSQL` and `toSQLTime` - Added `toUnixInteger` - Don't use `-0` when negating durations with zeros in them ## 2.3.0 (2022-01-02) - Major perf improvements to `toISO()`, `toISODate()`, `toISOTime()`, and `toSQLDate()` - Fixed date padding for negative years in `toISO()` - Added Duration#toHuman() ## 2.2.0 (2021-12-10) - Allow offsets to pick among ambiguous times when both an offset and zone are provided to `fromFormat` - Fix a floating point bug in `Duration.shiftTo()` ## 2.1.1 (2021-11-08) - Fix issue in quirky environments that lack `hourCycle` support and sometimes computed offsets 12 hours off ## 2.1.0 (2021-11-07) - Stop special casing of `Etc/GMT*` zones - export fromDurationLike - memoize zone validation - Support for fractional elements in duration ISO parsing - Added `uu` and `uuu` tokens for fractional millisecond parsing ## 2.0.2 (2021-08-08) Fix locale defaulting ## 2.0.0 (2021-07-3) See [Upgrading section](https://moment.github.io/luxon/#/upgrading?id=_1x-to-20) ## 1.28.0 (2021-07-03) - Fix ISO parsing for offset specifiers in Year-Ordinal formats ## 1.27.0 (2021-05-08) - Fix GMT zone parsing for older versions of Node - Support multiple units in `toRelative` - Various documentation updates ## 1.26.0 (2021-02-13) - Add fromISOTime, toISOTime and toMillis to Duration (#803) - Fix padding of negative years in IsoDate (#871) - Fix hasSame unit comparison (#798) - Export VERSION information (#794) - Durations are considered equal with extra zero units. Fixes #809 (#811) ## 1.25.0 (2020-08-23) - fix fromFormat with Intl formats containing non-breaking spaces - Support higher precision in ISO milliseconds - Some fixes for 00:30 timezones - Fix some throwOnInvalid for invalid Intervals - Various doc fixes - Fix Interval#isSame for empty intervals - Mark package as side effect-free - Add support for intervals with a large number of seconds ## 1.24.1 (2020-05-04) - Remove erroneous `console.log` call ## 1.24.0 (2020-05-03) - Update polyfills for pollyfilled build ## 1.23.0 (2020-04-02) - Allow minus sign prefix when creating Duration from ISO ## 1.22.2 (2020-03-25) - Added more details to error messages for type errors ## 1.22.1 (2020-03-19) - Added support for ISO basic format to DateTime#toISO ## 1.22.0 (2020-01-26) - Fix setZone's handling of pre-1970 dates with millisecond components - Fix keepLocalTime for large jumps near the target zone's DST - Fix cache perf for toRelative() ## 1.21.3 (2019-11-28) - Fix parsing of meridiems in macro tokens in newer versions of v8 ## 1.21.2 (2019-11-18) - Fix bug in Chrome Canary that threw off time zone calculations ## 1.21.1 (2019-11-03) - Fix for quarter parsing - Some documentation updates ## 1.21.0 (2019-10-30) - Added quarter support to the parser - Fix some rounding issues in ISO formatting ## 1.20.0 (2019-10-29) - Added Duration#mapUnits - added Interval#toISODate and Interval#toISOTime - Some documentation fixes ## 1.19.3 - Cache offset values - Fix handling of negative sub 1-hour offsets ## 1.19.2 - Speculative fix for Node 6 ## 1.19.1 - Fix Intl.DateTimeFormat usage for polyfills ## 1.19.0 - Interval#splitAt now ignores input dates outside the interval - Don't allow decimals in DateTime creation ## 1.18.2 - Fix handling of decimals in DateTime#plus and #minus ## 1.18.1 - Fix validity when adding or subtracting time that exceeds Date max/min boundaries ## 1.18.0 - Add support for macro tokens in the parser ## 1.17.2 - Fix issue with `toRelative` using `style: short` with plural days ## 1.17.1 - Reject out-of-range numbers in DateTime.fromMillis - Reject 0s in ISO date inputs ## 1.17.0 - DateTime.min and DateTime.max throw if they get the wrong kind of arguments - Fixed throwOnInvalid logic for Interval - Added `DATETIME_MED_WITH_WEEKDAY` preset ## 1.16.1 - Catch errors trying to use Intl in weird versions of IE 11 ## 1.16.0 - Fixed locale default logic for `DateTime#toFormat("ZZZZ") ## 1.15.0 - Added `formatOffset` to Zones ## 1.14.0 - Allow the zone argument to Interval.fromISO with duration components - Ignore the zone argument to Duration factory methods ## 1.13.3 - Fix keepLocalTime calculations that span offset changes ## 1.13.2 - Fixed ISO formatting for dates > 999 ## 1.13.1 - Performance improvements for regex parsing ## 1.13.0 - Support numberSystem in fromFormat - Fix validity for bad initial zone specifiers ## 1.12.1 - Fix cross-month diffs in some scenarios - Fix time zone parsing when the time zone isn't at the end - Memoize IANA zone creation ## 1.12.0 - Add some explicit CDN support to the NPM package - Add week token to duration ISO support - Lots of cleanup and test coverage changes ## 1.11.4 - `setZone("local")` now returns the defaultZone if it is set - Fixes for the polyfilled build ## 1.11.3 - Allow 24:00 in ISO (and other) strings - Fix some bugs with the typecheck functions like `DateTime.isDateTime()` ## 1.11.2 - Fixed handling of some characters in fromFormat literal sections - Handle string values in object arguments to DateTime methods - Fixed toRelativeCalendar's handling of zones in the base date ## 1.11.1 - Fix DateTime#plus() when spanning across AD 100 ## 1.11.0 - Fix low-year handling for IANA zones - `DateTime#toLocal()` now uses the default locale - Fix zero duration formatting - Many documentation fixes ## 1.10.0 - Fix endOf("day") during DSTs (#399) - Add `Interval#mapEndpoints (#400) - Add `DateTime#zone` and `Info.normalizeZone` (#404) ## 1.9.0 - Add `DateTime#toRelative` and `DateTime#toRelativeCalendar` ## 1.8.3 - Allow "UTC" in the zone position of `fromSQL` - Force `isDateTime` and `isDuration` to return booleans in all cases ## 1.8.2 - Trim leading \u200e characters from offset names in Edge 16 and 17 ## 1.8.1 - Add `DateTime.fromSeconds` and `DateTime#toSeconds` ## 1.7.1 - Floor the seconds instead of rounding them when outputting the 'X' format - Change the options to toLocale to override the configuration (the previous options were essentially ignored) ## 1.6.2 - Fixing merge error that resulted in bad error messages ## 1.6.0 - **midly breaking** Rework negative durations - Fix handling moment-luxon-93c85a3/CONTRIBUTING.md000066400000000000000000000120161477254173100167610ustar00rootroot00000000000000# Contributing to Luxon ## General guidelines Patches are welcome. Luxon is at this point just a baby and it could use lots of help. But before you dive in...Luxon is one of those tightly-scoped libraries where the default answer to "should this library do X?" is likely "no". **So ask first!** It might save you some time and energy. Here are some vague notes on Luxon's design philosophy: 1. We won't accept patches that can't be internationalized using the JS environment's (e.g. the browser's) native capabilities. This means that most convenient humanization features are out of scope. 1. We try hard to have a clear definition of what Luxon does and doesn't do. With few exceptions, this is not a "do what I mean" library. 1. Luxon shouldn't contain simple conveniences that bloat the library to save callers a couple lines of code. Write those lines in your own code. 1. Most of the complexity of JS module loading compatibility is left to the build. If you have a "this can't be loaded in my bespoke JS module loader" problems, this isn't something you should be solving with changes to the `src` directory. If it's a common use case and is possible to generate with Rollup, it can get its own build command. 1. We prefer documentation clarifications and gotchas to go in the docstrings, not in the guides on the docs page. Obviously, if the guides are wrong, they should be fixed, but we don't want them to turn into troubleshooting pages. On the other hand, making sure the method-level documentation has ample examples and notes is great. 1. You'll need to sign a CLA as part of your first pull request to Luxon. ## Building and testing Building and testing is done through npm scripts. The tests run in Node and require Node 18 with full-icu support. This is because some of the features available in Luxon (like internationalization and time zones) need that stuff and we test it all. On any platform, if you have Node 18 installed with full-icu, you're good to go; just run `scripts/test`. But you probably don't have that, so read on. ### OSX Mac is easy: Open the terminal. ``` brew install node --with-full-icu npm install ./scripts/test ``` If that's for whatever reason a pain, the Linux instructions should also work, as well as the Docker ones. ### Linux There are two ways to get full-icu support in Linux: build it with that support, or provide it as a module. We'll cover the latter. Assuming you've installed Node 10: ``` npm install npm install full-icu ./scripts/test ``` Where `scripts/test` is just `NODE_ICU_DATA="$(pwd)/node_modules/full-icu" npm run test`, which is required for making Node load the full-icu module you just installed. You can run all the other npm scripts (e.g. `npm run docs`) directly; they don't require Intl support. ### Windows If you have [Bash](https://git-scm.com/downloads) or [WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10), the Linux instructions seem to work fine. I would love to add instructions for a non-WSL install of the dev env! ### Docker In case messing with your Node environment just to run Luxon's tests is too much to ask, we've provided a Docker container. You'll need a functioning Docker environment, but the rest is easy: ``` ./docker/npm install --ignore-scripts ./docker/npm test ``` ## Patch basics Once you're sure your bugfix or feature makes sense for Luxon, make sure you take these steps: 1. Be sure to add tests and run them with `scripts/test` 1. Be sure you run `npm run format` before you commit. Note this will modify your source files to line up with the style guidelines. 1. Make sure you add or ESDoc annotations appropriately. You can run `npm run docs` to generate the HTML for them. They land in the `build/docs` directory. This also builds the markdown files in `/docs` into the guide on the Luxon website. 1. To test Luxon in your browser, run `npm run site` and then open `build/demo/global.html`. You can access Luxon classes in the console like `window.luxon.DateTime`. 1. To test in Node, run `npm run build` and then run something like `var DateTime = require('./build/cjs-browser/luxon').DateTime`. Luxon uses [Husky](https://github.com/typicode/husky) to run the formatter on your code as a pre-commit hook. You should still run `npm run format` yourself to catch other issues, but this hook will help prevent you from failing the build with a trivial formatting error. ## npm script reference | Command | Function | | ---------------------------- | --------------------------------------- | | `npm run build` | Build all the distributable files | | `npm run build-node` | Build just for Node | | `npm run test` | Run the test suite, but see notes above | | `npm run format` | Run the Prettier formatter | | `npm run site` | Build the Luxon website, including docs | | `npm run check-doc-coverage` | Check whether there's full doc coverage | | `npm run benchmark` | Run performance benchmarks | moment-luxon-93c85a3/LICENSE.md000066400000000000000000000020641477254173100161360ustar00rootroot00000000000000Copyright 2019 JS Foundation and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. moment-luxon-93c85a3/README.md000066400000000000000000000040041477254173100160050ustar00rootroot00000000000000# Luxon [![MIT License][license-image]][license] [![Build Status][github-action-image]][github-action-url] [![NPM version][npm-version-image]][npm-url] [![Coverage Status][test-coverage-image]][test-coverage-url] [![PRs welcome][contributing-image]][contributing-url] Luxon is a library for working with dates and times in JavaScript. ```js DateTime.now().setZone("America/New_York").minus({ weeks: 1 }).endOf("day").toISO(); ``` ## Upgrading to 3.0 [Guide](https://moment.github.io/luxon/#upgrading) ## Features * DateTime, Duration, and Interval types. * Immutable, chainable, unambiguous API. * Parsing and formatting for common and custom formats. * Native time zone and Intl support (no locale or tz files). ## Download/install [Download/install instructions](https://moment.github.io/luxon/#/install) ## Documentation * [General documentation](https://moment.github.io/luxon/#/?id=luxon) * [API docs](https://moment.github.io/luxon/api-docs/index.html) * [Quick tour](https://moment.github.io/luxon/#/tour) * [For Moment users](https://moment.github.io/luxon/#/moment) * [Why does Luxon exist?](https://moment.github.io/luxon/#/why) * [A quick demo](https://moment.github.io/luxon/demo/global.html) ## Development See [contributing](CONTRIBUTING.md). ![Phasers to stun][phasers-image] [license-image]: https://img.shields.io/badge/license-MIT-blue.svg [license]: LICENSE.md [github-action-image]: https://github.com/moment/luxon/actions/workflows/test.yml/badge.svg [github-action-url]: https://github.com/moment/luxon/actions/workflows/test.yml [npm-url]: https://npmjs.org/package/luxon [npm-version-image]: https://badge.fury.io/js/luxon.svg [test-coverage-url]: https://codecov.io/gh/moment/luxon [test-coverage-image]: https://codecov.io/gh/moment/luxon/branch/master/graph/badge.svg [contributing-url]: https://github.com/moment/luxon/blob/master/CONTRIBUTING.md [contributing-image]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg [phasers-image]: https://img.shields.io/badge/phasers-stun-brightgreen.svg moment-luxon-93c85a3/babel.config.js000066400000000000000000000000651477254173100174000ustar00rootroot00000000000000module.exports = { presets: ["@babel/preset-env"] }; moment-luxon-93c85a3/benchmarks/000077500000000000000000000000001477254173100166455ustar00rootroot00000000000000moment-luxon-93c85a3/benchmarks/datetime.js000066400000000000000000000061171477254173100210040ustar00rootroot00000000000000import Benchmark from "benchmark"; import DateTime from "../src/datetime.js"; import Settings from "../src/settings.js"; function runDateTimeSuite() { return new Promise((resolve, reject) => { const suite = new Benchmark.Suite(); const dt = DateTime.now(); const formatParser = DateTime.buildFormatParser("yyyy/MM/dd HH:mm:ss.SSS"); suite .add("DateTime.now", () => { DateTime.now(); }) .add("DateTime.fromObject with locale", () => { DateTime.fromObject({}, { locale: "fr" }); }) .add("DateTime.local with numbers", () => { DateTime.local(2017, 5, 15); }) .add("DateTime.local with numbers and zone", () => { DateTime.local(2017, 5, 15, 11, 7, 35, { zone: "America/New_York" }); }) .add("DateTime.fromISO", () => { DateTime.fromISO("1982-05-25T09:10:11.445Z"); }) .add("DateTime.fromSQL", () => { DateTime.fromSQL("2016-05-14 10:23:54.2346"); }) .add("DateTime.fromFormat", () => { DateTime.fromFormat("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS"); }) .add("DateTime.fromFormat with zone", () => { DateTime.fromFormat("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS", { zone: "America/Los_Angeles", }); }) .add("DateTime.fromFormatParser", () => { DateTime.fromFormatParser("1982/05/25 09:10:11.445", formatParser); }) .add("DateTime.fromFormatParser with zone", () => { DateTime.fromFormatParser("1982/05/25 09:10:11.445", formatParser, { zone: "America/Los_Angeles", }); }) .add("DateTime#setZone", () => { dt.setZone("America/Los_Angeles"); }) .add("DateTime#toFormat", () => { dt.toFormat("yyyy-MM-dd"); }) .add("DateTime#toFormat with macro", () => { dt.toFormat("T"); }) .add("DateTime#toFormat with macro no cache", () => { dt.toFormat("T"); Settings.resetCaches(); }) .add("DateTime#format in german", () => { dt.setLocale("de-De").toFormat("d. LLL. HH:mm"); }) .add("DateTime#format in german and no-cache", () => { dt.setLocale("de-De").toFormat("d. LLL. HH:mm"); Settings.resetCaches(); }) .add("DateTime#add", () => { dt.plus({ milliseconds: 3434 }); }) .add("DateTime#toISO", () => { dt.toISO(); }) .add("DateTime#toLocaleString", () => { dt.toLocaleString(); }) .add("DateTime#toLocaleString in utc", () => { dt.toUTC().toLocaleString(); }) .add("DateTime#toRelativeCalendar", () => { dt.toRelativeCalendar({ base: DateTime.now(), locale: "fi" }); }) .on("cycle", (event) => { console.log(String(event.target)); }) .on("complete", function () { console.log("Fastest is " + this.filter("fastest").map("name")); resolve(); }) .on("error", function () { reject(this.error); }) .run(); }); } const allSuites = [runDateTimeSuite]; export default allSuites; moment-luxon-93c85a3/benchmarks/index.js000066400000000000000000000003731477254173100203150ustar00rootroot00000000000000import dateTimeSuites from "./datetime.js"; import infoSuites from "./info.js"; const allSuites = [...dateTimeSuites, ...infoSuites]; async function runAllSuites() { for (const runSuite of allSuites) { await runSuite(); } } runAllSuites(); moment-luxon-93c85a3/benchmarks/info.js000066400000000000000000000055511477254173100201440ustar00rootroot00000000000000import Benchmark from "benchmark"; import Info from "../src/info.js"; import Locale from "../src/impl/locale.js"; function runWeekdaysSuite() { return new Promise((resolve, reject) => { const locale = Locale.create(null, null, null); new Benchmark.Suite() .add("Info.weekdays with existing locale", () => { Info.weekdays("long", { locObj: locale }); }) .add("Info.weekdays", () => { Info.weekdays("long"); }) .on("cycle", (event) => { console.log(String(event.target)); }) .on("complete", function () { console.log("Fastest is " + this.filter("fastest").map("name")); resolve(); }) .on("error", function () { reject(this.error); }) .run(); }); } function runWeekdaysFormatSuite() { return new Promise((resolve, reject) => { const locale = Locale.create(null, null, null); new Benchmark.Suite() .add("Info.weekdaysFormat with existing locale", () => { Info.weekdaysFormat("long", { locObj: locale }); }) .add("Info.weekdaysFormat", () => { Info.weekdaysFormat("long"); }) .on("cycle", (event) => { console.log(String(event.target)); }) .on("complete", function () { console.log("Fastest is " + this.filter("fastest").map("name")); resolve(); }) .on("error", function () { reject(this.error); }) .run(); }); } function runMonthsSuite() { return new Promise((resolve, reject) => { const locale = Locale.create(null, null, null); new Benchmark.Suite() .add("Info.months with existing locale", () => { Info.months("long", { locObj: locale }); }) .add("Info.months", () => { Info.months("long"); }) .on("cycle", (event) => { console.log(String(event.target)); }) .on("complete", function () { console.log("Fastest is " + this.filter("fastest").map("name")); resolve(); }) .on("error", function () { reject(this.error); }) .run(); }); } function runMonthsFormatSuite() { return new Promise((resolve, reject) => { const locale = Locale.create(null, null, null); new Benchmark.Suite() .add("Info.monthsFormat with existing locale", () => { Info.monthsFormat("long", { locObj: locale }); }) .add("Info.monthsFormat", () => { Info.monthsFormat("long"); }) .on("cycle", (event) => { console.log(String(event.target)); }) .on("complete", function () { console.log("Fastest is " + this.filter("fastest").map("name")); resolve(); }) .on("error", function () { reject(this.error); }) .run(); }); } const allSuites = [runMonthsSuite, runMonthsFormatSuite, runWeekdaysSuite, runWeekdaysFormatSuite]; export default allSuites; moment-luxon-93c85a3/benchmarks/package.json000066400000000000000000000000271477254173100211320ustar00rootroot00000000000000{ "type": "module" } moment-luxon-93c85a3/codecov.yml000066400000000000000000000001771477254173100167020ustar00rootroot00000000000000comment: false coverage: status: project: default: target: auto threshold: null base: auto moment-luxon-93c85a3/docker/000077500000000000000000000000001477254173100157775ustar00rootroot00000000000000moment-luxon-93c85a3/docker/Dockerfile000066400000000000000000000001771477254173100177760ustar00rootroot00000000000000FROM library/node:15-slim ENV HUSKY_SKIP_INSTALL=1 ENV LANG=en_US.utf8 ENV LIMIT_JEST=yes ENV CI=yes ENV TZ=America/New_York moment-luxon-93c85a3/docker/build000077500000000000000000000000721477254173100170230ustar00rootroot00000000000000#!/usr/bin/env bash docker build docker -t icambron/luxon moment-luxon-93c85a3/docker/npm000077500000000000000000000001311477254173100165120ustar00rootroot00000000000000#!/usr/bin/env bash docker run -it --rm -v $(pwd):/luxon -w /luxon icambron/luxon npm $@ moment-luxon-93c85a3/docker/push000077500000000000000000000000571477254173100167060ustar00rootroot00000000000000#!/usr/bin/env bash docker push icambron/luxon moment-luxon-93c85a3/docker/readme.md000066400000000000000000000004161477254173100175570ustar00rootroot00000000000000Luxon provides a Docker container and some wrapping scripts to make it easier to run the tests. 1. The Dockerfile is really just here as an FYI. You shouldn't need to interact with it 1. `npm` is a bash script that runs `npm run [arg]` inside the Docker container. moment-luxon-93c85a3/docs/000077500000000000000000000000001477254173100154605ustar00rootroot00000000000000moment-luxon-93c85a3/docs/calendars.md000066400000000000000000000064001477254173100177360ustar00rootroot00000000000000# Calendars This covers Luxon's support for various calendar systems. If you don't need to use non-standard calendars, you don't need to read any of this. ## Fully supported calendars Luxon has full support for Gregorian and ISO Week calendars. What I mean by that is that Luxon can parse dates specified in those calendars, format dates into strings using those calendars, and transform dates using the units of those calendars. For example, here is Luxon working directly with an ISO calendar: ```js DateTime.fromISO('2017-W23-3').plus({ weeks: 1, days: 2 }).toISOWeekDate(); //=> '2017-W24-5' ``` The main reason I bring all this is up is to contrast it with the capabilities for other calendars described below. ## Output calendars Luxon has limited support for other calendaring systems. Which calendars are supported at all is a platform-dependent, but can generally be expected to be these: Buddhist, Chinese, Coptic, Ethioaa, Ethiopic, Hebrew, Indian, Islamic, Islamicc, Japanese, Persian, and ROC. **Support is limited to formatting strings with them**, hence the qualified name "output calendar". In practice this is pretty useful; you can show users the date in their preferred calendaring system while the software works with dates using Gregorian units or Epoch milliseconds. But the limitations are real enough; Luxon doesn't know how to do things like "add one Islamic month". The output calendar is a property of the DateTime itself. For example: ```js var dtHebrew = DateTime.now().reconfigure({ outputCalendar: "hebrew" }); dtHebrew.outputCalendar; //=> 'hebrew' dtHebrew.toLocaleString() //=> '4 Tishri 5778' ``` You can modulate the structure of that string with arguments to `toLocaleString` (see [the docs on that](formatting.md?id=tolocalestring-strings-for-humans)), but the point here is just that you got the alternative calendar. ### Generally supported calendars Here's a table of the different calendars with examples generated formatting the same date generated like this: ```js DateTime.fromObject({ outputCalendar: c }).toLocaleString(DateTime.DATE_FULL); ``` Since Luxon uses the browser's **Intl API**, you can use all the supported calendars. (See [Intl.Locale.prototype.getCalendars()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getCalendars) for a full list) | Calendar | Example | | ------------------ | ------------------------ | | buddhist | September 24, 2560 BE | | chinese | Eighth Month 5, 2017 | | coptic | Tout 14, 1734 ERA1 | | ethioaa | Meskerem 14, 7510 ERA0 | | ethiopic | Meskerem 14, 2010 ERA1 | | hebrew | 4 Tishri 5778 | | indian | Asvina 2, 1939 Saka | | islamic | Muharram 4, 1439 AH | | islamic-civil | Muharram 3, 1439 AH | | islamic-umalqura | Muharram 3, 1439 AH | | iso8601 | September 24, 2017 | | japanese | September 24, 29 Heisei | | persian | Mehr 2, 1396 AP | | roc | September 24, 106 Minguo | ### Default output calendar You can set the default output calendar for new DateTime instances like this: ```js Settings.defaultOutputCalendar = 'persian'; ``` moment-luxon-93c85a3/docs/formatting.md000066400000000000000000000554261477254173100201700ustar00rootroot00000000000000# Formatting This section covers creating strings to represent a DateTime. There are three types of formatting capabilities: 1. Technical formats like ISO 8601 and RFC 2822 2. Internationalizable human-readable formats 3. Token-based formatting ## Technical formats (strings for computers) ### ISO 8601 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) is the most widely used set of string formats for dates and times. Luxon can _parse_ a wide range of them, but provides direct support for formatting only a few of them: ```js dt.toISO(); //=> '2017-04-20T11:32:00.000-04:00' dt.toISODate(); //=> '2017-04-20' dt.toISOWeekDate(); //=> '2017-W17-7' dt.toISOTime(); //=> '11:32:00.000-04:00' ``` Generally, you'll want the first one. Use it by default when building or interacting with APIs, communicating times over a wire, etc. ### HTTP and RFC 2822 There are a number of legacy standard date and time formats out there, and Luxon supports some of them. You shouldn't use them unless you have a specific reason to. ```js dt.toRFC2822(); //=> 'Thu, 20 Apr 2017 11:32:00 -0400' dt.toHTTP(); //=> 'Thu, 20 Apr 2017 03:32:00 GMT' ``` ### Unix timestamps DateTime objects can also be converted to numerical [Unix timestamps](https://en.wikipedia.org/wiki/Unix_time): ```js dt.toMillis(); //=> 1492702320000 dt.toSeconds(); //=> 1492702320.000 dt.toUnixInteger(); // => 1492702320 dt.valueOf(); //=> 1492702320000, same as .toMillis() ``` ## toLocaleString (strings for humans) ### The basics Modern browsers (and other JS environments) provide support for human-readable, internationalized strings. Luxon provides convenient support for them, and you should use them anytime you want to display a time to a user. Use `toLocaleString` to do it: ```js dt.toLocaleString(); //=> '4/20/2017' dt.toLocaleString(DateTime.DATETIME_FULL); //=> 'April 20, 2017 at 11:32 AM EDT' dt.setLocale('fr').toLocaleString(DateTime.DATETIME_FULL); //=> '20 avril 2017 à 11:32 UTC−4' ``` ### Intl.DateTimeFormat In the example above, `DateTime.DATETIME_FULL` is one of several convenience formats provided by Luxon. But the arguments are really any object of options that can be provided to [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat). For example: ```js dt.toLocaleString({ month: 'long', day: 'numeric' }); //=> 'April 20' ``` And that's all the preset is: ``` DateTime.DATETIME_FULL; //=> { // year: 'numeric', // month: 'long', // day: 'numeric', // hour: 'numeric', // minute: '2-digit', // timeZoneName: 'short' // } ``` This also means you can modify the presets as you choose: ```js dt.toLocaleString(DateTime.DATE_SHORT); //=> '4/20/2017' var newFormat = {...DateTime.DATE_SHORT, weekday: 'long' }; dt.toLocaleString(newFormat); //=> 'Thursday, 4/20/2017' ``` ### Presets Here's the full set of provided presets using the October 14, 1983 at `13:30:23` as an example. | Name | Description | Example in en_US | Example in fr | | ---------------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------- | ---------------------------------------------------------- | | `DATE_SHORT` | short date | `10/14/1983` | `14/10/1983` | | `DATE_MED` | abbreviated date | `Oct 14, 1983` | `14 oct. 1983` | | `DATE_MED_WITH_WEEKDAY` | abbreviated date with abbreviated weekday | `Fri, Oct 14, 1983` | `ven. 14 oct. 1983` | | `DATE_FULL` | full date | `October 14, 1983` | `14 octobre 1983` | | `DATE_HUGE` | full date with weekday | `Friday, October 14, 1983` | `vendredi 14 octobre 1983` | | `TIME_SIMPLE` | time | `1:30 PM` | `13:30` | | `TIME_WITH_SECONDS` | time with seconds | `1:30:23 PM` | `13:30:23` | | `TIME_WITH_SHORT_OFFSET` | time with seconds and abbreviated named offset | `1:30:23 PM EDT` | `13:30:23 UTC−4` | | `TIME_WITH_LONG_OFFSET` | time with seconds and full named offset | `1:30:23 PM Eastern Daylight Time` | `13:30:23 heure d’été de l’Est` | | `TIME_24_SIMPLE` | 24-hour time | `13:30` | `13:30` | | `TIME_24_WITH_SECONDS` | 24-hour time with seconds | `13:30:23` | `13:30:23` | | `TIME_24_WITH_SHORT_OFFSET` | 24-hour time with seconds and abbreviated named offset | `13:30:23 EDT` | `13:30:23 UTC−4` | | `TIME_24_WITH_LONG_OFFSET` | 24-hour time with seconds and full named offset | `13:30:23 Eastern Daylight Time` | `13:30:23 heure d’été de l’Est` | | `DATETIME_SHORT` | short date & time | `10/14/1983, 1:30 PM` | `14/10/1983 à 13:30` | | `DATETIME_MED` | abbreviated date & time | `Oct 14, 1983, 1:30 PM` | `14 oct. 1983 à 13:30` | | `DATETIME_MED_WITH_WEEKDAY` | abbreviated date & time with abbreviated weekday | `Fri, Oct 14, 1983, 1:30 PM` | `ven. 14 oct. 1983 à 13:30` | | `DATETIME_FULL` | full date and time with abbreviated named offset | `October 14, 1983 at 1:30 PM EDT` | `14 octobre 1983 à 13:30 UTC−4` | | `DATETIME_HUGE` | full date and time with weekday and full named offset | `Friday, October 14, 1983 at 1:30 PM Eastern Daylight Time` | `vendredi 14 octobre 1983 à 13:30 heure d’été de l’Est` | | `DATETIME_SHORT_WITH_SECONDS`| short date & time with seconds | `10/14/1983, 1:30:23 PM` | `14/10/1983 à 13:30:23` | | `DATETIME_MED_WITH_SECONDS` | abbreviated date & time with seconds | `Oct 14, 1983, 1:30:23 PM` | `14 oct. 1983 à 13:30:23` | | `DATETIME_FULL_WITH_SECONDS` | full date and time with abbreviated named offset with seconds | `October 14, 1983 at 1:30:23 PM EDT` | `14 octobre 1983 à 13:30:23 UTC−4` | | `DATETIME_HUGE_WITH_SECONDS` | full date and time with weekday and full named offset with seconds | `Friday, October 14, 1983 at 1:30:23 PM Eastern Daylight Time` | `vendredi 14 octobre 1983 à 13:30:23 heure d’été de l’Est` | ### Intl `toLocaleString`'s behavior is affected by the DateTime's `locale`, `numberingSystem`, and `outputCalendar` properties. See the [Intl](intl.md) section for more. ## Formatting with tokens (strings for Cthulhu) This section covers generating strings from DateTimes with programmer-specified formats. ### Consider alternatives You shouldn't create ad-hoc string formats if you can avoid it. If you intend for a computer to read the string, prefer ISO 8601. If a human will read it, prefer `toLocaleString`. Both are covered above. However, if you have some esoteric need where you need some specific format (e.g. because some other software expects it), then `toFormat` is how you do it. ### toFormat See `DateTime#toFormat` for the API signature. As a brief motivating example: ```js DateTime.fromISO('2014-08-06T13:07:04.054').toFormat('yyyy LLL dd'); //=> '2014 Aug 06' ``` The supported tokens are described in the table below. ### Intl All of the strings (e.g. month names and weekday names) are internationalized by introspecting strings generated by the Intl API. Thus the exact strings you get are implementation-specific. ```js DateTime.fromISO('2014-08-06T13:07:04.054') .setLocale('fr') .toFormat('yyyy LLL dd'); //=> '2014 août 06' ``` Note `toFormat` defaults to `en-US`. If you need the string to be internationalized, you need to set the locale explicitly like in the example above (or more preferably, use `toLocaleString`). ### Escaping You may escape strings using single quotes: ```js DateTime.now().toFormat("HH 'hours and' mm 'minutes'"); //=> '20 hours and 55 minutes' ``` ### Standalone vs format tokens Some tokens have a "standalone" and "format" version. Some languages require different forms of a word based on whether it is part of a longer phrase or just by itself (e.g. "Monday the 22nd" vs "Monday"). Use them accordingly. ```js var d = DateTime.fromISO('2014-08-06T13:07:04.054').setLocale('ru'); d.toFormat('LLLL'); //=> 'август' (standalone) d.toFormat('MMMM'); //=> 'августа' (format) ``` ### Macro tokens Some of the formats are "macros", meaning they correspond to multiple components. These use the native Intl API and will order their constituent parts in a locale-friendly way. ```js DateTime.fromISO('2014-08-06T13:07:04.054').toFormat('ff'); //=> 'Aug 6, 2014, 1:07 PM' ``` The macro options available correspond one-to-one with the preset formats defined for `toLocaleString`. ### Table of tokens (Examples below given for `2014-08-06T13:07:04.054` considered as a local time in America/New_York). | Standalone token | Format token | Description | Example | |------------------| ------------ |----------------------------------------------------------------| ------------------------------------------------------------- | | S | | millisecond, no padding | `54` | | SSS | | millisecond, padded to 3 | `054` | | u | | fractional seconds, functionally identical to SSS | `054` | | uu | | fractional seconds, between 0 and 99, padded to 2 | `05` | | uuu | | fractional seconds, between 0 and 9 | `0` | | s | | second, no padding | `4` | | ss | | second, padded to 2 padding | `04` | | m | | minute, no padding | `7` | | mm | | minute, padded to 2 | `07` | | h | | hour in 12-hour time, no padding | `1` | | hh | | hour in 12-hour time, padded to 2 | `01` | | H | | hour in 24-hour time, no padding | `9` | | HH | | hour in 24-hour time, padded to 2 | `13` | | Z | | narrow offset | `+5` | | ZZ | | short offset | `+05:00` | | ZZZ | | techie offset | `+0500` | | ZZZZ | | abbreviated named offset | `EST` | | ZZZZZ | | unabbreviated named offset | `Eastern Standard Time` | | z | | IANA zone | `America/New_York` | | a | | meridiem | `AM` | | d | | day of the month, no padding | `6` | | dd | | day of the month, padded to 2 | `06` | | c | E | day of the week, as number from 1-7 (Monday is 1, Sunday is 7) | `3` | | ccc | EEE | day of the week, as an abbreviate localized string | `Wed` | | cccc | EEEE | day of the week, as an unabbreviated localized string | `Wednesday` | | ccccc | EEEEE | day of the week, as a single localized letter | `W` | | L | M | month as an unpadded number | `8` | | LL | MM | month as a padded number | `08` | | LLL | MMM | month as an abbreviated localized string | `Aug` | | LLLL | MMMM | month as an unabbreviated localized string | `August` | | LLLLL | MMMMM | month as a single localized letter | `A` | | y | | year, unpadded | `2014` | | yy | | two-digit year | `14` | | yyyy | | four- to six- digit year, pads to 4 | `2014` | | G | | abbreviated localized era | `AD` | | GG | | unabbreviated localized era | `Anno Domini` | | GGGGG | | one-letter localized era | `A` | | kk | | ISO week year, unpadded | `14` | | kkkk | | ISO week year, padded to 4 | `2014` | | W | | ISO week number, unpadded | `32` | | WW | | ISO week number, padded to 2 | `32` | | ii | | Local week year, unpadded | `14` | | iiii | | Local week year, padded to 4 | `2014` | | n | | Local week number, unpadded | `32` | | nn | | Local week number, padded to 2 | `32` | | o | | ordinal (day of year), unpadded | `218` | | ooo | | ordinal (day of year), padded to 3 | `218` | | q | | quarter, no padding | `3` | | qq | | quarter, padded to 2 | `03` | | D | | localized numeric date | `9/4/2017` | | DD | | localized date with abbreviated month | `Aug 6, 2014` | | DDD | | localized date with full month | `August 6, 2014` | | DDDD | | localized date with full month and weekday | `Wednesday, August 6, 2014` | | t | | localized time | `9:07 AM` | | tt | | localized time with seconds | `1:07:04 PM` | | ttt | | localized time with seconds and abbreviated offset | `1:07:04 PM EDT` | | tttt | | localized time with seconds and full offset | `1:07:04 PM Eastern Daylight Time` | | T | | localized 24-hour time | `13:07` | | TT | | localized 24-hour time with seconds | `13:07:04` | | TTT | | localized 24-hour time with seconds and abbreviated offset | `13:07:04 EDT` | | TTTT | | localized 24-hour time with seconds and full offset | `13:07:04 Eastern Daylight Time` | | f | | short localized date and time | `8/6/2014, 1:07 PM` | | ff | | less short localized date and time | `Aug 6, 2014, 1:07 PM` | | fff | | verbose localized date and time | `August 6, 2014, 1:07 PM EDT` | | ffff | | extra verbose localized date and time | `Wednesday, August 6, 2014, 1:07 PM Eastern Daylight Time` | | F | | short localized date and time with seconds | `8/6/2014, 1:07:04 PM` | | FF | | less short localized date and time with seconds | `Aug 6, 2014, 1:07:04 PM` | | FFF | | verbose localized date and time with seconds | `August 6, 2014, 1:07:04 PM EDT` | | FFFF | | extra verbose localized date and time with seconds | `Wednesday, August 6, 2014, 1:07:04 PM Eastern Daylight Time` | | X | | unix timestamp in seconds | `1407287224` | | x | | unix timestamp in milliseconds | `1407287224054` | moment-luxon-93c85a3/docs/home.md000066400000000000000000000020001477254173100167220ustar00rootroot00000000000000## Luxon Luxon is a library for dealing with dates and times in JavaScript. ```js DateTime.now().setZone('America/New_York').minus({weeks:1}).endOf('day').toISO(); ``` ### Features * A nice API for working with datetimes * Interval support (from time x to time y) * Duration support (14 days, 5 minutes, 33 seconds) * [Parsing](parsing.md) and [Formatting](formatting.md) datetimes, intervals, and durations * [Internationalization](intl.md) of strings using the Intl API * Detailed and unambiguous [math](math.md) operations * Built-in handling of [time zones](zones.md) * Partial support for multiple [calendar systems](calendars.md) For more, see the docs on the left, including the [api docs](api-docs/index.html ':ignore') ### Getting started * [Demo](https://moment.github.io/luxon/demo/global.html ':ignore') * Read the [quick tour](tour.md) * Browse the topic docs on the left * Read the [api docs](api-docs/index.html ':ignore') Logo by [John Dalziel](https://github.com/crashposition) moment-luxon-93c85a3/docs/install.md000066400000000000000000000062131477254173100174520ustar00rootroot00000000000000# Install guide Luxon provides different builds for different JS environments. See below for a link to the right one and instructions on how to use it. Luxon supports all modern platforms, but see [the support matrix](matrix.md) for additional details. ## Basic browser setup - [Download full](https://moment.github.io/luxon/global/luxon.js) - [Download minified](https://moment.github.io/luxon/global/luxon.min.js) You can also load the files from a [CDN](https://www.jsdelivr.com/package/npm/luxon). Just include Luxon in a script tag. You can access its various classes through the `luxon` global. ```html ``` You may wish to alias the classes you use: ```js var DateTime = luxon.DateTime; ``` ## Node.js Supports Node.js 6+. Install via NPM: ``` npm install --save luxon ``` ```js const { DateTime } = require("luxon"); ``` If you want to work with locales, you need ICU support: 1. **For Node.js 13+, it comes built-in, no action necessary** 2. For older versions of Node.js (only 12 is supported), you need to install it yourself: 1. Install a build of Node.js with full ICU baked in, such as via nvm: nvm install -s --with-intl=full-icu --download=all or brew: brew install node --with-full-icu 2. Install the ICU data externally and point Node.js to it. The instructions on how to do that are below. The instructions for using full-icu as a package are a little confusing. Node.js can't automatically discover that you've installed it, so you need to tell it where to find the data, like this: ``` npm install full-icu node --icu-data-dir=./node_modules/full-icu ``` You can also point to the data with an environment var, like this: ``` NODE_ICU_DATA="$(pwd)/node_modules/full-icu" node ``` ## AMD (System.js, RequireJS, etc) - [Download full](https://moment.github.io/luxon/amd/luxon.js) - [Download minified](https://moment.github.io/luxon/amd/luxon.min.js) ```js requirejs(["luxon"], function(luxon) { //... }); ``` ## ES6 - [Download full](https://moment.github.io/luxon/es6/luxon.js) - [Download minified](https://moment.github.io/luxon/es6/luxon.min.js) ```js import { DateTime } from "luxon"; ``` ## Webpack ``` npm install --save luxon ``` ```js import { DateTime } from "luxon"; ``` ## Types There are third-party typing files for Flow (via [flow-typed](https://github.com/flowtype/flow-typed)) and TypeScript (via [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped)). For Flow, use: ``` flow-typed install luxon ``` For TypeScript, use: ``` npm install --save-dev @types/luxon ``` ## React Native React Native >=0.70 works just fine out of the box. Older versions of React Native for Android (or if you disable Hermes) doesn't include Intl support by default, which you need for [a lot of Luxon's functionality](matrix.md). For React Native >=0.60, you should configure the build flavor of jsc in `android/app/build.gradle`: ```diff -def jscFlavor = 'org.webkit:android-jsc:+' +def jscFlavor = 'org.webkit:android-jsc-intl:+' ``` For even older versions of React Native you can use [jsc-android-buildscripts](https://github.com/SoftwareMansion/jsc-android-buildscripts) to fix it. moment-luxon-93c85a3/docs/intl.md000066400000000000000000000230521477254173100167520ustar00rootroot00000000000000# Intl Luxon uses the native Intl API to provide easy-to-use internationalization. A quick example: ```js DateTime.now() .setLocale("el") .toLocaleString(DateTime.DATE_FULL); //=> '24 Σεπτεμβρίου 2017' ``` ## Making sure you have access to other locales Please see the [install guide](install.md) for instructions on making sure your platform has access to the Intl APIs and the ICU data to power it. This especially important for Node, which doesn't ship with ICU data by default. ## How locales work Luxon DateTimes can be configured using [BCP 47](https://tools.ietf.org/html/rfc5646) locale strings specifying the language to use generating or interpreting strings. The native Intl API provides the actual internationalized strings; Luxon just wraps it with a nice layer of convenience and integrates the localization functionality into the rest of Luxon. The Mozilla MDN Intl docs have a [good description](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation) of how the `locale` argument works. In Luxon, the methods are different but the semantics are the same, except in that Luxon allows you to specify a numbering system and output calendar independently of the locale string. The rest of this document will concentrate on what Luxon does when provided with locale information. ## Setting the locale `locale` is a property of Luxon object. Thus, locale is a sort of setting on the DateTime object, as opposed to an argument you provide the different methods that need internationalized. You can generally set it at construction time: ```js var dt = DateTime.fromISO("2017-09-24", { locale: "fr" }); dt.locale; //=> 'fr' ``` In this case, the specified locale didn't change the how the parsing worked (there's nothing localized about it), but it did set the locale property in the resulting instance. For other factory methods, such as `fromFormat`, the locale argument _does_ affect how the string is parsed. See further down for more. You can change the locale of a DateTime instance (meaning, create a clone DateTime with a different locale) using `setLocale`: ```js DateTime.now().setLocale("fr").locale; //=> 'fr' ``` `setLocale` is just a convenience for `reconfigure`: ```js DateTime.now().reconfigure({ locale: "fr" }).locale; //=> 'fr' ``` ## Default locale ### Out-of-the-box behavior By default, the `locale` property of a new DateTime or Duration is the system locale. On a browser, that means whatever the user has their browser or OS language set to. On Node, that usually means en-US. As a result, `DateTime#toLocaleString`, `DateTime#toLocaleParts`, and other human-readable-string methods like `Info.months` will by default generate strings in the user's locale. However, note that `DateTime.fromFormat` and `DateTime#toFormat` fall back on en-US. That's because these methods are often used to parse or format strings for consumption by APIs that don't care about the user's locale. So we need to pick a locale and stick with it, or the code will break depending on whose browser it runs in. There's an exception, though: `DateTime#toFormat` can take "macro" formats like "D" that produces localized strings as part of a larger string. These *do* default to the system locale because their entire purpose is to be provide localized strings. ### Setting the default You can set a default locale so that new instances will always be created with the specified locale: ```js Settings.defaultLocale = "fr"; DateTime.now().locale; //=> 'fr' ``` Note that this also alters the behavior of `DateTime#toFormat` and `DateTime#fromFormat`. ### Using the system locale in string parsing You generally don't want `DateTime#fromFormat` and `DateTime#toFormat` to use the system's locale, since your format won't be sensitive to the locale's string ordering. That's why Luxon doesn't behave that way by default. But if you really want that behavior, you can always do this: ```js Settings.defaultLocale = DateTime.now().resolvedLocaleOptions().locale; ``` ## Checking what you got The local environment may not support the exact locale you asked for. The native Intl API will try to find the best match. If you want to know what that match was, use `resolvedLocaleOpts`: ```js DateTime.local({ locale: "fr-co" }).resolvedLocaleOptions(); //=> { locale: 'fr', // numberingSystem: 'latn', // outputCalendar: 'gregory' } ``` ## Methods affected by the locale ### Formatting The most important method affected by the locale setting is `toLocaleString`, which allows you to produce internationalized, human-readable strings. ```js dt.setLocale("fr").toLocaleString(DateTime.DATE_FULL); //=> '25 septembre 2017' ``` That's the normal way to do it: set the locale as property of the DateTime itself and let the `toLocaleString` inherit it. But you can specify the locale directly to `toLocaleString` too: ```js dt.toLocaleString({ locale: "es" , ...DateTime.DATE_FULL }); //=> '25 de septiembre de 2017' ``` Ad-hoc formatting also respects the locale: ```js dt.setLocale("fr").toFormat("MMMM dd, yyyy GG"); //=> 'septembre 25, 2017 après Jésus-Christ' ``` ### Parsing You can [parse](parsing.md) localized strings: ```js DateTime.fromFormat("septembre 25, 2017 après Jésus-Christ", "MMMM dd, yyyy GG", { locale: "fr" }); ``` ### Listing Some of the methods in the `Info` class let you list strings like months, weekdays, and eras, and they can be localized: ```js Info.months("long", { locale: "fr" }); //=> [ 'janvier', 'février', ... Info.weekdays("long", { locale: "fr" }); //=> [ 'lundi', 'mardi', ... Info.eras("long", { locale: "fr" }); //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] ``` ## numberingSystem DateTimes also have a `numberingSystem` setting that lets you control what system of numerals is used in formatting. In general, you shouldn't override the numbering system provided by the locale. For example, no extra work is needed to get Arabic numbers to show up in Arabic-speaking locales: ```js var dt = DateTime.now().setLocale("ar"); dt.resolvedLocaleOptions(); //=> { locale: 'ar', // numberingSystem: 'arab', // outputCalendar: 'gregory' } dt.toLocaleString(); //=> '٢٤‏/٩‏/٢٠١٧' ``` For this reason, Luxon defaults its own `numberingSystem` property to null, by which it means "let the Intl API decide". However, you can override it if you want. This example is admittedly ridiculous: ```js const dt = DateTime.local().reconfigure({ locale: "it", numberingSystem: "beng" }); dt.toLocaleString(DateTime.DATE_FULL); //=> '২৪ settembre ২০১৭' ``` Similar to `locale`, you can set the default numbering system for new instances: ```js Settings.defaultNumberingSystem = "beng"; ``` ## Locale-based weeks Most of Luxon uses the [ISO week date](https://en.wikipedia.org/wiki/ISO_week_date) system when working with week-related data. This means that the week starts on Monday and the first week of the year is that week, which has 4 or more of its days in January. This definition works for most use-cases, however locales can define different rules. For example, in many English-speaking countries the week is said to start on Sunday and the 1 January always defines the first week of the year. This information is available through the Luxon as well. Note that your runtime needs to support [`Intl.Locale#getWeekInfo`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/getWeekInfo) for this to have an effect. If unsupported, Luxon will fall back to using the ISO week dates. ### Accessing locale-based week info The `Info` class exposes methods `getStartOfWeek`, `getMinimumDaysInFirstWeek` and `getWeekendWeekdays` for informational purposes. ### Accessing locale-based week data ```js const dt = DateTime.local(2022, 1, 1, { locale: "en-US" }); dt.localWeekday // 7, because Saturday is the 7th day of the week in en-US dt.localWeekNumber // 1, because 1 January is always in the first week in en-US dt.localWeekYear // 2022, because 1 January is always in the first week in en-US dt.weeksInLocalWeekYear // 53, because 2022 has 53 weeks in en-US ``` ### Using locale-based week data when creating DateTimes When creating a DateTime instance using `fromObject`, you can use the `localWeekday`, `localWeekNumber` and `localWeekYear` properties. They will use the same locale that the newly created DateTime will use, either explicitly provided or falling back to the system default. ```js const dt = DateTime.fromObject({localWeekYear: 2022, localWeekNumber: 53, localWeekday: 7}); dt.toISODate(); // 2022-12-31 ``` ### Setting locale-based week data When modifying an existing DateTime instance using `set`, you can use the `localWeekday`, `localWeekNumber` and `localWeekYear` properties. They will use the locale of the existing DateTime as reference. ```js const dt = DateTime.local(2022, 1, 2, { locale: "en-US" }); const modified = dt.set({localWeekNumber: 2}); modified.toISODate(); // 2022-01-08 ``` ### Locale-based weeks with math The methods `startOf`, `endOf`, `hasSame` of `DateTime` as well as `count` of `Interval` accept an option `useLocaleWeeks`. If enabled, the methods will treat the `week` unit according to the locale, respecting the correct start of the week. ```js const dt = DateTime.local(2022, 1, 6, { locale: "en-US" }); const startOfWeek = dt.startOf('week', {useLocaleWeeks: true}); startOfWeek.toISODate(); // 2022-01-02, a Sunday ``` ### Overriding defaults You can override the runtime-provided defaults for the week settings using `Settings.defaultWeekSettings`: ```js Settings.defaultWeekSettings = { firstDay: 7, minimalDays: 1, weekend: [6, 7] } ```moment-luxon-93c85a3/docs/math.md000066400000000000000000000345021477254173100167370ustar00rootroot00000000000000# Math This page covers some oddball topics related to date and time math, which has some quirky corner cases. ## Calendar math vs time math ### The basics Math with dates and times can be unintuitive to programmers. If it's Feb 13, 2017 and I say "in exactly one month", you know I mean March 13. Exactly one month after that is April 13. But because February is a shorter month than March, that means we added a different amount of time in each case. On the other hand, if I said "30 days from February 13", you'd try to figure out what day that landed on in March. Here it is in Luxon: ```js DateTime.local(2017, 2, 13).plus({ months: 1 }).toISODate() //=> '2017-03-13' DateTime.local(2017, 2, 13).plus({ days: 30 }).toISODate() //=> '2017-03-15' ``` More generally we can differentiate two modes of math: * Calendar math works with higher-order, variable-length units like years and months * Time math works with lower-order, constant-length units such as hours, minutes, and seconds. ### Which units use which math? These units use calendar math: * **Years** vary because of leap years. * **Months** vary because they're just different lengths. * **Days** vary because DST transitions mean some days are 23 or 25 hours long. * **Quarters** are always three months, but months vary in length so quarters do too. * **Weeks** are always the same number of days, but days vary so weeks do too. These units use time math: * **Hours** are always 60 minutes * **Minutes** are always 60 seconds * **Seconds** are always 1000 milliseconds ### Leap seconds Luxon ([as JavaScript in general](https://262.ecma-international.org/5.1/#sec-15.9.1.1)) doesn't account for [leap seconds](https://en.wikipedia.org/wiki/Leap_second); as in most programming environments, leap seconds happen as invisible changes to the underlying system's time. This can, in rare cases, cause the same second to "occur" twice from Luxon's perspective. The practical effect of leaps seconds are quite limited: 1. You can't represent the leap second itself (i.e., `DateTime.utc(2016, 12, 31, 23, 59, 60).isValid` returns `false`). 2. A Luxon `diff()` calculation that crosses a leap second will not exactly match the number of seconds that passed in the outside world. This can come up in rare situations where it matters to your application exactly what happened in the last *n* seconds. Even this is increasingly mitigated by [leap smear](https://developers.google.com/time/smear). ### How to think about calendar math It's best not to think of calendar math as requiring arcane checks on the lengths of intervening periods. Instead, think of them as **adjusting that unit directly and keeping lower order date components constant**. Let's go back to the Feb 13 + 1 month example. If you didn't have Luxon, you would do something like this to accomplish that: ```js var d = new Date('2017-02-13') d.setMonth(d.getMonth() + 1) d.toLocaleString() //=> '3/13/2017, 12:00:00 AM' ``` And under the covers, that's more or less what Luxon does too. It doesn't boil the operation down to a milliseconds delta because that's not what's being asked. Instead, it fiddles with what it thinks the date should be and then uses the built-in Gregorian calendar to compute the new timestamp. ### DSTs There's a whole section about this in the [time zones documentation](zones.md?id=math-across-dsts). But here's a quick example (Spring Forward is early on March 12 in my time zone): ```js var start = DateTime.local(2017, 3, 11, 10); start.hour //=> 10, just for comparison start.plus({days: 1}).hour //=> 10, stayed the same start.plus({hours: 24}).hour //=> 11, DST pushed forward an hour ``` So in adding a day, we kept the hour at 10, even though that's only 23 hours later. ### Time math Time math is different. In time math, we're just adjusting the clock, adding or subtracting from the epoch timestamp. Adding 63 hours is really the same as adding 63 hours' worth of milliseconds. Under the covers, Luxon does this exactly the opposite of how it does calendar math; it boils the operation down to milliseconds, computes the new timestamp, and then computes the date out of that. ## Math with multiple units It's possible to do math with multiple units: ```js DateTime.fromISO('2017-05-15').plus({months: 2, days: 6}).toISODate(); //=> '2017-07-21' ``` This isn't as simple as it looks. For example, what should you expect this to do? ```js DateTime.fromISO('2017-04-30').plus({months: 1, days: 1}).toISODate(); ``` If the day is added first, we'll get an intermediate value of May 1. Adding a month to that gives us June 1. But if the month is added first, we'll an intermediate value of May 30 and day after that is May 31. (See "Calendar math vs time math" above if this is confusing.) So the order matters. Luxon has a simple rule for this: **math is done from highest order to lowest order**. So the result of the example above is May 31. This rule isn't logically necessary, but it does seem to reflect what people mean. Of course, Luxon can't enforce this rule if you do the math in separate operations: ```js DateTime.fromISO('2017-04-30').plus({days: 1}).plus({months: 1}).toISODate() //=> '2017-06-01' ``` It's not a coincidence that Luxon's interface makes it awkward to do this wrong. ## Comparing DateTimes DateTime implements `#valueOf` to return the epoch timestamp, so you can compare DateTimes with `<`, `>`, `<=`, and `>=`. That lets you find out if one DateTime is after or before another DateTime. ```js d1 < d2 // is d1 before d2? ``` However, be aware that `===` compares object identity, which is not a useful concept in a library with immutable types. Use `#equals` to compare both the time and additional metadata, such as the locale and time zone. If you're only interested in checking the equality of the timestamps, you can use: ```js d1.toMillis() === d2.toMillis() // are d1 and d2 the same instant in time? +d1 === +d2 // same test, using object coercion ``` You may also use `#hasSame` to make more subtle comparisons: ```js d1.hasSame(d2, 'year'); // both DateTimes have the same calendar year d1.hasSame(d2, 'day'); // both DateTimes have the same calendar day (which implies they also have the same calendar year and month) ``` Note that these are checking against the calendar. For example, if `d1` is in 2017, calling `hasSame` with "year" asks if d2 is also in 2017, not whether the DateTimes within a year of each other. For that, you'd need `diff` (see below). If you'd like to compare using a specific unit, you can achieve this by combining `#startOf` and the `#valueOf` comparisons above. ```js var d1 = DateTime.fromISO('2017-04-30'); var d2 = DateTime.fromISO('2017-04-01'); d2 < d1 //=> true d2.startOf('year') < d1.startOf('year') //=> false d2.startOf('month') < d1.startOf('month') //=> false d2.startOf('day') < d1.startOf('day') //=> true ``` ## Duration math ### Basics `Durations` are quantities of time, like "3 days and 6 hours". Luxon has no idea *which* 3 days and 6 hours they represent; it's just how Luxon represents those quantities in abstract, unmoored from the timeline. This is both tremendously useful and occasionally confusing. I'm not going to give a detailed tour of their capabilities here (see the API docs for that), but I do want to clear up some of those confusions. Here's some very basic stuff to get us going: ```js var dur = Duration.fromObject({ days: 3, hours: 6}) // examine it dur.toObject() //=> { days: 3, hours: 6 } // express in minutes dur.as('minutes') //=> 4680 // convert to minutes dur.shiftTo('minutes').toObject() //=> { minutes: 4680 } // add to a DateTime DateTime.fromISO("2017-05-15").plus(dur).toISO() //=> '2017-05-18T06:00:00.000-04:00' ``` ### Diffs You can subtract one time from another to find out how much time there is between them. Luxon's `DateTime.diff` method does this and it returns a Duration. For example: ```js var end = DateTime.fromISO('2017-03-13'); var start = DateTime.fromISO('2017-02-13'); var diffInMonths = end.diff(start, 'months'); diffInMonths.toObject(); //=> { months: 1 } ``` Notice we had to pick the unit to keep track of the diff in. The default is milliseconds: ```js var diff = end.diff(start); diff.toObject() //=> { milliseconds: 2415600000 } ``` Finally, you can diff using multiple units: ```js var end = DateTime.fromISO('2017-03-13'); var start = DateTime.fromISO('2017-02-11'); end.diff(start, ['months', 'days']).toObject() //=> { months: 1, days: 2 } ``` ### Casual vs longterm conversion accuracy Durations represent bundles of time with specific units, but Luxon allows you to convert between them: * `shiftTo` returns a new Duration denominated in the specified units. * `as` converts the duration to just that unit and returns its value ```js var dur = Duration.fromObject({ months: 4, weeks: 2, days: 6 }) dur.as('days') //=> 140 dur.shiftTo('days').toObject() //=> { days: 140 } dur.shiftTo('weeks', 'hours').toObject() //=> { weeks: 18, hours: 144 } ``` But how do those conversions actually work? First, uncontroversially: * 1 week = 7 days * 1 day = 24 hours * 1 hour = 60 minutes * 1 minute = 60 seconds * 1 second = 1000 milliseconds These are always true and you can roll them up and down with consistency (e.g. `1 hour = 60 * 60 * 1000 milliseconds`). However, this isn't really true for the higher order units, which vary in length, even putting DSTs aside. A year is sometimes 365 days long and sometimes 366. Months are 28, 29, 30, or 31 days. By default Luxon converts between these units using what you might call "casual" conversions: | | Month | Week | Day | | --- | --- | --- | --- | | Year | 12 | 52 | 365 | | Quarter | 3 | 13 | 91 | | Month | | 4 | 30 | These should match your intuition and for most purposes they work well. But they're not just wrong; they're not even self-consistent: ```js Duration.fromObject({ years:1 }).shiftTo('months').shiftTo('days').as('years') //=> 0.9863013698630136 ``` This is because 12 * 30 != 365. These errors can be annoying, but they can also cause significant issues if the errors accumulate: ```js var dur = Duration.fromObject({ years: 50000 }); DateTime.now().plus(dur.shiftTo('milliseconds')).year //=> 51984 DateTime.now().plus(dur).year //=> 52017 ``` Those are 33 years apart! So Luxon offers an alternative conversion scheme called "longterm", based on the 400-year calendar cycle: | | Month | Week | Day | |---- | --- | --- | --- | | Year | 12 | 52.1775 | 365.2425 | | Quarter | 3 | 13.04435 | 91.310625 | | Month | | 4.348125 | 30.436875 | You can see why these are irritating to work with, which is why they're not the default. Luxon methods that create Durations de novo accept an option called `conversionAccuracy`. You can set it to "casual" or "longterm". It's a property of the Duration itself, so any conversions you do use the rule you've picked, and any new Durations you derive from it will retain that property. ```js Duration.fromObject({ years: 23 }, { conversionAccuracy: 'longterm' }); Duration.fromISO('PY23', { conversionAccuracy: 'longterm' }); end.diff(start, 'days', { conversionAccuracy: 'longterm' }) ``` You can also create an accurate Duration out of an existing one: ```js var pedanticDuration = casualDuration.reconfigure({ conversionAccuracy: 'longterm' }); ``` These Durations will do their conversions differently. ### Losing information Be careful of converting between units. It's easy to lose information. Let's say we converted a diff into days: ```js var end = DateTime.fromISO('2017-03-13'); var start = DateTime.fromISO('2017-02-13'); var diffInMonths = end.diff(start, 'months'); diffInMonths.as('days'); //=> 30 ``` That's our conversion between months and days (you could also do a longterm-accurate conversion; it wouldn't fix the issue ahead). But this isn't the number of days between February 13 and March 13! ```js var diffInDays = end.diff(start, 'days'); diffInDays.toObject(); //=> { days: 28 } ``` It's important to remember that diffs are Duration objects, and a Duration is just a dumb pile of time units our computation spat out. Unlike an Interval, a Duration doesn't "remember" what the inputs to the diff were. So we lost some information converting between units. This mistake is really common when rolling up: ```js var diff = end.diff(start); // default unit is milliseconds // wtf, that's not a month! diff.as('months'); //=> 0.9319444 // it's not even the right number of days! (hint: my time zone has a DST) diff.shiftTo('hours').as('days'); //=> 27.958333333333332 ``` Normally you won't run into this problem if you think clearly about what you want to do with a diff. Specifically, make sure you diff in the units you actually want to use. Then Luxon knows to answer the question you really want to ask. ```js var monthsDiff = end.diff(start, "months"); var daysDiff = end.diff(start, "days"); ``` But sometimes you really do want an object that represents the subtraction itself, not the result. `Intervals` can help. Intervals are mostly used to keep track of ranges of time, but they make for "anchored" diffs too. For example: ```js var end = DateTime.fromISO('2017-03-13'); var start = DateTime.fromISO('2017-02-13'); var i = Interval.fromDateTimes(start, end); i.length('days'); //=> 28 i.length('months') //=> 1 ``` Because the Interval stores its endpoints and computes `length` on the fly, it retakes the diff each time you query it. Of course, precisely because an Interval *isn't* an abstract bundle of time, it can't be used in places where Durations can. For example, you can't add them to DateTime via `plus()` because Luxon wouldn't know what units to do the math in (see "Calendar vs time math" above). But you can convert the interval into a Duration by picking the units: ```js i.toDuration('months').toObject(); //=> { months: 1 } i.toDuration('days').toObject(); //=> { days: 28 } ``` You can even pick multiple units: ```js end = DateTime.fromISO('2018-05-25'); i = start.until(end); i.toDuration(['years', 'months', 'days']).toObject(); //=> { years: 1, months: 3, days: 12 } ``` Of course, once you've converted to a Duration, you're back in the same spot you were with the diff case; *further* conversions will be lossy. So the point is to think carefully about what information you have when. moment-luxon-93c85a3/docs/matrix.md000066400000000000000000000077671477254173100173270ustar00rootroot00000000000000# Support matrix This page covers what platforms are supported by Luxon and what caveats apply to them. ## Official support Luxon officially supports the last two versions of the major browsers, with some caveats. The table below shows which of the not-universally-supported features are available in what environments. | Browser | Versions | Intl relative time formatting | | -------------------------------- | -------- | ----------------------------- | | Chrome | >= 73 | ✓ | | Firefox | >= 65 | ✓ | | Edge | >= 79 | ✓ | | | 18 | ✗ | | Safari | >= 14 | ✓ | | | 13 | ✗ | | iOS Safari (iOS version numbers) | >= 14 | ✓ | | Node | >= 12 | ✓ | - Those capabilities are explained in the next sections, along with possible polyfill options - "w/ICU" refers to providing Node with ICU data. See the [install](install.md?id=node) for instructions ## Effects of missing features **If the platforms you're targeting has all its boxes above check off, ignore this section**. In the support table above, you can see that some environments are missing capabilities. In the current version of Luxon, there's only one partially-supported feature, so this is currently pretty simple. (Older versions of Luxon supported older browsers, so there were nuanced feature caveats. Newer versions will add more caveats as new browser capabilities become available and Luxon takes advantage of them if they're present.) 1. **Relative time formatting**. Luxon's support for relative time formatting (e.g. `DateTime#toRelative` and `DateTime#toRelativeCalendar`) depends on Intl.RelativeTimeFormat. Luxon will fall back to using English if that capability is missing. If the browser lacks these capabilities, Luxon tries its best: | Feature | Full support | No relative time format | | -------------------------------------- | ------------ | ----------------------- | | Most things | OK | OK | | `DateTime#toRelative` in en-US | OK | OK | | `DateTime#toRelative` in other locales | Uses English | Uses English | ## Older platforms - **Older versions of both Chrome and Firefox** will most likely work. It's just that I only officially support the last two versions. As you get to older versions of these browsers, the missing capabilities listed above begin to apply to them. (e.g. FF started supporting `formatToParts` in 51 and time zones in 52). I haven't broken that out because it's complicated, Luxon doesn't officially support them, and no one runs them anyway. - **Older versions of IE** probably won't work at all. - **Older versions of Node** probably won't work without recompiling Luxon with a different Node target. In which case they'll work with some features missing. ## Other platforms If the platform you're targeting isn't on the list and you're unsure what caveats apply, you can check which pieces are supported: ```js Info.features(); //=> { relative: false } ``` Specific notes on other platforms: - **React Native <0.70 on (specifically) Android** doesn't include Intl support by default, so all the possible-to-be-missing capabilities above are unavailable. To fix this on React Native >=0.60, you should configure the build flavor of jsc in `android/app/build.gradle`: ```diff -def jscFlavor = 'org.webkit:android-jsc:+' +def jscFlavor = 'org.webkit:android-jsc-intl:+' ``` For even older versions of React Native you can use [jsc-android-buildscripts](https://github.com/SoftwareMansion/jsc-android-buildscripts) to fix it. moment-luxon-93c85a3/docs/moment.md000066400000000000000000000416571477254173100173160ustar00rootroot00000000000000# For Moment users Luxon borrows lots of ideas from [Moment.js](https://momentjs.com), but there are a lot of differences too. This document clarifies what they are. ## Immutability Luxon's objects are immutable, whereas Moment's are mutable. For example, in Moment: ```js var m1 = moment(); var m2 = m1.add(1, 'hours'); m1.valueOf() === m2.valueOf(); //=> true ``` This happens because `m1` and `m2` are really the same object; `add()` *mutated* the object to be an hour later. Compare that to Luxon: ```js var d1 = DateTime.now(); var d2 = d1.plus({ hours: 1 }); d1.valueOf() === d2.valueOf(); //=> false ``` This happens because the `plus` method returns a new instance, leaving `d1` unmodified. It also means that Luxon doesn't require copy constructors or clone methods. ## Major functional differences 1. Months in Luxon are 1-indexed instead of 0-indexed like in Moment and the native Date type. 1. Localizations and time zones are implemented by the native Intl API (or a polyfill of it), instead of by the library itself. 1. Luxon has both a Duration type and an Interval type. The Interval type is like Twix. ## Other API style differences 1. Luxon methods often take option objects as their last parameter 1. Luxon has different static methods for object creation (e.g. `fromISO`), as opposed to Moment's one function that dispatches based on the input 1. Luxon parsers are very strict, whereas Moment's are more lenient. 1. Luxon uses getters instead of accessor methods, so `dateTime.year` instead of `dateTime.year()` 1. Luxon centralizes its "setters", like `dateTime.set({year: 2016, month: 4})` instead of `dateTime.year(2016).month(4)` like in Moment. 1. Luxon's Durations are a separate top-level class. 1. Arguments to Luxon's methods are not automatically coerced into Luxon instances. E.g. `m.diff('2017-04-01')` would be `dt.diff(DateTime.fromISO('2017-04-01'))`. ## DateTime method equivalence Here's a rough mapping of DateTime methods in Moment to ones in Luxon. I haven't comprehensively documented stuff that's in Luxon but not in Moment, just a few odds and ends that seemed obvious for inclusion; there are more. I've probably missed a few things too. ### Creation | Operation | Moment | Luxon | Notes | | ----------------------- | ------------------------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | Now | `moment()` | `DateTime.now()` | | | From ISO | `moment(String)` | `DateTime.fromISO(String)` | | | From RFC 2822 | `moment(String)` | `DateTime.fromRFC2822(String)` | | | From custom format | `moment(String, String)` | `DateTime.fromFormat(String, String)` | The format tokens differ between Moment and Luxon, such that the same format string cannot be used between the two. | | From object | `moment(Object)` | `DateTime.fromObject(Object)` | | | From timestamp | `moment(Number)` | `DateTime.fromMillis(Number)` | | | From JS Date | `moment(Date)` | `DateTime.fromJSDate(Date)` | | | From civil time | `moment(Array)` | `DateTime.local(Number...)` | Like `DateTime.local(2016, 12, 25, 10, 30)` | | From UTC civil time | `moment.utc(Array)` | `DateTime.utc(Number...)` | Moment also uses `moment.utc()` to take other arguments. In Luxon, use the appropriate method and pass in the `{ zone: 'utc'}` option | | Clone | `moment(Moment)` | N/A | Immutability makes this pointless; just reuse the object | | Use the string's offset | `parseZone` | See note | Methods taking strings that can specify offset or zone take a `setZone` argument | ### Getters and setters #### Basic information getters | Property | Moment | Luxon | Notes | | -------- | ----------- | --------- | ------------------------------------------------ | | Validity | `isValid()` | `isValid` | See also `invalidReason` | | Locale | `locale()` | `locale` | | | Zone | `tz()` | `zone` | Moment requires a plugin for this, but not Luxon | #### Unit getters | Property | Moment | Luxon | Notes | | ---------------------- | ------------------------------------ | ------------- | -------------------------------------- | | Year | `year()` | `year` | | | Month | `month()` | `month` | | | Day of month | `date()` | `day` | | | Day of week | `day()`, `weekday()`, `isoWeekday()` | `weekday` | 1-7, Monday is 1, Sunday is 7, per ISO | | Day of year | `dayOfYear()` | `ordinal` | | | Hour of day | `hour()` | `hour` | | | Minute of hour | `minute()` | `minute` | | | Second of minute | `second()` | `second` | | | Millisecond of seconds | `millisecond()` | `millisecond` | | | Week of ISO week year | `weekYear`, `isoWeekYear` | `weekYear` | | | Quarter | `quarter` | None | Just divide the months by 3 | #### Programmatic get and set For programmatic getting and setting, Luxon and Moment are very similar here: | Operation | Moment | Luxon | Notes | | ---------- | --------------------- | ------------- | --------------------------------------- | | get value | `get(String)` | `get(String)` | | | set value | `set(String, Number)` | None | | | set values | `set(Object)` | `set(Object)` | Like `dt.set({ year: 2016, month: 3 })` | ### Transformation | Operation | Moment | Luxon | Notes | | ------------------ | -------------------------- | ------------------- | --------------------------------------- | | Addition | `add(Number, String)` | `plus(Object)` | Like `dt.plus({ months: 3, days: 2 })` | | Subtraction | `subtract(Number, String)` | `minus(Object)` | Like `dt.minus({ months: 3, days: 2 })` | | Start of unit | `startOf(String)` | `startOf(String)` | | | End of unit | `endOf(String)` | `endOf(String)` | | | Change unit values | `set(Object)` | `set(Object)` | Like `dt.set({ year: 2016, month: 3 })` | | Change time zone | `tz(String)` | `setZone(string)` | Luxon doesn't require a plugin | | Change zone to utc | `utc()` | `toUTC()` | | | Change local zone | `local()` | `toLocal()` | | | Change offset | `utcOffset(Number)` | None | Set the zone instead | | Change locale | `locale(String)` | `setLocale(String)` | | ### Query | Question | Moment | Luxon | Notes | | ------------------------------------------ | ----------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------- | | Is this time before that time? | `m1.isBefore(m2)` | `dt1 < dt2` | The Moment versions of these take a unit. To do that in Luxon, use `startOf` on both instances. | | Is this time after that time? | `m1.isAfter(m2)` | `dt1 > dt2` | | | Is this time the same or before that time? | `m1.isSameOrBefore(m2)` | `dt1 <= dt2` | | | Is this time the same or after that time? | `m1.isSameOrAfter(m2)` | `dt1 >= dt2` | | | Do these two times have the same [unit]? | `m1.isSame(m2, unit)` | `dt1.hasSame(dt2, unit)` | | | Is this time's [unit] before that time's? | `m1.isBefore(m2, unit)` | `dt1.startOf(unit) < dt2.startOf(unit)` | | | Is this time's [unit] after that time's? | `m1.isAfter(m2, unit)` | `dt1.startOf(unit) > dt2.startOf(unit)` | | | Is this time between these two times? | `m1.isBetween(m2, m3)` | `Interval.fromDateTimes(dt2, dt3).contains(dt1)` | | | Is this time inside a DST | `isDST()` | `isInDST` | | | Is this time's year a leap year? | `isInLeapYear()` | `isInLeapYear` | | | How many days are in this time's month? | `daysInMonth()` | `daysInMonth` | | | How many days are in this time's year? | None | `daysInYear` | | ### Output #### Basics See the [formatting guide](formatting.md) for more about the string-outputting methods. | Output | Moment | Luxon | Notes | | ---------------- | -------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | simple string | `toString()` | `toString()` | Luxon just uses ISO 8601 for this. See Luxon's `toLocaleString()` | | full ISO 8601 | `iso()` | `toISO()` | | | ISO date only | None | `toISODate()` | | | ISO time only | None | `toISOTime()` | | | custom format | `format(...)` | `toFormat(...)` | The format tokens differ between Moment and Luxon, such that the same format string cannot be used between the two. Note `toFormat` is meant to be used for machine-readable formats. For anything human-readable, you really want to use `toLocaleString()` instead. | | RFC 2822 | | `toRFC2822()` | | | HTTP date string | | `toHTTP()` | | | JS Date | `toDate()` | `toJSDate()` | | | Epoch time | `valueOf()` | `toMillis()` or `valueOf()` | | | Object | `toObject()` | `toObject()` | | | Duration | `diff(Moment)` | `diff(DateTime)` | Moment's diff returns a count of milliseconds, but Luxon's returns a Duration. To replicate the Moment behavior, use `dt1.diff(d2).milliseconds`. | #### Humanization Luxon has `toRelative` and `toRelativeCalendar`. For internationalization, they use Intl.RelativeTimeFormat (or fall back to English when it is not supported by the browser). | Operation | Moment | Luxon | | -------------------- | -------------- | --------------------------------------------- | | Time from now | `fromNow()` | `toRelative()` | | Time from other time | `from(Moment)` | `toRelative({ base: DateTime })` | | Time to now | `toNow()` | `DateTime.local().toRelative({ base: this })` | | Time to other time | `to(Moment)` | `otherTime.toRelative({ base: this })` | | "Calendar time" | `calendar()` | `toRelativeCalendar()` | ## Durations Moment Durations and Luxon Durations are broadly similar in purpose and capabilities. The main differences are: 1. Luxon durations have more sophisticated conversion capabilities. They can convert from one set of units to another using `shiftTo`. They can also be configured to use different unit conversions. See [Duration Math](math.md?id=duration-math) for more. 1. Luxon does not (yet) have an equivalent of Moment's Duration `humanize` method. Luxon will add that when [Intl.UnitFormat](https://github.com/tc39/proposal-intl-unit-format) is supported by browsers. 1. Like DateTimes, Luxon Durations have separate methods for creating objects from different sources. See the `Duration` API docs for more. ## Intervals Moment doesn't have direct support intervals, which must be provided by plugins like Twix or moment-range. Luxon's Intervals have similar capabilities to theirs, with the exception of the humanization features. See the `Interval` API docs for more. moment-luxon-93c85a3/docs/parsing.md000066400000000000000000000353351477254173100174560ustar00rootroot00000000000000# Parsing Luxon is not an NLP tool and isn't suitable for all date parsing jobs. But it can do some parsing: 1. Direct support for several well-known formats, including most valid ISO 8601 formats 2. An ad-hoc parser for parsing specific formats ## Parsing technical formats ### ISO 8601 Luxon supports a wide range of valid ISO 8601 formats through the `fromISO` method. ```js DateTime.fromISO("2016-05-25"); ``` All of these are parsable by `fromISO`: ``` 2016 2016-05 201605 2016-05-25 20160525 2016-05-25T09 2016-05-25T09:24 2016-05-25T09:24:15 2016-05-25T09:24:15.123 2016-05-25T0924 2016-05-25T092415 2016-05-25T092415.123 2016-05-25T09:24:15,123 2016-W21-3 2016W213 2016-W21-3T09:24:15.123 2016W213T09:24:15.123 2016-200 2016200 2016-200T09:24:15.123 09:24 09:24:15 09:24:15.123 09:24:15,123 ``` - In addition, all the times support offset arguments like "Z" and "+06:00". - Missing lower-order values are always set to the minimum possible value; i.e. it always parses to a full DateTime. For example, "2016-05-25" parses to midnight of that day. "2016-05" parses to the first of the month, etc. - The time is parsed as a local time if no offset is specified, but see the method docs to see your options, and also check out [time zone docs](zones.md) for more details. ### HTTP and RFC2822 Luxon also provides parsing for strings formatted according to RFC 2822 and the HTTP header specs (RFC 850 and 1123): ```js DateTime.fromRFC2822("Tue, 01 Nov 2016 13:23:12 +0630"); DateTime.fromHTTP("Sunday, 06-Nov-94 08:49:37 GMT"); DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT"); ``` ### SQL Luxon accepts SQL dates, times, and datetimes, via `fromSQL`: ```js DateTime.fromSQL("2017-05-15"); DateTime.fromSQL("2017-05-15 09:24:15"); DateTime.fromSQL("09:24:15"); ``` It works similarly to `fromISO`, so see above for additional notes. ### Unix timestamps Luxon can parse numerical [Unix timestamps](https://en.wikipedia.org/wiki/Unix_time): ```js DateTime.fromMillis(1542674993410); DateTime.fromSeconds(1542674993); ``` Both methods accept the same options, which allow you to specify a timezone, calendar, and/or numbering system. ### JS Date Object A native JS `Date` object can be converted into a `DateTime` using `DateTime.fromJSDate`. An optional `zone` parameter can be provided to set the zone on the resulting object. ## Ad-hoc parsing ### Consider alternatives You generally shouldn't use Luxon to parse arbitrarily formatted date strings: 1. If the string was generated by a computer for programmatic access, use a standard format like ISO 8601. Then you can parse it using `DateTime.fromISO`. 2. If the string is typed out by a human, it may not conform to the format you specify when asking Luxon to parse it. Luxon is quite strict about the format matching the string exactly. Sometimes, though, you get a string from some legacy system in some terrible ad-hoc format and you need to parse it. ### fromFormat See `DateTime.fromFormat` for the method signature. A brief example: ```js DateTime.fromFormat("May 25 1982", "LLLL dd yyyy"); ``` ### Intl Luxon supports parsing internationalized strings: ```js DateTime.fromFormat("mai 25 1982", "LLLL dd yyyy", { locale: "fr" }); ``` Note, however, that Luxon derives the list of strings that can match, say, "LLLL" (and their meaning) by introspecting the environment's Intl implementation. Thus the exact strings may in some cases be environment-specific. You also need the Intl API available on the target platform (see the [support matrix](matrix.md)). ### Limitations Not every token supported by `DateTime#toFormat` is supported in the parser. For example, there's no `ZZZZ` or `ZZZZZ` tokens. This is for a few reasons: - Luxon relies on natively-available functionality that only provides the mapping in one direction. We can ask what the named offset is and get "Eastern Standard Time" but not ask what "Eastern Standard Time" is most likely to mean. - Some things are ambiguous. There are several Eastern Standard Times in different countries and Luxon has no way to know which one you mean without additional information (such as that the zone is America/New_York) that would make EST superfluous anyway. Similarly, the single-letter month and weekday formats (EEEEE) that are useful in displaying calendars graphically can't be parsed because of their ambiguity. - Because of the limitations above, Luxon also doesn't support the "macro" tokens that include offset names, such as "ttt" and "FFFF". ### Parsing Two Digit Years In order to parse a two digit string as a year (or ISO week year), the `yy` (and `kk`) token must use a cutoff year after which the year being parsed is interpreted as referring to the current century. By default, the cutoff year is set to 60, meaning that the string "60" is parsed as the year 2060, and the string "61" is parsed as the year 1961. The cutoff year can be configured using `Settings.twoDigitCutoffYear`. ### Debugging There are two kinds of things that can go wrong when parsing a string: a) you make a mistake with the tokens or b) the information parsed from the string does not correspond to a valid date. To help you sort that out, Luxon provides a method called `fromFormatExplain`. It takes the same arguments as `fromFormat` but returns a map of information about the parse that can be useful in debugging. For example, here the code is using "MMMM" where "MMM" was needed. You can see the regex Luxon uses and see that it didn't match anything: ```js > DateTime.fromFormatExplain("Aug 6 1982", "MMMM d yyyy") { input: 'Aug 6 1982', tokens: [ { literal: false, val: 'MMMM' }, { literal: false, val: ' ' }, { literal: false, val: 'd' }, { literal: false, val: ' ' }, { literal: false, val: 'yyyy' } ], regex: '(January|February|March|April|May|June|July|August|September|October|November|December)( )(\\d\\d?)( )(\\d{4})', matches: {}, result: {}, zone: null } ``` If you parse something and get an invalid date, the debugging steps are slightly different. Here, we're attempting to parse August 32nd, which doesn't exist: ```js var d = DateTime.fromFormat("August 32 1982", "MMMM d yyyy"); d.isValid; //=> false d.invalidReason; //=> 'day out of range' ``` For more on validity and how to debug it, see [validity](validity.md). You may find more comprehensive tips there. But as it applies specifically to `fromFormat`, again try `fromFormatExplain`: ```js > DateTime.fromFormatExplain("August 32 1982", "MMMM d yyyy") { input: 'August 32 1982', tokens: [ { literal: false, val: 'MMMM' }, { literal: false, val: ' ' }, { literal: false, val: 'd' }, { literal: false, val: ' ' }, { literal: false, val: 'yyyy' } ], regex: '(January|February|March|April|May|June|July|August|September|October|November|December)( )(\\d\\d?)( )(\\d{4})', matches: { M: 8, d: 32, y: 1982 }, result: { month: 8, day: 32, year: 1982 }, zone: null } ``` Because Luxon was able to parse the string without difficulty, the output is a lot richer. And you can see that the "day" field is set to 32. Combined with the "out of range" explanation above, that should clear up the situation. ### Table of tokens (Examples below given for `2014-08-06T13:07:04.054` considered as a local time in America/New_York). Note that many tokens supported by the [formatter](formatting.md) are **not** supported by the parser. | Standalone token | Format token | Description | Example | | ---------------- | ------------ | ----------------------------------------------------------------- | --------------------------- | | S | | millisecond, no padding | `54` | | SSS | | millisecond, padded to 3 | `054` | | u | | fractional seconds, (5 is a half second, 54 is slightly more) | `54` | | uu | | fractional seconds, (one or two digits) | `05` | | uuu | | fractional seconds, (only one digit) | `5` | | s | | second, no padding | `4` | | ss | | second, padded to 2 padding | `04` | | m | | minute, no padding | `7` | | mm | | minute, padded to 2 | `07` | | h | | hour in 12-hour time, no padding | `1` | | hh | | hour in 12-hour time, padded to 2 | `01` | | H | | hour in 24-hour time, no padding | `13` | | HH | | hour in 24-hour time, padded to 2 | `13` | | Z | | narrow offset | `+5` | | ZZ | | short offset | `+05:00` | | ZZZ | | techie offset | `+0500` | | z | | IANA zone | `America/New_York` | | a | | meridiem | `AM` | | d | | day of the month, no padding | `6` | | dd | | day of the month, padded to 2 | `06` | | E | c | day of the week, as number from 1-7 (Monday is 1, Sunday is 7) | `3` | | EEE | ccc | day of the week, as an abbreviate localized string | `Wed` | | EEEE | cccc | day of the week, as an unabbreviated localized string | `Wednesday` | | M | L | month as an unpadded number | `8` | | MM | LL | month as an padded number | `08` | | MMM | LLL | month as an abbreviated localized string | `Aug` | | MMMM | LLLL | month as an unabbreviated localized string | `August` | | y | | year, 1-6 digits, very literally | `2014` | | yy | | two-digit year, interpreted as > 1960 by default (also accepts 4) | `14` | | yyyy | | four-digit year | `2014` | | yyyyy | | four- to six-digit years | `10340` | | yyyyyy | | six-digit years | `010340` | | G | | abbreviated localized era | `AD` | | GG | | unabbreviated localized era | `Anno Domini` | | GGGGG | | one-letter localized era | `A` | | kk | | ISO week year, unpadded | `17` | | kkkk | | ISO week year, padded to 4 | `2014` | | W | | ISO week number, unpadded | `32` | | WW | | ISO week number, padded to 2 | `32` | | o | | ordinal (day of year), unpadded | `218` | | ooo | | ordinal (day of year), padded to 3 | `218` | | q | | quarter, no padding | `3` | | D | | localized numeric date | `9/6/2014` | | DD | | localized date with abbreviated month | `Aug 6, 2014` | | DDD | | localized date with full month | `August 6, 2014` | | DDDD | | localized date with full month and weekday | `Wednesday, August 6, 2014` | | t | | localized time | `1:07 AM` | | tt | | localized time with seconds | `1:07:04 PM` | | T | | localized 24-hour time | `13:07` | | TT | | localized 24-hour time with seconds | `13:07:04` | | f | | short localized date and time | `8/6/2014, 1:07 PM` | | ff | | less short localized date and time | `Aug 6, 2014, 1:07 PM` | | F | | short localized date and time with seconds | `8/6/2014, 1:07:04 PM` | | FF | | less short localized date and time with seconds | `Aug 6, 2014, 1:07:04 PM` | | ' | | literal start/end, characters between are not tokenized | `'T'` | moment-luxon-93c85a3/docs/tour.md000066400000000000000000000161551477254173100170030ustar00rootroot00000000000000# A quick tour Luxon is a library that makes it easier to work with dates and times in JavaScript. If you want, add and subtract them, format and parse them, ask them hard questions, and so on, Luxon provides a much easier and comprehensive interface than the native types it wraps. We're going to talk about the most immediately useful subset of that interface. This is going to be a bit brisk, but keep in mind that the API docs are comprehensive, so if you want to know more, feel free to [dive into them](https://moment.github.io/luxon/api-docs/index.html). ## Your first DateTime The most important class in Luxon is `DateTime`. A DateTime represents a specific millisecond in time, along with a time zone and a locale. Here's one that represents May 15, 2017 at 8:30 in the morning: ```js const dt = DateTime.local(2017, 5, 15, 8, 30); ``` [DateTime.local](../class/src/datetime.js~DateTime.html#static-method-local) takes any number of arguments, all the way out to milliseconds (months are 1-indexed). Underneath, this is similar to a JavaScript Date object. But we've decorated it with lots of useful methods. ## Creating a DateTime There are lots of ways to create a DateTime by parsing strings or constructing them out of parts. You've already seen one, `DateTime.local()`, but let's talk about three more. ### Get the current date and time To get the current time, just do this: ```js const now = DateTime.now(); ``` This is really the equivalent to calling `DateTime.local()` with no arguments, but it's a little clearer. ### Create from an object The most powerful way to create a DateTime instance is to provide an object containing all the information: ```js dt = DateTime.fromObject({day: 22, hour: 12 }, { zone: 'America/Los_Angeles', numberingSystem: 'beng'}) ``` Don't worry too much about the properties you don't understand yet; the point is that you can set every attribute of a DateTime when you create it. One thing to notice from the example is that we just set the day and hour; the year and month get defaulted to the current one and the minutes, seconds, and milliseconds get defaulted to 0. So `DateTime.fromObject` is sort of the power user interface. ### Parse from ISO 8601 Luxon has lots of parsing capabilities, but the most important one is parsing [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) strings, because they're more-or-less the standard wire format for dates and times. Use `DateTime.fromISO`. ```js DateTime.fromISO("2017-05-15") //=> May 15, 2017 at midnight DateTime.fromISO("2017-05-15T08:30:00") //=> May 15, 2017 at 8:30 ``` You can parse a bunch of other formats, including [your own custom ones](parsing.md). ## Getting to know your DateTime instance Now that we've made some DateTimes, let's see what we can ask of it. ### toString The first thing we want to see is the DateTime as a string. Luxon returns ISO 8601 strings: ```js DateTime.now().toString(); //=> '2017-09-14T03:20:34.091-04:00' ``` ### Getting at components We can get at the components of the time individually through getters. For example: ```js dt = DateTime.now(); dt.year //=> 2017 dt.month //=> 9 dt.day //=> 14 dt.second //=> 47 dt.weekday //=> 4 ``` ### Other fun accessors ```js dt.zoneName //=> 'America/New_York' dt.offset //=> -240 dt.daysInMonth //=> 30 ``` There are lots more! ## Formatting your DateTime You may want to output your DateTime to a string for a machine or a human to read. Luxon has lots of tools for this, but two of them are most important. If you want to format a human-readable string, use `toLocaleString`: ```js dt.toLocaleString() //=> '9/14/2017' dt.toLocaleString(DateTime.DATETIME_MED) //=> 'September 14, 3:21 AM' ``` This works well across different locales (languages) by letting the browser figure out what order the different parts go in and how to punctuate them. If you want the string read by another program, you almost certainly want to use `toISO`: ```js dt.toISO() //=> '2017-09-14T03:21:47.070-04:00' ``` Custom formats are also supported. See [formatting](formatting). ## Transforming your DateTime ### Immutability Luxon objects are immutable. That means that you can't alter them in place, just create altered copies. Throughout the documentation, we use terms like "alter", "change", and "set" loosely, but rest assured we mean "create a new instance with different properties". ### Math This is easier to show than to tell. All of these calls return new DateTime instances: ```js var dt = DateTime.now(); dt.plus({ hours: 3, minutes: 2 }); dt.minus({ days: 7 }); dt.startOf('day'); dt.endOf('hour'); ``` ### Set You can create new instances by overriding specific properties: ```js var dt = DateTime.now(); dt.set({hour: 3}).hour //=> 3 ``` ## Intl Luxon provides several different Intl capabilities, but the most important one is in formatting: ```js var dt = DateTime.now(); var f = {month: 'long', day: 'numeric'}; dt.setLocale('fr').toLocaleString(f) //=> '14 septembre' dt.setLocale('en-GB').toLocaleString(f) //=> '14 September' dt.setLocale('en-US').toLocaleString(f) //=> 'September 14' ``` Luxon's Info class can also list months or weekdays for different locales: ```js Info.months('long', {locale: 'fr'}) //=> [ 'janvier', 'février', 'mars', 'avril', ... ] ``` ## Time zones Luxon supports time zones. There's a whole [big section](zones) about it. But briefly, you can create DateTimes in specific zones and change their zones: ```js DateTime.fromObject({}, {zone: 'America/Los_Angeles'}); // now, but expressed in LA's local time DateTime.now().setZone("America/Los_Angeles"); // same ``` Luxon also supports UTC directly: ```js DateTime.utc(2017, 5, 15); DateTime.utc(); // now, in UTC time zone DateTime.now().toUTC(); DateTime.utc().toLocal(); ``` ## Durations The Duration class represents a quantity of time such as "2 hours and 7 minutes". You create them like this: ```js var dur = Duration.fromObject({ hours: 2, minutes: 7 }); ``` They can be added or subtracted from DateTimes like this: ```js dt.plus(dur); ``` They have getters just like DateTime: ```js dur.hours //=> 2 dur.minutes //=> 7 dur.seconds //=> 0 ``` And some other useful stuff: ```js dur.as('seconds') //=> 7620 dur.toObject() //=> { hours: 2, minutes: 7 } dur.toISO() //=> 'PT2H7M' ``` You can also format, negate, and normalize them. See it all in the `Duration` API docs. ## Intervals Intervals are a specific period of time, such as "between now and midnight". They're really a wrapper for two DateTimes that form its endpoints. Here's what you can do with them: ```js now = DateTime.now(); later = DateTime.local(2020, 10, 12); i = Interval.fromDateTimes(now, later); i.length() //=> 97098768468 i.length('years') //=> 3.0762420239726027 i.contains(DateTime.local(2019)) //=> true i.toISO() //=> '2017-09-14T04:07:11.532-04:00/2020-10-12T00:00:00.000-04:00' i.toString() //=> '[2017-09-14T04:07:11.532-04:00 – 2020-10-12T00:00:00.000-04:00) ``` Intervals can be split up into smaller intervals, perform set-like operations with other intervals, and few other handy features. See the `Interval` API docs. moment-luxon-93c85a3/docs/upgrading.md000066400000000000000000000073241477254173100177700ustar00rootroot00000000000000# Upgrading Luxon ## 2.x to 3.0 Version 3.0 has one breaking change: specifying "system" as the zone always results in the system zone, regardless of what you have the default set to. To get the default zone (whatever it is set to), use "default": ```js Settings.defaultZone = "America/Chicago"; DateTime.now().setZone("default") // results in Chicago time DateTime.now().setZone("system") // uses the user's system time ``` If this seems obvious, just be aware that it didn't work like that before! ## 1.x to 2.0 Version 2.0 of Luxon has a number of breaking changes. ### Environment support Luxon 2.0 does not support Node < 12, or any version of IE. It also only supports newer versions of major browsers. This change allows Luxon to make more assumptions about what's supported in the environment and will allow Luxon's code to simplify. See the [Support Matrix](matrix.md) for more. For this same reason, a polyfilled build is no longer provided; everything Luxon needs comes standard on browsers. ### Breaking signature changes There are many more specific breaking changes. Most are aimed and making Luxon's handling of option parameters more consistent. #### fromObject `DateTime.fromObject()` and `Duration.fromObject()` now accept two parameters: one for the object and one for the options. For example: ```js // Luxon 1.x DateTime.fromObject({ hour: 3, minute: 2, zone: "America/New_York", locale: "ru" }); Duration.fromObject({ hours: 3, minutes: 2, conversionAccuracy: "casual", locale: "ru" }); // vs Luxon 2.x DateTime.fromObject({ hour: 3, minute: 2 }, { zone: "America/New_York", locale: "ru" }); Duration.fromObject({ hours: 3, minutes: 2 }, { conversionAccuracy: "casual", locale: "ru" }); ``` #### toLocaleString In Luxon 1.x, you can mix Intl options with overrides of the DateTime configuration into the same options parameter. These are now two separate parameters: ```js // Luxon 1.x DateTime.now().toLocaleString({ hour: "2-digit", locale: "ru" }) // vs Luxon 2.x DateTime.now().toLocaleString({ hour: "2-digit" }, { locale: "ru" }) ``` #### System zone The zone of the executing environment (e.g. the time set on the computer running the browser running Luxon), is now called "system" instead of "local" to reduce confusion. ```js DateTime.fromObject({}, { zone: "local" }) // still works DateTime.fromObject({}, { zone: "system" }) // preferred DateTime.fromObject({}, { zone: "system" }).zone // => type is SystemZone DateTime.fromObject({}, { zone: "system" }).zone.type // => "system" ``` #### Default zone Luxon 2.x cleans up the handling of `Settings.defaultZone`: ```js // setting Settings.defaultZone = "America/New_York"; // can take a string Settings.defaultZone = IANAZone.create("America/New_York"); // or a Zone instance // getting Settings.defaultZone //=> a Zone instance ``` The most significant breaking change here is that `Settings.defaultZoneName` no longer exists. #### Other breaking changes * `DateTime#toObject` no longer accepts an `includeConfig` option * `resolvedLocaleOpts` is now `resolvedLocaleOptions` * `Zone#universal` is now `Zone#isUniversal` ### Non-breaking changes * `DateTime.local()` and `DateTime.utc()` now take an options parameter for setting zone and locale, same as `fromObject()`. ### A note We originally had more ambitious plans for Luxon 2.0: a port to Typescript, an overhaul of error handling, and lots of other changes. The problem is that we're very busy, and in the meantime browsers have evolved quickly, the mistakes in our API bothered a lot of developers, and our need to support old environments made Luxon more difficult to change. So we made a basic set of changes to give us some operating room. And hopefully someday we'll get back to those more ambitious plans. moment-luxon-93c85a3/docs/validity.md000066400000000000000000000056631477254173100176410ustar00rootroot00000000000000# Validity ## Invalid DateTimes One of the most irritating aspects of programming with time is that it's possible to end up with invalid dates. This is a bit subtle: barring integer overflows, there's no count of milliseconds that don't correspond to a valid DateTime, but when working with calendar units, it's pretty easy to say something like "June 400th". Luxon considers that invalid and will mark it accordingly. Unless you've asked Luxon to throw an exception when it creates an invalid DateTime (see more on that below), it will fail silently, creating an instance that doesn't know how to do anything. You can check validity with `isValid`: ```js > var dt = DateTime.fromObject({ month: 6, day: 400 }); dt.isValid //=> false ``` All of the methods or getters that return primitives return degenerate ones: ```js dt.year; //=> NaN dt.toString(); //=> 'Invalid DateTime' dt.toObject(); //=> {} ``` Methods that return other Luxon objects will return invalid ones: ```js dt.plus({ days: 4 }).isValid; //=> false ``` ## Reasons a DateTimes can be invalid The most common way to do that is to over- or underflow some unit: - February 40th - 28:00 - -4 pm - etc But there are other ways to do it: ```js // specify a time zone that doesn't exist DateTime.now().setZone("America/Blorp").isValid; //=> false // provide contradictory information (here, this date is not a Wednesday) DateTime.fromObject({ year: 2017, month: 5, day: 25, weekday: 3 }).isValid; //=> false ``` Note that some other kinds of mistakes throw, based on our judgment that they are more likely programmer errors than data issues: ```js DateTime.now().set({ blorp: 7 }); //=> kerplosion ``` ## Debugging invalid DateTimes Because DateTimes fail silently, they can be a pain to debug. Luxon has some features that can help. ### invalidReason and invalidExplanation Invalid DateTime objects are happy to tell you why they're invalid. `invalidReason` will give you a consistent error code you can use, whereas `invalidExplanation` will spell it out ```js var dt = DateTime.now().setZone("America/Blorp"); dt.invalidReason; //=> 'unsupported zone' dt.invalidExplanation; //=> 'the zone "America/Blorp" is not supported' ``` ### throwOnInvalid You can make Luxon throw whenever it creates an invalid DateTime. The message will combine `invalidReason` and `invalidExplanation`: ```js Settings.throwOnInvalid = true; DateTime.now().setZone("America/Blorp"); //=> Error: Invalid DateTime: unsupported zone: the zone "America/Blorp" is not supported ``` You can of course leave this on in production too, but be sure to try/catch it appropriately. ## Invalid Durations Durations can be invalid too. The easiest way to get one is to diff an invalid DateTime. ```js DateTime.local(2017, 28).diffNow().isValid; //=> false ``` ## Invalid Intervals Intervals can be invalid. This can happen a few different ways: - The end time is before the start time - It was created from invalid DateTime or Duration moment-luxon-93c85a3/docs/why.md000066400000000000000000000110261477254173100166110ustar00rootroot00000000000000# Why does Luxon exist? What's the deal with this whole Luxon thing anyway? Why did I write it? How is it related to the Moment project? What's different about it? This page tries to hash all that out. ## A disclaimer I should clarify here that I'm just one of Moment's maintainers; I'm not in charge and I'm not Moment's creator. The opinions here are solely mine. Finally, none of this is meant to bash Moment, a project I've spent a lot of time on and whose other developers I respect. ## Origin Luxon started because I had a bunch of ideas on how to improve Moment but kept finding Moment wasn't a good codebase to explore them with. Namely: - I wanted to try out some ideas that I thought would provide a better, more explicit API but didn't want to break everything in Moment. - I had an idea on how to provide out-of-the-box, no-data-files-required support for time zones, but Moment's design made that difficult. - I wanted to completely rethink how internationalization worked by using the Intl API that comes packaged in browsers. - I wanted to use a modern JS toolchain, which would require a major retrofit to Moment. So I decided to write something from scratch, a sort of modernized Moment. It's a combination of all the things I learned maintaining Moment and Twix, plus a bunch of fresh ideas. I worked on it in little slivers of spare time for about two years. But now it's ready to actually use, and the Moment team likes it enough that we pulled it under the organization's umbrella. ## Ideas in Luxon Luxon is built around a few core ideas: 1. Keep the basic chainable date wrapper idea from Moment. 1. Make all the types immutable. 1. Make the API explicit; different methods do different things and have well-defined options. 1. Use the Intl API to provide internationalization, including token parsing. Fall back to English if the browser doesn't support those APIs. 1. Abuse the Intl API horribly to provide time zone support. Only possible for modern browsers. 1. Provide more comprehensive duration support. 1. Directly provide interval support. 1. Write inline docs for everything. These ideas have some big advantages: 1. It's much easier to understand and debug code that uses Luxon. 1. Using native browser capabilities for internationalization leads to a much better behavior and is dramatically easier to maintain. 1. Luxon has the best time zone support of any JS date library. 1. Luxon's durations are both flexible and easy to use. 1. The documentation is very good. They also have some disadvantages: 1. Using modern browser capabilities means that the fallback behavior introduces complexity for the programmer. 1. Never keeping internationalized strings in the code base means that some capabilities have to wait until the browsers provide it. 1. Some aspects of the Intl API are browser-dependent, which means Luxon's behavior is too. ## Place in the Moment project Luxon lives in the Moment project because, basically, we all really like it, and it represents a huge improvement. But Luxon doesn't quite fulfill Moment's mandate. Since it sometimes relies on browsers' implementations of the `Intl` specifications, it doesn't provide some of Moment's most commonly-used features on all browsers. Relative date formatting is for instance not supported in IE11 and [other older browsers](https://caniuse.com/?search=Intl%20RelativeTimeFormat). Luxon's Intl features do not work as expected on sufficiently outdated browsers, whereas Moment's all work everywhere. That represents a good tradeoff, IMO, but it's clearly a different one than Moment makes. Luxon makes a major break in API conventions. Part of Moment's charm is that you just call `moment()` on basically anything and you get date, whereas Luxon forces you to decide that you want to call `fromISO` or whatever. The upshot of all that is that Luxon feels like a different library; that's why it's not Moment 3.0. So what is it then? We're not really sure. We're calling it a Moment labs project. Will its ideas get backported into Moment 3? Will it gradually siphon users away from Moment and become the focus of the Moment project? Will the march of modern browsers retire the arguments above and cause us to revisit branding Luxon as Moment? We don't know. There, now you know as much as I do. ## Future plans Luxon is fully usable and I plan to support it indefinitely. It's also largely complete. Luxon will eventually strip out its fallbacks for missing platform features. But overall I expect the core functionality to stay basically as it is, adding mostly minor tweaks and bugfixes. moment-luxon-93c85a3/docs/zones.md000066400000000000000000000423061477254173100171450ustar00rootroot00000000000000# Time zones and offsets Luxon has support for time zones. This page explains how to use them. ## Don't worry! You _usually_ don't need to worry about time zones. Your code runs on a computer with a particular time zone and everything will work consistently in that zone without you doing anything. It's when you want to do complicated stuff _across_ zones that you have to think about it. Even then, here are some pointers to help you avoid situations where you have to think carefully about time zones: 1. Don't make servers think about _local_ times. Configure them to use UTC and write your server's code to work in UTC. Times can often be thought of as a simple count of epoch milliseconds; what you would call that time (e.g. 9:30) in what zone doesn't (again, often) matter. 2. Communicate times between systems in ISO 8601, like `2017-05-15T13:30:34Z` where possible (it doesn't matter if you use Z or some local offset; the point is that it precisely identifies the millisecond on the global timeline). 3. Where possible, only think of time zones as a formatting concern; your application ideally never knows that the time it's working with is called "9:00" until it's being rendered to the user. 4. Barring 3, do as much manipulation of the time (say, adding an hour to the current time) in the client code that's already running in the time zone where the results will matter. All those things will make it less likely you ever need to work explicitly with time zones and may also save you plenty of other headaches. But those aren't possible for some applications; you might need to work with times in zones other than the one the program is running in, for any number of reasons. And that's where Luxon's time zone support comes in. ## Terminology Bear with me here. Time zones are a pain in the ass. Luxon has lots of tools to deal with them, but there's no getting around the fact that they're complicated. The terminology for time zones and offsets isn't well-established. But let's try to impose some order: 1. An **offset** is a difference between the local time and the UTC time, such as +5 (hours) or -12:30. They may be expressed directly in minutes, or in hours, or in a combination of minutes and hours. Here we'll use hours. 1. A **time zone** is a set of rules, associated with a geographical location, that determines the local offset from UTC at any given time. The best way to identify a zone is by its IANA string, such as "America/New_York". That zone says something to the effect of "The offset is -5, except between March and November, when it's -4". 1. A **fixed-offset time zone** is any time zone that never changes offsets, such as UTC. Luxon supports fixed-offset zones directly; they're specified like UTC+7, which you can interpret as "always with an offset of +7". 1. A **named offset** is a time zone-specific name for an offset, such as Eastern Daylight Time. It expresses both the zone (America's EST roughly implies America/New_York) and the current offset (EST means -5). They are also confusing in that they overspecify the offset (e.g. for any given time it is unnecessary to specify EST vs EDT; it's always whichever one is right). They are also ambiguous (BST is both British Summer Time and Bangladesh Standard Time), unstandardized, and internationalized (what would a Frenchman call the US's EST?). For all these reasons, you should avoid them when specifying times programmatically. Luxon only supports their use in formatting. Some subtleties: 1. Multiple zones can have the same offset (think about the US's zones and their Canadian equivalents), though they might not have the same offset all the time, depending on when their DSTs are. Thus zones and offsets have a many-to-many relationship. 1. Just because a time zone doesn't have a DST now doesn't mean it's fixed. Perhaps it had one in the past. Regardless, Luxon does not have first-class access to the list of rules, so it assumes any IANA-specified zone is not fixed and checks for its current offset programmatically. If all this seems too terse, check out these articles. The terminology in them is subtly different but the concepts are the same: - [Time Zones Aren’t Offsets – Offsets Aren’t Time Zones](https://spin.atomicobject.com/2016/07/06/time-zones-offsets/) - [Stack Overflow's timezone wiki page](https://stackoverflow.com/tags/timezone/info) ## Luxon works with time zones Luxon's DateTime class supports zones directly. By default, a date created in Luxon is "in" the local time zone of the machine it's running on. By "in" we mean that the DateTime has, as one of its properties, an associated zone. It's important to remember that a DateTime represents a specific instant in time and that instant has an unambiguous meaning independent of what time zone you're in; the zone is really a piece of social metadata that affects how humans interact with the time, rather than a fact about the passing of time itself. Of course, Luxon is a library for humans, so that social metadata affects Luxon's behavior too. It just doesn't change _what time it is_. Specifically, a DateTime's zone affects its behavior in these ways: 1. Times will be formatted as they would be in that zone. 1. Transformations to the DateTime (such as `plus` or `startOf`) will obey any DSTs in that zone that affect the calculation (see "Math across DSTs" below) Generally speaking, Luxon does not support changing a DateTime's offset, just its zone. That allows it to enforce the behaviors in the list above. The offset for that DateTime is just whatever the zone says it is. If you are unconcerned with the effects above, then you can always give your DateTime a fixed-offset zone. ## Specifying a zone Luxon's API methods that take a zone as an argument all let you specify the zone in a few ways. | Type | Example | Description | | ------------ | ------------------ | ----------------------------------------------------------------- | | IANA | 'America/New_York' | that zone | | system | 'system' | the system's local zone | | default | 'default' | the default zone set by Settings.defaultZone | | UTC | 'utc' | Universal Coordinated Time | | fixed offset | 'UTC+7' | a fixed offset zone | | Zone | new YourZone() | A custom implementation of Luxon's Zone interface (advanced only) | ### IANA support IANA-specified zones are string identifiers like "America/New_York" or "Asia/Tokyo". Luxon gains direct support for them by abusing built-in Intl APIs. If you specify a zone and your environment doesn't support that zone, you'll get an [invalid](validity.md) DateTime. That could be because the environment doesn't support zones at all (generally browsers older than Luxon supports), because for whatever reason it doesn't support that _particular_ zone, or because the zone is just bogus. Like this: ```js bogus = DateTime.local().setZone("America/Bogus"); bogus.isValid; //=> false bogus.invalidReason; //=> 'unsupported zone' ``` ## Creating DateTimes ### System zone by default By default, DateTime instances are created in the system's local zone and parsed strings are interpreted as specifying times in the system's zone. For example, my computer is configured to use `America/New_York`, which has an offset of -4 in May: ```js var local = DateTime.local(2017, 05, 15, 9, 10, 23); local.zoneName; //=> 'America/New_York' local.toString(); //=> '2017-05-15T09:10:23.000-04:00' var iso = DateTime.fromISO("2017-05-15T09:10:23"); iso.zoneName; //=> 'America/New_York' iso.toString(); //=> '2017-05-15T09:10:23.000-04:00' ``` ### Creating DateTimes in a zone Many of Luxon's factory methods allow you to tell it specifically what zone to create the DateTime in: ```js var overrideZone = DateTime.fromISO("2017-05-15T09:10:23", { zone: "Europe/Paris" }); overrideZone.zoneName; //=> 'Europe/Paris' overrideZone.toString(); //=> '2017-05-15T09:10:23.000+02:00' ``` Note two things: 1. The date and time specified in the string was interpreted as a Parisian local time (i.e. it's the time that corresponds to what would be called 9:10 _there_). 2. The resulting DateTime object is in Europe/Paris. Those are conceptually independent (i.e. Luxon could have converted the time to the system zone), but in practice it's more convenient for the same option to govern both. In addition, one static method, `utc()`, specifically interprets the input as being specified in UTC. It also returns a DateTime in UTC: ```js var utc = DateTime.utc(2017, 05, 15, 9, 10, 23); utc.zoneName; //=> 'UTC' utc.toString(); //=> '2017-05-15T09:10:23.000Z' ``` ### Strings that specify an offset Some input strings may specify an offset as part of the string itself. In these cases, Luxon interprets the time as being specified with that offset, but converts the resulting DateTime into the system's local zone: ```js var specifyOffset = DateTime.fromISO("2017-05-15T09:10:23-09:00"); specifyOffset.zoneName; //=> 'America/New_York' specifyOffset.toString(); //=> '2017-05-15T14:10:23.000-04:00' var specifyZone = DateTime.fromFormat( "2017-05-15T09:10:23 Europe/Paris", "yyyy-MM-dd'T'HH:mm:ss z" ); specifyZone.zoneName; //=> 'America/New_York' specifyZone.toString(); //=> '2017-05-15T03:10:23.000-04:00' ``` ...unless a zone is specified as an option (see previous section), in which case the DateTime gets converted to _that_ zone: ```js var specifyOffsetAndOverrideZone = DateTime.fromISO("2017-05-15T09:10:23-09:00", { zone: "Europe/Paris" }); specifyOffsetAndOverrideZone.zoneName; //=> 'Europe/Paris' specifyOffsetAndOverrideZone.toString(); //=> '2017-05-15T20:10:23.000+02:00' ``` ### setZone Finally, some parsing functions allow you to "keep" the zone in the string as the DateTime's zone. Note that if only an offset is provided by the string, the zone will be a fixed-offset one, since Luxon doesn't know which zone is meant, even if you do. ```js var keepOffset = DateTime.fromISO("2017-05-15T09:10:23-09:00", { setZone: true }); keepOffset.zoneName; //=> 'UTC-9' keepOffset.toString(); //=> '2017-05-15T09:10:23.000-09:00' var keepZone = DateTime.fromFormat("2017-05-15T09:10:23 Europe/Paris", "yyyy-MM-dd'T'HH:mm:ss z", { setZone: true }); keepZone.zoneName; //=> 'Europe/Paris' keepZone.toString(); //=> '2017-05-15T09:10:23.000+02:00' ``` ## Changing zones ### setZone Luxon objects are immutable, so when we say "changing zones" we really mean "creating a new instance with a different zone". Changing zone generally means "change the zone in which this DateTime is expressed (and according to which rules it is manipulated), but don't change the underlying timestamp." For example: ```js var local = DateTime.local(); var rezoned = local.setZone("America/Los_Angeles"); // different local times with different offsets local.toString(); //=> '2017-09-13T18:30:51.141-04:00' rezoned.toString(); //=> '2017-09-13T15:30:51.141-07:00' // but actually the same time local.valueOf() === rezoned.valueOf(); //=> true ``` ### keepLocalTime Generally, it's best to think of the zone as a sort of metadata that you slide around independent of the underlying count of milliseconds. However, sometimes that's not what you want. Sometimes you want to change zones while keeping the local time fixed and instead altering the timestamp. Luxon supports this: ```js var local = DateTime.local(); var rezoned = local.setZone("America/Los_Angeles", { keepLocalTime: true }); local.toString(); //=> '2017-09-13T18:36:23.187-04:00' rezoned.toString(); //=> '2017-09-13T18:36:23.187-07:00' local.valueOf() === rezoned.valueOf(); //=> false ``` If you find that confusing, I recommend just not using it. On the other hand, if you find yourself using this all the time, you are probably doing something wrong. ## Accessors Luxon DateTimes have a few different accessors that let you find out about the zone and offset: ```js var dt = DateTime.local(); dt.zoneName; //=> 'America/New_York' dt.offset; //=> -240 dt.offsetNameShort; //=> 'EDT' dt.offsetNameLong; //=> 'Eastern Daylight Time' dt.isOffsetFixed; //=> false dt.isInDST; //=> true ``` Those are all documented in the [DateTime API docs](https://moment.github.io/luxon/api-docs/index.html#datetime). ## DST weirdness Because our ancestors were morons, they opted for a system wherein many governments shift around the local time twice a year for no good reason. And it's not like they do it in a neat, coordinated fashion. No, they do it whimsically, varying the shifts' timing from country to country (or region to region!) and from year to year. And of course, they do it the opposite way south of the Equator. This is all a tremendous waste of everyone's energy and, er, time, but it is how the world works and a date and time library has to deal with it. Most of the time, DST shifts will happen without you having to do anything about it and everything will just work. Luxon goes to some pains to make DSTs as unweird as possible. But there are exceptions. This section covers them. ### Invalid times Some local times simply don't exist. The Spring Forward DST shift involves shifting the local time forward by (usually) one hour. In my zone, `America/New_York`, on March 12, 2017 the millisecond after `1:59:59.999` is `3:00:00.000`. Thus the times between `2:00:00.000` and `2:59:59.999`, inclusive, don't exist in that zone. But of course, nothing stops a user from constructing a DateTime out of that local time. If you create such a DateTime from scratch, the missing time will be advanced by an hour: ```js DateTime.local(2017, 3, 12, 2, 30).toString(); //=> '2017-03-12T03:30:00.000-04:00' ``` You can also do date math that lands you in the middle of the shift. These also push forward: ```js DateTime.local(2017, 3, 11, 2, 30) .plus({ days: 1 }) .toString(); //=> '2017-03-12T03:30:00.000-04:00' DateTime.local(2017, 3, 13, 2, 30) .minus({ days: 1 }) .toString(); //=> '2017-03-12T03:30:00.000-04:00' ``` ### Ambiguous times Harder to handle are ambiguous times. During Fall Back, some local times happen twice. In my zone, `America/New_York`, on November 5, 2017 the millisecond after `1:59:59.999` became `1:00:00.000`. But of course there was already a 1:00 that day, one hour before this one. So if you create a DateTime with a local time of 1:30, which time do you mean? It's an important question, because they correspond to different moments in time. However, Luxon's behavior here is undefined. It makes no promises about which of the two possible timestamps the instance will represent. Currently, its specific behavior is like this: ```js DateTime.local(2017, 11, 5, 1, 30).offset / 60; //=> -4 DateTime.local(2017, 11, 4, 1, 30).plus({ days: 1 }).offset / 60; //=> -4 DateTime.local(2017, 11, 6, 1, 30).minus({ days: 1 }).offset / 60; //=> -5 ``` In other words, sometimes it picks one and sometimes the other. Luxon doesn't guarantee the specific behavior above. That's just what it happens to do. If you're curious, this lack of definition is because Luxon doesn't actually know that any particular DateTime is an ambiguous time. It doesn't know the time zones rules at all. It just knows the local time does not contradict the offset and leaves it at that. To find out the time is ambiguous and define exact rules for how to resolve it, Luxon would have to test nearby times to see if it can find duplicate local time, and it would have to do that on every creation of a DateTime, regardless of whether it was anywhere near a real DST shift. Because that's onerous, Luxon doesn't bother. ### Math across DSTs There's a whole [section](math.md) about date and time math, but it's worth highlighting one thing here: when Luxon does math across DSTs, it adjusts for them when working with higher-order, variable-length units like days, weeks, months, and years. When working with lower-order, exact units like hours, minutes, and seconds, it does not. For example, DSTs mean that days are not always the same length: one day a year is (usually) 23 hours long and another is 25 hours long. Luxon makes sure that adding days takes that into account. On the other hand, an hour is always 3,600,000 milliseconds. An easy way to think of it is that if you add a day to a DateTime, you should always get the same time the next day, regardless of any intervening DSTs. On the other hand, adding 24 hours will result in DateTime that is 24 hours later, which may or may not be the same time the next day. In this example, my zone is `America/New_York`, which had a Spring Forward DST in the early hours of March 12. ```js var start = DateTime.local(2017, 3, 11, 10); start.hour; //=> 10, just for comparison start.plus({ days: 1 }).hour; //=> 10, stayed the same start.plus({ hours: 24 }).hour; //=> 11, DST pushed forward an hour ``` ## Changing the default zone By default, Luxon creates DateTimes in the system's zone. However, you can override this behavior globally: ```js Settings.defaultZone = "Asia/Tokyo"; DateTime.local().zoneName; //=> 'Asia/Tokyo' Settings.defaultZone = "utc"; DateTime.local().zoneName; //=> 'UTC' // you can reset by setting to 'system' Settings.defaultZone = "system"; DateTime.local().zoneName; //=> 'America/New_York' ``` moment-luxon-93c85a3/jest.config.js000066400000000000000000000003261477254173100173000ustar00rootroot00000000000000module.exports = { testEnvironment: "node", roots: ["test"], coverageDirectory: "build/coverage", collectCoverageFrom: ["src/**/*.js", "!src/zone.js"], transform: { "^.+\\.js$": "babel-jest", }, }; moment-luxon-93c85a3/package-lock.json000066400000000000000000034307401477254173100177570ustar00rootroot00000000000000{ "name": "luxon", "version": "3.6.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "luxon", "version": "3.6.1", "license": "MIT", "devDependencies": { "@babel/core": "^7.18.6", "@babel/node": "^7.18.6", "@babel/plugin-external-helpers": "^7.18.6", "@babel/preset-env": "^7.18.6", "@rollup/plugin-babel": "^5.3.0", "@rollup/plugin-commonjs": "^19.0.0", "@rollup/plugin-node-resolve": "^13.0.0", "babel-jest": "^28.1.2", "benchmark": "latest", "codecov": "latest", "documentation": "latest", "fs-extra": "^6.0.1", "http-server": "^14.1.1", "husky": "^7.0.0", "jest": "^29.4.3", "lint-staged": "^13.2.1", "prettier": "latest", "rollup": "^2.52.7", "rollup-plugin-terser": "^7.0.2", "uglify-js": "^3.13.10" }, "engines": { "node": ">=12" } }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.20.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.7", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/generator": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz", "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.2.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "peerDependencies": { "@babel/core": "^7.4.0-0" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-wrap-function": "^7.18.9", "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "dependencies": { "@babel/types": "^7.20.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", "@babel/traverse": "^7.20.5", "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/node": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.20.7.tgz", "integrity": "sha512-AQt3gVcP+fpFuoFn4FmIW/+5JovvEoA9og4Y1LrRw0pv3jkl4tujZMMy3X/3ugjLrEy3k1aNywo3JIl3g+jVXQ==", "dev": true, "dependencies": { "@babel/register": "^7.18.9", "commander": "^4.0.1", "core-js": "^3.26.0", "node-environment-flags": "^1.0.5", "regenerator-runtime": "^0.13.11", "v8flags": "^3.1.1" }, "bin": { "babel-node": "bin/babel-node.js" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/parser": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-external-helpers": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.18.6.tgz", "integrity": "sha512-wNqc87qjLvsD1PIMQBzLn1bMuTlGzqLzM/1VGQ22Wm51cbCWS9k71ydp5iZS4hjwQNuTWSn/xbZkkusNENwtZg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-simple-access": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "regenerator-transform": "^0.15.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "dependencies": { "@babel/compat-data": "^7.20.1", "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@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-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.20.2", "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", "@babel/plugin-transform-for-of": "^7.18.8", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.19.6", "@babel/plugin-transform-modules-commonjs": "^7.19.6", "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/register": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", "make-dir": "^2.1.0", "pirates": "^4.0.5", "source-map-support": "^0.5.16" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/runtime": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", "@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.0", "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.3.tgz", "integrity": "sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/console/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/core": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.3.tgz", "integrity": "sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==", "dev": true, "dependencies": { "@jest/console": "^29.4.3", "@jest/reporters": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.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.4.3", "jest-config": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-message-util": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-resolve-dependencies": "^29.4.3", "jest-runner": "^29.4.3", "jest-runtime": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "jest-watcher": "^29.4.3", "micromatch": "^4.0.4", "pretty-format": "^29.4.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/core/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/core/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/core/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/core/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/@jest/core/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/environment": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.3.tgz", "integrity": "sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==", "dev": true, "dependencies": { "@jest/fake-timers": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "jest-mock": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/environment/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/environment/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/environment/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/environment/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/environment/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/environment/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/environment/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/environment/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/environment/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/expect": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.3.tgz", "integrity": "sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==", "dev": true, "dependencies": { "expect": "^29.4.3", "jest-snapshot": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.3.tgz", "integrity": "sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.3.tgz", "integrity": "sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.4.3", "jest-mock": "^29.4.3", "jest-util": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/fake-timers/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/fake-timers/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/fake-timers/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/fake-timers/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/fake-timers/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/fake-timers/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/globals": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.3.tgz", "integrity": "sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==", "dev": true, "dependencies": { "@jest/environment": "^29.4.3", "@jest/expect": "^29.4.3", "@jest/types": "^29.4.3", "jest-mock": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/globals/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/globals/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/globals/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/globals/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/globals/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/globals/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/reporters": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.3.tgz", "integrity": "sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/reporters/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/reporters/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/reporters/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/reporters/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/@jest/reporters/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/schemas": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.24.1" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/@jest/source-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.3.tgz", "integrity": "sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==", "dev": true, "dependencies": { "@jest/console": "^29.4.3", "@jest/types": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/test-result/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/test-result/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/test-result/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/test-result/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/test-result/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/test-result/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/test-sequencer": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz", "integrity": "sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==", "dev": true, "dependencies": { "@jest/test-result": "^29.4.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/test-sequencer/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/test-sequencer/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/test-sequencer/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/@jest/test-sequencer/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/transform": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^28.1.3", "@jridgewell/trace-mapping": "^0.3.13", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^28.1.3", "jest-regex-util": "^28.0.2", "jest-util": "^28.1.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.1" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/transform/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/types": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, "dependencies": { "@jest/schemas": "^28.1.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/types/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/types/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "@types/babel__core": "^7.1.9", "rollup": "^1.20.0||^2.0.0" }, "peerDependenciesMeta": { "@types/babel__core": { "optional": true } } }, "node_modules/@rollup/plugin-commonjs": { "version": "19.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.2.tgz", "integrity": "sha512-gBjarfqlC7qs0AutpRW/hrFNm+cd2/QKxhwyFa+srbg1oX7rDsEU3l+W7LAUhsAp9mPJMAkXDhLbQaVwEaE8bA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "commondir": "^1.0.1", "estree-walker": "^2.0.1", "glob": "^7.1.6", "is-reference": "^1.2.1", "magic-string": "^0.25.7", "resolve": "^1.17.0" }, "engines": { "node": ">= 8.0.0" }, "peerDependencies": { "rollup": "^2.38.3" } }, "node_modules/@rollup/plugin-node-resolve": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", "deepmerge": "^4.2.2", "is-builtin-module": "^3.1.0", "is-module": "^1.0.0", "resolve": "^1.19.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "rollup": "^2.42.0" } }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "engines": { "node": ">= 8.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/pluginutils/node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, "node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, "node_modules/@sinonjs/commons": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0" } }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/@types/babel__core": { "version": "7.1.20", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { "version": "7.6.4", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" } }, "node_modules/@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "node_modules/@types/extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.1.tgz", "integrity": "sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==", "dev": true }, "node_modules/@types/github-slugger": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==", "dev": true }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/mdast": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dev": true, "dependencies": { "@types/unist": "*" } }, "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "node_modules/@types/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw==", "dev": true }, "node_modules/@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, "node_modules/@types/yargs": { "version": "17.0.17", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/@vue/compiler-core": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", "dev": true, "optional": true, "dependencies": { "@babel/parser": "^7.16.4", "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-dom": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", "dev": true, "optional": true, "dependencies": { "@vue/compiler-core": "3.2.45", "@vue/shared": "3.2.45" } }, "node_modules/@vue/compiler-sfc": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", "dev": true, "optional": true, "dependencies": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.45", "@vue/compiler-dom": "3.2.45", "@vue/compiler-ssr": "3.2.45", "@vue/reactivity-transform": "3.2.45", "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", "source-map": "^0.6.1" } }, "node_modules/@vue/compiler-ssr": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", "dev": true, "optional": true, "dependencies": { "@vue/compiler-dom": "3.2.45", "@vue/shared": "3.2.45" } }, "node_modules/@vue/reactivity-transform": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", "dev": true, "optional": true, "dependencies": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.45", "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "node_modules/@vue/shared": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==", "dev": true, "optional": true }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "dependencies": { "debug": "4" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", "dev": true, "engines": { "node": ">=0.6.10" } }, "node_modules/array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" } }, "node_modules/babel-jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", "dev": true, "dependencies": { "@jest/transform": "^28.1.3", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^28.1.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "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" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-jest-hoist": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^28.1.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "dependencies": { "safe-buffer": "5.1.2" }, "engines": { "node": ">= 0.8" } }, "node_modules/basic-auth/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", "dev": true, "dependencies": { "lodash": "^4.17.4", "platform": "^1.3.3" } }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001520", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ] }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-legacy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/ci-info": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, "engines": { "node": ">=8" } }, "node_modules/cli-truncate": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/codecov": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", "deprecated": "https://about.codecov.io/blog/codecov-uploader-deprecation-plan/", "dev": true, "dependencies": { "argv": "0.0.2", "ignore-walk": "3.0.4", "js-yaml": "3.14.1", "teeny-request": "7.1.1", "urlgrey": "1.0.0" }, "bin": { "codecov": "bin/codecov" }, "engines": { "node": ">=4.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "node_modules/core-js": { "version": "3.27.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.0.tgz", "integrity": "sha512-wY6cKosevs430KRkHUIsvepDXHGjlXOZO3hYXNyqpD6JvB0X28aXyv0t1Y1vZMwE7SoKmtfa6IASHCPN52FwBQ==", "dev": true, "hasInstallScript": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { "version": "3.27.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.0.tgz", "integrity": "sha512-spN2H4E/wocMML7XtbKuqttHHM+zbF3bAdl9mT4/iyFaF33bowQGjxiWNWyvUJGH9F+hTgnhWziiLtwu3oC/Qg==", "dev": true, "dependencies": { "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, "engines": { "node": ">= 0.4.0" } }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true, "optional": true }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "dev": true, "dependencies": { "character-entities": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/doctrine-temporary-fork": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.1.0.tgz", "integrity": "sha512-nliqOv5NkE4zMON4UA6AMJE6As35afs8aYXATpU4pTUdIKiARZwrJVEP1boA3Rx1ZXHVkwxkhcq4VkqvsuRLsA==", "dev": true, "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/documentation": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/documentation/-/documentation-14.0.1.tgz", "integrity": "sha512-Y/brACCE3sNnDJPFiWlhXrqGY+NelLYVZShLGse5bT1KdohP4JkPf5T2KNq1YWhIEbDYl/1tebRLC0WYbPQxVw==", "dev": true, "dependencies": { "@babel/core": "^7.18.10", "@babel/generator": "^7.18.10", "@babel/parser": "^7.18.11", "@babel/traverse": "^7.18.11", "@babel/types": "^7.18.10", "chalk": "^5.0.1", "chokidar": "^3.5.3", "diff": "^5.1.0", "doctrine-temporary-fork": "2.1.0", "git-url-parse": "^13.1.0", "github-slugger": "1.4.0", "glob": "^8.0.3", "globals-docs": "^2.4.1", "highlight.js": "^11.6.0", "ini": "^3.0.0", "js-yaml": "^4.1.0", "konan": "^2.1.1", "lodash": "^4.17.21", "mdast-util-find-and-replace": "^2.2.1", "mdast-util-inject": "^1.1.0", "micromark-util-character": "^1.1.0", "parse-filepath": "^1.0.2", "pify": "^6.0.0", "read-pkg-up": "^9.1.0", "remark": "^14.0.2", "remark-gfm": "^3.0.1", "remark-html": "^15.0.1", "remark-reference-links": "^6.0.1", "remark-toc": "^8.0.1", "resolve": "^1.22.1", "strip-json-comments": "^5.0.0", "unist-builder": "^3.0.0", "unist-util-visit": "^4.1.0", "vfile": "^5.3.4", "vfile-reporter": "^7.0.4", "vfile-sort": "^3.0.0", "yargs": "^17.5.1" }, "bin": { "documentation": "bin/documentation.js" }, "engines": { "node": ">=14" }, "optionalDependencies": { "@vue/compiler-sfc": "^3.2.37", "vue-template-compiler": "^2.7.8" } }, "node_modules/documentation/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "node_modules/documentation/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/documentation/node_modules/chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/documentation/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/documentation/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/documentation/node_modules/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.7", "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.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "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" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.3.tgz", "integrity": "sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==", "dev": true, "dependencies": { "@jest/expect-utils": "^29.4.3", "jest-get-type": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/expect/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/expect/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/expect/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/expect/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/expect/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/expect/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/expect/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "dev": true, "dependencies": { "punycode": "^1.3.2" } }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" } }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], "engines": { "node": ">=4.0" }, "peerDependenciesMeta": { "debug": { "optional": true } } }, "node_modules/fs-extra": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { "node": ">=8.0.0" } }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" } }, "node_modules/git-url-parse": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, "dependencies": { "git-up": "^7.0.0" } }, "node_modules/github-slugger": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==", "dev": true }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/globals-docs": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/globals-docs/-/globals-docs-2.4.1.tgz", "integrity": "sha512-qpPnUKkWnz8NESjrCvnlGklsgiQzlq+rcCxoG5uNQ+dNA7cFMCmn231slLAwS2N/PlkzZ3COL8CcS10jXmLHqg==", "dev": true }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { "function-bind": "^1.1.1" }, "engines": { "node": ">= 0.4.0" } }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hast-util-is-element": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", "dev": true, "dependencies": { "@types/hast": "^2.0.0", "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-sanitize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.0.0.tgz", "integrity": "sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ==", "dev": true, "dependencies": { "@types/hast": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-to-html": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", "dev": true, "dependencies": { "@types/hast": "^2.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-is-element": "^2.0.0", "hast-util-whitespace": "^2.0.0", "html-void-elements": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.2", "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-whitespace": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "bin": { "he": "bin/he" } }, "node_modules/highlight.js": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", "dev": true, "engines": { "node": ">=12.0.0" } }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "dependencies": { "parse-passwd": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "dependencies": { "whatwg-encoding": "^2.0.0" }, "engines": { "node": ">=12" } }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "node_modules/html-void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "dependencies": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", "corser": "^2.0.1", "he": "^1.2.0", "html-encoding-sniffer": "^3.0.0", "http-proxy": "^1.18.1", "mime": "^1.6.0", "minimist": "^1.2.6", "opener": "^1.5.1", "portfinder": "^1.0.28", "secure-compare": "3.0.1", "union": "~0.5.0", "url-join": "^4.0.1" }, "bin": { "http-server": "bin/http-server" }, "engines": { "node": ">=12" } }, "node_modules/http-server/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/http-server/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/http-server/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/http-server/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/http-server/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/http-server/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { "node": ">=10.17.0" } }, "node_modules/husky": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", "dev": true, "bin": { "husky": "lib/bin.js" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/typicode" } }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ignore-walk": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", "dev": true, "dependencies": { "minimatch": "^3.0.4" } }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/ini": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/internal-slot": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "engines": { "node": ">=4" } }, "node_modules/is-builtin-module": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", "dev": true, "dependencies": { "builtin-modules": "^3.3.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "dependencies": { "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "dependencies": { "@types/estree": "*" } }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "dependencies": { "is-unc-path": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-ssh": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "dependencies": { "protocols": "^2.0.1" } }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "dependencies": { "unc-path-regex": "^0.1.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "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" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", "integrity": "sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==", "dev": true, "dependencies": { "@jest/core": "^29.4.3", "@jest/types": "^29.4.3", "import-local": "^3.0.2", "jest-cli": "^29.4.3" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-changed-files": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.3.tgz", "integrity": "sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==", "dev": true, "dependencies": { "execa": "^5.0.0", "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.3.tgz", "integrity": "sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==", "dev": true, "dependencies": { "@jest/environment": "^29.4.3", "@jest/expect": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-runtime": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "p-limit": "^3.1.0", "pretty-format": "^29.4.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-circus/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-circus/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-circus/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-circus/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-cli": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.3.tgz", "integrity": "sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==", "dev": true, "dependencies": { "@jest/core": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", "jest-config": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-cli/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-cli/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-config": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.3.tgz", "integrity": "sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.4.3", "@jest/types": "^29.4.3", "babel-jest": "^29.4.3", "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.4.3", "jest-environment-node": "^29.4.3", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-runner": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.4.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "ts-node": { "optional": true } } }, "node_modules/jest-config/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/babel-jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.3.tgz", "integrity": "sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==", "dev": true, "dependencies": { "@jest/transform": "^29.4.3", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.4.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "node_modules/jest-config/node_modules/babel-plugin-jest-hoist": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz", "integrity": "sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/babel-preset-jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz", "integrity": "sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==", "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^29.4.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-config/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-config/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-config/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-config/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-config/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-diff": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.3.tgz", "integrity": "sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-diff/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-docblock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.3.tgz", "integrity": "sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "jest-util": "^29.4.3", "pretty-format": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-each/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-each/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-environment-node": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.3.tgz", "integrity": "sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==", "dev": true, "dependencies": { "@jest/environment": "^29.4.3", "@jest/fake-timers": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "jest-mock": "^29.4.3", "jest-util": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-environment-node/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-environment-node/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-environment-node/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-environment-node/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-environment-node/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-environment-node/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-get-type": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", "dev": true, "dependencies": { "@jest/types": "^28.1.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": "^28.0.2", "jest-util": "^28.1.3", "jest-worker": "^28.1.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz", "integrity": "sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz", "integrity": "sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-message-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.3.tgz", "integrity": "sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.4.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.4.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-mock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.3.tgz", "integrity": "sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "jest-util": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-mock/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-mock/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-mock/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-mock/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-mock/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-mock/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" }, "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { "jest-resolve": { "optional": true } } }, "node_modules/jest-regex-util": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", "dev": true, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/jest-resolve": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.3.tgz", "integrity": "sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz", "integrity": "sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", "jest-snapshot": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-resolve/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-resolve/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-resolve/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-resolve/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-runner": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.3.tgz", "integrity": "sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==", "dev": true, "dependencies": { "@jest/console": "^29.4.3", "@jest/environment": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", "jest-environment-node": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-leak-detector": "^29.4.3", "jest-message-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-runtime": "^29.4.3", "jest-util": "^29.4.3", "jest-watcher": "^29.4.3", "jest-worker": "^29.4.3", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runner/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-runner/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-runner/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-runner/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-runtime": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.3.tgz", "integrity": "sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==", "dev": true, "dependencies": { "@jest/environment": "^29.4.3", "@jest/fake-timers": "^29.4.3", "@jest/globals": "^29.4.3", "@jest/source-map": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.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.4.3", "jest-message-util": "^29.4.3", "jest-mock": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-runtime/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-runtime/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-runtime/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-snapshot": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.3.tgz", "integrity": "sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==", "dev": true, "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/traverse": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.4.3", "graceful-fs": "^4.2.9", "jest-diff": "^29.4.3", "jest-get-type": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "natural-compare": "^1.4.0", "pretty-format": "^29.4.3", "semver": "^7.3.5" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-snapshot/node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "dependencies": { "@jest/types": "^29.4.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.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-snapshot/node_modules/jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "dependencies": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/jest-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, "dependencies": { "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-validate": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.3.tgz", "integrity": "sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", "pretty-format": "^29.4.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-validate/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-watcher": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.3.tgz", "integrity": "sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==", "dev": true, "dependencies": { "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.4.3", "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest-watcher/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-watcher/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-watcher/node_modules/jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "dependencies": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-worker": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest/node_modules/@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/jest/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "node_modules/json5": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/konan": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/konan/-/konan-2.1.1.tgz", "integrity": "sha512-7ZhYV84UzJ0PR/RJnnsMZcAbn+kLasJhVNWsu8ZyVEJYRpGA5XESQ9d/7zOa08U0Ou4cmB++hMNY/3OSV9KIbg==", "dev": true, "dependencies": { "@babel/parser": "^7.10.5", "@babel/traverse": "^7.10.5" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "node_modules/lint-staged": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, "dependencies": { "chalk": "5.2.0", "cli-truncate": "^3.1.0", "commander": "^10.0.0", "debug": "^4.3.4", "execa": "^7.0.0", "lilconfig": "2.1.0", "listr2": "^5.0.7", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", "yaml": "^2.2.1" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { "node": "^14.13.1 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/lint-staged" } }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/lint-staged/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { "node": ">=14" } }, "node_modules/lint-staged/node_modules/execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" }, "engines": { "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/lint-staged/node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { "node": ">=14.18.0" } }, "node_modules/lint-staged/node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { "path-key": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { "mimic-fn": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/listr2": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.19", "log-update": "^4.0.0", "p-map": "^4.0.0", "rfdc": "^1.3.0", "rxjs": "^7.8.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, "engines": { "node": "^14.13.1 || >=16.0.0" }, "peerDependencies": { "enquirer": ">= 2.3.0 < 3" }, "peerDependenciesMeta": { "enquirer": { "optional": true } } }, "node_modules/listr2/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/listr2/node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/listr2/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/listr2/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/listr2/node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/log-update/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/log-update/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { "yallist": "^3.0.2" } }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" }, "engines": { "node": ">=6" } }, "node_modules/make-dir/node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { "tmpl": "1.0.5" } }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/mdast-util-definitions": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz", "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "unist-util-visit": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-find-and-replace": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz", "integrity": "sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==", "dev": true, "dependencies": { "escape-string-regexp": "^5.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mdast-util-from-markdown": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "decode-named-character-reference": "^1.0.0", "mdast-util-to-string": "^3.1.0", "micromark": "^3.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-decode-string": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "unist-util-stringify-position": "^3.0.0", "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz", "integrity": "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==", "dev": true, "dependencies": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-gfm-autolink-literal": "^1.0.0", "mdast-util-gfm-footnote": "^1.0.0", "mdast-util-gfm-strikethrough": "^1.0.0", "mdast-util-gfm-table": "^1.0.0", "mdast-util-gfm-task-list-item": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-autolink-literal": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz", "integrity": "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "ccount": "^2.0.0", "mdast-util-find-and-replace": "^2.0.0", "micromark-util-character": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-footnote": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz", "integrity": "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0", "micromark-util-normalize-identifier": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-strikethrough": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz", "integrity": "sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-table": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz", "integrity": "sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-gfm-task-list-item": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz", "integrity": "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-inject": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz", "integrity": "sha512-CcJ0mHa36QYumDKiZ2OIR+ClhfOM7zIzN+Wfy8tRZ1hpH9DKLCS+Mh4DyK5bCxzE9uxMWcbIpeNFWsg1zrj/2g==", "dev": true, "dependencies": { "mdast-util-to-string": "^1.0.0" } }, "node_modules/mdast-util-to-hast": { "version": "12.2.4", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz", "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", "dev": true, "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-definitions": "^5.0.0", "micromark-util-sanitize-uri": "^1.1.0", "trim-lines": "^3.0.0", "unist-builder": "^3.0.0", "unist-util-generated": "^2.0.0", "unist-util-position": "^4.0.0", "unist-util-visit": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-markdown": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.4.0.tgz", "integrity": "sha512-IjXARf/O8VGx/pc5SZ7syfydq1DYL9vd92orsG5U0b4GNCmAvXzu+n7sbzfIKrXwB0AVrYk3NV2kXl0AIi9LCA==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "longest-streak": "^3.0.0", "mdast-util-to-string": "^3.0.0", "micromark-util-decode-string": "^1.0.0", "unist-util-visit": "^4.0.0", "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-string": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-toc": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-6.1.0.tgz", "integrity": "sha512-0PuqZELXZl4ms1sF7Lqigrqik4Ll3UhbI+jdTrfw7pZ9QPawgl7LD4GQ8MkU7bT/EwiVqChNTbifa2jLLKo76A==", "dev": true, "dependencies": { "@types/extend": "^3.0.0", "@types/github-slugger": "^1.0.0", "@types/mdast": "^3.0.0", "extend": "^3.0.0", "github-slugger": "^1.0.0", "mdast-util-to-string": "^3.1.0", "unist-util-is": "^5.0.0", "unist-util-visit": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-toc/node_modules/mdast-util-to-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-toc/node_modules/unist-util-visit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-toc/node_modules/unist-util-visit-parents": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "node_modules/micromark": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "micromark-core-commonmark": "^1.0.1", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "node_modules/micromark-core-commonmark": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", "micromark-factory-label": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-factory-title": "^1.0.0", "micromark-factory-whitespace": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-html-tag-name": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "node_modules/micromark-extension-gfm": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz", "integrity": "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==", "dev": true, "dependencies": { "micromark-extension-gfm-autolink-literal": "^1.0.0", "micromark-extension-gfm-footnote": "^1.0.0", "micromark-extension-gfm-strikethrough": "^1.0.0", "micromark-extension-gfm-table": "^1.0.0", "micromark-extension-gfm-tagfilter": "^1.0.0", "micromark-extension-gfm-task-list-item": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-types": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-autolink-literal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz", "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==", "dev": true, "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-footnote": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz", "integrity": "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==", "dev": true, "dependencies": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-strikethrough": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz", "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==", "dev": true, "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-table": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz", "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==", "dev": true, "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-tagfilter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz", "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==", "dev": true, "dependencies": { "micromark-util-types": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-gfm-task-list-item": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz", "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==", "dev": true, "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-factory-destination": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-factory-label": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "node_modules/micromark-factory-space": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-factory-title": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "node_modules/micromark-factory-whitespace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-character": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-chunked": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/micromark-util-classify-character": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-combine-extensions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/micromark-util-decode-string": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "node_modules/micromark-util-encode": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ] }, "node_modules/micromark-util-html-tag-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ] }, "node_modules/micromark-util-normalize-identifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/micromark-util-resolve-all": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-util-sanitize-uri": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "node_modules/micromark-util-subtokenize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "node_modules/micromark-util-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ] }, "node_modules/micromark-util-types": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ] }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "bin": { "mime": "cli.js" }, "engines": { "node": ">=4" } }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "optional": true, "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "dependencies": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" } }, "node_modules/node-environment-flags/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" } }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "peerDependenciesMeta": { "encoding": { "optional": true } } }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node_modules/node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, "engines": { "node": ">=10" } }, "node_modules/normalize-package-data/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/normalize-package-data/node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/normalize-package-data/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.getownpropertydescriptors": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", "dev": true, "dependencies": { "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.8" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "dependencies": { "aggregate-error": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" }, "engines": { "node": ">=0.8" } }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/parse-path": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "dependencies": { "protocols": "^2.0.0" } }, "node_modules/parse-url": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "dependencies": { "parse-path": "^7.0.0" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, "dependencies": { "path-root-regex": "^0.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "bin": { "pidtree": "bin/pidtree.js" }, "engines": { "node": ">=0.10" } }, "node_modules/pify": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pify/-/pify-6.1.0.tgz", "integrity": "sha512-KocF8ve28eFjjuBKKGvzOBGzG8ew2OqOOSxTTZhirkzH7h3BI1vyzqlR0qbfcDBve1Yzo3FVlWUAtCRrbVN8Fw==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "dependencies": { "find-up": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "dependencies": { "locate-path": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { "p-limit": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, "node_modules/portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", "mkdirp": "^0.5.6" }, "engines": { "node": ">= 0.12.0" } }, "node_modules/portfinder/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { "ms": "^2.1.1" } }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "optional": true, "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/prettier": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", "dev": true, "dependencies": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.25.16" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, "node_modules/property-information": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/protocols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, "node_modules/qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "dependencies": { "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "node_modules/read-pkg": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", "parse-json": "^5.2.0", "type-fest": "^2.0.0" }, "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, "dependencies": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", "type-fest": "^2.5.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", "dev": true, "dependencies": { "p-locate": "^6.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { "yocto-queue": "^1.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { "p-limit": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/read-pkg-up/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "dependencies": { "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpu-core": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "dev": true, "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsgen": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", "dev": true }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/remark": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.2.tgz", "integrity": "sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "remark-parse": "^10.0.0", "remark-stringify": "^10.0.0", "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-gfm": "^2.0.0", "micromark-extension-gfm": "^2.0.0", "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-html": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-15.0.1.tgz", "integrity": "sha512-7ta5UPRqj8nP0GhGMYUAghZ/DRno7dgq7alcW90A7+9pgJsXzGJlFgwF8HOP1b1tMgT3WwbeANN+CaTimMfyNQ==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "hast-util-sanitize": "^4.0.0", "hast-util-to-html": "^8.0.0", "mdast-util-to-hast": "^12.0.0", "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-parse": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-reference-links": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-6.0.1.tgz", "integrity": "sha512-34wY2C6HXSuKVTRtyJJwefkUD8zBOZOSHFZ4aSTnU2F656gr9WeuQ2dL6IJDK3NPd2F6xKF2t4XXcQY9MygAXg==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "unified": "^10.0.0", "unist-util-visit": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-stringify": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.0.0", "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-toc": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-8.0.1.tgz", "integrity": "sha512-7he2VOm/cy13zilnOTZcyAoyoolV26ULlon6XyCFU+vG54Z/LWJnwphj/xKIDLOt66QmJUgTyUvLVHi2aAElyg==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-toc": "^6.0.0", "unified": "^10.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/resolve.exports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { "node": ">=8" } }, "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "node_modules/rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=10.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-terser": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", "terser": "^5.0.0" }, "peerDependencies": { "rollup": "^2.0.0" } }, "node_modules/rollup-plugin-terser/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/rollup-plugin-terser/node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/rollup-plugin-terser/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/rxjs": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "dependencies": { "tslib": "^2.1.0" } }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, "dependencies": { "mri": "^1.1.0" }, "engines": { "node": ">=6" } }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "dependencies": { "kind-of": "^6.0.2" }, "engines": { "node": ">=8" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "dev": true, "dependencies": { "stubs": "^3.0.0" } }, "node_modules/string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, "engines": { "node": ">=0.6.19" } }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", "dev": true, "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "dev": true }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/teeny-request": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.1", "stream-events": "^1.0.5", "uuid": "^8.0.0" }, "engines": { "node": ">=10" } }, "node_modules/terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { "node": ">=10" } }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trough": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "bin": { "uglifyjs": "bin/uglifyjs" }, "engines": { "node": ">=0.8.0" } }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "dependencies": { "qs": "^6.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/unist-builder": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", "dev": true, "dependencies": { "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-generated": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-is": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz", "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", "dev": true, "dependencies": { "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-stringify-position": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", "dev": true, "dependencies": { "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit-parents": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" } ], "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { "browserslist-lint": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "node_modules/urlgrey": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", "dev": true, "dependencies": { "fast-url-parser": "^1.1.3" } }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/uvu": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", "dev": true, "dependencies": { "dequal": "^2.0.0", "diff": "^5.0.0", "kleur": "^4.0.3", "sade": "^1.7.3" }, "bin": { "uvu": "bin.js" }, "engines": { "node": ">=8" } }, "node_modules/uvu/node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "dependencies": { "homedir-polyfill": "^1.0.1" }, "engines": { "node": ">= 0.10" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "node_modules/vfile": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-message": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-reporter": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-7.0.4.tgz", "integrity": "sha512-4cWalUnLrEnbeUQ+hARG5YZtaHieVK3Jp4iG5HslttkVl+MHunSGNAIrODOTLbtjWsNZJRMCkL66AhvZAYuJ9A==", "dev": true, "dependencies": { "@types/supports-color": "^8.0.0", "string-width": "^5.0.0", "supports-color": "^9.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-sort": "^3.0.0", "vfile-statistics": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-reporter/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/vfile-reporter/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/vfile-reporter/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/vfile-reporter/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/vfile-reporter/node_modules/supports-color": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", "dev": true, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/vfile-sort": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-3.0.0.tgz", "integrity": "sha512-fJNctnuMi3l4ikTVcKpxTbzHeCgvDhnI44amA3NVDvA6rTC6oKCFpCVyT5n2fFMr3ebfr+WVQZedOCd73rzSxg==", "dev": true, "dependencies": { "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-statistics": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-2.0.0.tgz", "integrity": "sha512-foOWtcnJhKN9M2+20AOTlWi2dxNfAoeNIoxD5GXcO182UJyId4QrXa41fWrgcfV3FWTjdEDy3I4cpLVcQscIMA==", "dev": true, "dependencies": { "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "optional": true, "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { "makeerror": "1.0.12" } }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "dependencies": { "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" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yaml": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true, "engines": { "node": ">= 14" } }, "node_modules/yargs": { "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { "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" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } } }, "dependencies": { "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" } }, "@babel/compat-data": { "version": "7.20.10", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", "dev": true }, "@babel/core": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", "@babel/generator": "^7.20.7", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-module-transforms": "^7.20.7", "@babel/helpers": "^7.20.7", "@babel/parser": "^7.20.7", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7", "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": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } } } }, "@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "requires": { "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.7.tgz", "integrity": "sha512-LtoWbDXOaidEf50hmdDqn9g8VEzsorMexoWMQdQODbvmqYmaF23pBP5VNPAGIFHsFQCIeKokDiz3CH5Y2jlY6w==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.2.1" } }, "@babel/helper-define-polyfill-provider": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" } }, "@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-explode-assignable-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "dev": true, "requires": { "@babel/types": "^7.20.7" } }, "@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.10", "@babel/types": "^7.20.7" } }, "@babel/helper-optimise-call-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dev": true, "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, "@babel/helper-remap-async-to-generator": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-wrap-function": "^7.18.9", "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "requires": { "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helper-wrap-function": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "requires": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", "@babel/traverse": "^7.20.5", "@babel/types": "^7.20.5" } }, "@babel/helpers": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", "dev": true, "requires": { "@babel/template": "^7.20.7", "@babel/traverse": "^7.20.7", "@babel/types": "^7.20.7" } }, "@babel/highlight": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/node": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.20.7.tgz", "integrity": "sha512-AQt3gVcP+fpFuoFn4FmIW/+5JovvEoA9og4Y1LrRw0pv3jkl4tujZMMy3X/3ugjLrEy3k1aNywo3JIl3g+jVXQ==", "dev": true, "requires": { "@babel/register": "^7.18.9", "commander": "^4.0.1", "core-js": "^3.26.0", "node-environment-flags": "^1.0.5", "regenerator-runtime": "^0.13.11", "v8flags": "^3.1.1" } }, "@babel/parser": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-external-helpers": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.18.6.tgz", "integrity": "sha512-wNqc87qjLvsD1PIMQBzLn1bMuTlGzqLzM/1VGQ22Wm51cbCWS9k71ydp5iZS4hjwQNuTWSn/xbZkkusNENwtZg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "requires": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-import-assertions": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-arrow-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9" } }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz", "integrity": "sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/template": "^7.20.7" } }, "@babel/plugin-transform-destructuring": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { "version": "7.18.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-simple-access": "^7.20.2" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-new-target": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "regenerator-transform": "^0.15.1" } }, "@babel/plugin-transform-reserved-words": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { "version": "7.18.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "requires": { "@babel/compat-data": "^7.20.1", "@babel/helper-compilation-targets": "^7.20.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@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-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.20.2", "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", "@babel/plugin-transform-for-of": "^7.18.8", "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.19.6", "@babel/plugin-transform-modules-commonjs": "^7.19.6", "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", "@babel/plugin-transform-spread": "^7.19.0", "@babel/plugin-transform-sticky-regex": "^7.18.6", "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", "core-js-compat": "^3.25.1", "semver": "^6.3.0" } }, "@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" } }, "@babel/register": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", "dev": true, "requires": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", "make-dir": "^2.1.0", "pirates": "^4.0.5", "source-map-support": "^0.5.16" } }, "@babel/runtime": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.7.tgz", "integrity": "sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } }, "@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", "@babel/types": "^7.22.15" } }, "@babel/traverse": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "requires": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.23.0", "@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.0", "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.4.3.tgz", "integrity": "sha512-W/o/34+wQuXlgqlPYTansOSiBnuxrTv61dEVkA6HNmpcgHLUjfaUbdqt6oVvOzaawwo9IdW9QOtMgQ1ScSZC4A==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "slash": "^3.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/core": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.4.3.tgz", "integrity": "sha512-56QvBq60fS4SPZCuM7T+7scNrkGIe7Mr6PVIXUpu48ouvRaWOFqRPV91eifvFM0ay2HmfswXiGf97NGUN5KofQ==", "dev": true, "requires": { "@jest/console": "^29.4.3", "@jest/reporters": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.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.4.3", "jest-config": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-message-util": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-resolve-dependencies": "^29.4.3", "jest-runner": "^29.4.3", "jest-runtime": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "jest-watcher": "^29.4.3", "micromatch": "^4.0.4", "pretty-format": "^29.4.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/environment": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.4.3.tgz", "integrity": "sha512-dq5S6408IxIa+lr54zeqce+QgI+CJT4nmmA+1yzFgtcsGK8c/EyiUb9XQOgz3BMKrRDfKseeOaxj2eO8LlD3lA==", "dev": true, "requires": { "@jest/fake-timers": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "jest-mock": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/expect": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.4.3.tgz", "integrity": "sha512-iktRU/YsxEtumI9zsPctYUk7ptpC+AVLLk1Ax3AsA4g1C+8OOnKDkIQBDHtD5hA/+VtgMd5AWI5gNlcAlt2vxQ==", "dev": true, "requires": { "expect": "^29.4.3", "jest-snapshot": "^29.4.3" } }, "@jest/expect-utils": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.4.3.tgz", "integrity": "sha512-/6JWbkxHOP8EoS8jeeTd9dTfc9Uawi+43oLKHfp6zzux3U2hqOOVnV3ai4RpDYHOccL6g+5nrxpoc8DmJxtXVQ==", "dev": true, "requires": { "jest-get-type": "^29.4.3" } }, "@jest/fake-timers": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.4.3.tgz", "integrity": "sha512-4Hote2MGcCTWSD2gwl0dwbCpBRHhE6olYEuTj8FMowdg3oQWNKr2YuxenPQYZ7+PfqPY1k98wKDU4Z+Hvd4Tiw==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.4.3", "jest-mock": "^29.4.3", "jest-util": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/globals": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.4.3.tgz", "integrity": "sha512-8BQ/5EzfOLG7AaMcDh7yFCbfRLtsc+09E1RQmRBI4D6QQk4m6NSK/MXo+3bJrBN0yU8A2/VIcqhvsOLFmziioA==", "dev": true, "requires": { "@jest/environment": "^29.4.3", "@jest/expect": "^29.4.3", "@jest/types": "^29.4.3", "jest-mock": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/reporters": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.4.3.tgz", "integrity": "sha512-sr2I7BmOjJhyqj9ANC6CTLsL4emMoka7HkQpcoMRlhCbQJjz2zsRzw0BDPiPyEFDXAbxKgGFYuQZiSJ1Y6YoTg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/schemas": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", "dev": true, "requires": { "@sinclair/typebox": "^0.24.1" } }, "@jest/source-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.4.3.tgz", "integrity": "sha512-Oi4u9NfBolMq9MASPwuWTlC5WvmNRwI4S8YrQg5R5Gi47DYlBe3sh7ILTqi/LGrK1XUE4XY9KZcQJTH1WJCLLA==", "dev": true, "requires": { "@jest/console": "^29.4.3", "@jest/types": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/test-sequencer": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.4.3.tgz", "integrity": "sha512-yi/t2nES4GB4G0mjLc0RInCq/cNr9dNwJxcGg8sslajua5Kb4kmozAc+qPLzplhBgfw1vLItbjyHzUN92UXicw==", "dev": true, "requires": { "@jest/test-result": "^29.4.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "slash": "^3.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/transform": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^28.1.3", "@jridgewell/trace-mapping": "^0.3.13", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^28.1.3", "jest-regex-util": "^28.0.2", "jest-util": "^28.1.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jest/types": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", "dev": true, "requires": { "@jest/schemas": "^28.1.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" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "dependencies": { "@jridgewell/gen-mapping": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } } } }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" } }, "@rollup/plugin-commonjs": { "version": "19.0.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-19.0.2.tgz", "integrity": "sha512-gBjarfqlC7qs0AutpRW/hrFNm+cd2/QKxhwyFa+srbg1oX7rDsEU3l+W7LAUhsAp9mPJMAkXDhLbQaVwEaE8bA==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", "commondir": "^1.0.1", "estree-walker": "^2.0.1", "glob": "^7.1.6", "is-reference": "^1.2.1", "magic-string": "^0.25.7", "resolve": "^1.17.0" } }, "@rollup/plugin-node-resolve": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", "deepmerge": "^4.2.2", "is-builtin-module": "^3.1.0", "is-module": "^1.0.0", "resolve": "^1.19.0" } }, "@rollup/pluginutils": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "dependencies": { "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true } } }, "@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, "@sinonjs/commons": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0" } }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, "@types/babel__core": { "version": "7.1.20", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "@types/babel__generator": { "version": "7.6.4", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, "@types/debug": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", "dev": true, "requires": { "@types/ms": "*" } }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "@types/extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/extend/-/extend-3.0.1.tgz", "integrity": "sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==", "dev": true }, "@types/github-slugger": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==", "dev": true }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "dev": true, "requires": { "@types/unist": "*" } }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/mdast": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dev": true, "requires": { "@types/unist": "*" } }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "@types/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw==", "dev": true }, "@types/unist": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", "dev": true }, "@types/yargs": { "version": "17.0.17", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@vue/compiler-core": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", "dev": true, "optional": true, "requires": { "@babel/parser": "^7.16.4", "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "source-map": "^0.6.1" } }, "@vue/compiler-dom": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", "dev": true, "optional": true, "requires": { "@vue/compiler-core": "3.2.45", "@vue/shared": "3.2.45" } }, "@vue/compiler-sfc": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", "dev": true, "optional": true, "requires": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.45", "@vue/compiler-dom": "3.2.45", "@vue/compiler-ssr": "3.2.45", "@vue/reactivity-transform": "3.2.45", "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7", "postcss": "^8.1.10", "source-map": "^0.6.1" } }, "@vue/compiler-ssr": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", "dev": true, "optional": true, "requires": { "@vue/compiler-dom": "3.2.45", "@vue/shared": "3.2.45" } }, "@vue/reactivity-transform": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", "dev": true, "optional": true, "requires": { "@babel/parser": "^7.16.4", "@vue/compiler-core": "3.2.45", "@vue/shared": "3.2.45", "estree-walker": "^2.0.2", "magic-string": "^0.25.7" } }, "@vue/shared": { "version": "3.2.45", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==", "dev": true, "optional": true }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" } }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { "type-fest": "^0.21.3" } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "argv": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", "dev": true }, "array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" } }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" } }, "babel-jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", "dev": true, "requires": { "@jest/transform": "^28.1.3", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^28.1.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@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": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dev": true, "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" } }, "babel-plugin-polyfill-corejs3": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" } }, "babel-plugin-polyfill-regenerator": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@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": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", "dev": true, "requires": { "babel-plugin-jest-hoist": "^28.1.3", "babel-preset-current-node-syntax": "^1.0.0" } }, "bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "requires": { "safe-buffer": "5.1.2" }, "dependencies": { "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true } } }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", "dev": true, "requires": { "lodash": "^4.17.4", "platform": "^1.3.3" } }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, "browserslist": { "version": "4.21.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { "caniuse-lite": "^1.0.30001400", "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", "update-browserslist-db": "^1.0.9" } }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caniuse-lite": { "version": "1.0.30001520", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", "dev": true }, "ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true }, "character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true }, "character-entities-legacy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" } }, "ci-info": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "dev": true }, "cjs-module-lexer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { "restore-cursor": "^3.1.0" } }, "cli-truncate": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" }, "dependencies": { "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { "ansi-regex": "^6.0.1" } } } }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "codecov": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.3.tgz", "integrity": "sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==", "dev": true, "requires": { "argv": "0.0.2", "ignore-walk": "3.0.4", "js-yaml": "3.14.1", "teeny-request": "7.1.1", "urlgrey": "1.0.0" } }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "core-js": { "version": "3.27.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.0.tgz", "integrity": "sha512-wY6cKosevs430KRkHUIsvepDXHGjlXOZO3hYXNyqpD6JvB0X28aXyv0t1Y1vZMwE7SoKmtfa6IASHCPN52FwBQ==", "dev": true }, "core-js-compat": { "version": "3.27.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.0.tgz", "integrity": "sha512-spN2H4E/wocMML7XtbKuqttHHM+zbF3bAdl9mT4/iyFaF33bowQGjxiWNWyvUJGH9F+hTgnhWziiLtwu3oC/Qg==", "dev": true, "requires": { "browserslist": "^4.21.4" } }, "corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "dev": true, "optional": true }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, "decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "dev": true, "requires": { "character-entities": "^2.0.0" } }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true }, "diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", "dev": true }, "doctrine-temporary-fork": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine-temporary-fork/-/doctrine-temporary-fork-2.1.0.tgz", "integrity": "sha512-nliqOv5NkE4zMON4UA6AMJE6As35afs8aYXATpU4pTUdIKiARZwrJVEP1boA3Rx1ZXHVkwxkhcq4VkqvsuRLsA==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "documentation": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/documentation/-/documentation-14.0.1.tgz", "integrity": "sha512-Y/brACCE3sNnDJPFiWlhXrqGY+NelLYVZShLGse5bT1KdohP4JkPf5T2KNq1YWhIEbDYl/1tebRLC0WYbPQxVw==", "dev": true, "requires": { "@babel/core": "^7.18.10", "@babel/generator": "^7.18.10", "@babel/parser": "^7.18.11", "@babel/traverse": "^7.18.11", "@babel/types": "^7.18.10", "@vue/compiler-sfc": "^3.2.37", "chalk": "^5.0.1", "chokidar": "^3.5.3", "diff": "^5.1.0", "doctrine-temporary-fork": "2.1.0", "git-url-parse": "^13.1.0", "github-slugger": "1.4.0", "glob": "^8.0.3", "globals-docs": "^2.4.1", "highlight.js": "^11.6.0", "ini": "^3.0.0", "js-yaml": "^4.1.0", "konan": "^2.1.1", "lodash": "^4.17.21", "mdast-util-find-and-replace": "^2.2.1", "mdast-util-inject": "^1.1.0", "micromark-util-character": "^1.1.0", "parse-filepath": "^1.0.2", "pify": "^6.0.0", "read-pkg-up": "^9.1.0", "remark": "^14.0.2", "remark-gfm": "^3.0.1", "remark-html": "^15.0.1", "remark-reference-links": "^6.0.1", "remark-toc": "^8.0.1", "resolve": "^1.22.1", "strip-json-comments": "^5.0.0", "unist-builder": "^3.0.0", "unist-util-visit": "^4.1.0", "vfile": "^5.3.4", "vfile-reporter": "^7.0.4", "vfile-sort": "^3.0.0", "vue-template-compiler": "^2.7.8", "yargs": "^17.5.1" }, "dependencies": { "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" } }, "chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" } }, "minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } } } }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.20.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", "is-callable": "^1.2.7", "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.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "unbox-primitive": "^1.0.2" } }, "es-array-method-boxes-properly": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "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" } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expect": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/expect/-/expect-29.4.3.tgz", "integrity": "sha512-uC05+Q7eXECFpgDrHdXA4k2rpMyStAYPItEDLyQDo5Ta7fVkJnNA/4zh/OIVkVVNZ1oOK1PipQoyNjuZ6sz6Dg==", "dev": true, "requires": { "@jest/expect-utils": "^29.4.3", "jest-get-type": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "dev": true, "requires": { "punycode": "^1.3.2" } }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" } }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "fs-extra": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "function.prototype.name": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.19.0", "functions-have-names": "^1.2.2" } }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-intrinsic": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.3" } }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, "git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "requires": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" } }, "git-url-parse": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, "requires": { "git-up": "^7.0.0" } }, "github-slugger": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==", "dev": true }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "globals-docs": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/globals-docs/-/globals-docs-2.4.1.tgz", "integrity": "sha512-qpPnUKkWnz8NESjrCvnlGklsgiQzlq+rcCxoG5uNQ+dNA7cFMCmn231slLAwS2N/PlkzZ3COL8CcS10jXmLHqg==", "dev": true }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { "get-intrinsic": "^1.1.3" } }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "hast-util-is-element": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz", "integrity": "sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA==", "dev": true, "requires": { "@types/hast": "^2.0.0", "@types/unist": "^2.0.0" } }, "hast-util-sanitize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-4.0.0.tgz", "integrity": "sha512-pw56+69jq+QSr/coADNvWTmBPDy+XsmwaF5KnUys4/wM1jt/fZdl7GPxhXXXYdXnz3Gj3qMkbUCH2uKjvX0MgQ==", "dev": true, "requires": { "@types/hast": "^2.0.0" } }, "hast-util-to-html": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz", "integrity": "sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A==", "dev": true, "requires": { "@types/hast": "^2.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-is-element": "^2.0.0", "hast-util-whitespace": "^2.0.0", "html-void-elements": "^2.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.2", "unist-util-is": "^5.0.0" } }, "hast-util-whitespace": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz", "integrity": "sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==", "dev": true }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "highlight.js": { "version": "11.7.0", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", "dev": true }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" } }, "hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "requires": { "whatwg-encoding": "^2.0.0" } }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "html-void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", "dev": true }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } }, "http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "requires": { "basic-auth": "^2.0.1", "chalk": "^4.1.2", "corser": "^2.0.1", "he": "^1.2.0", "html-encoding-sniffer": "^3.0.0", "http-proxy": "^1.18.1", "mime": "^1.6.0", "minimist": "^1.2.6", "opener": "^1.5.1", "portfinder": "^1.0.28", "secure-compare": "3.0.1", "union": "~0.5.0", "url-join": "^4.0.1" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", "debug": "4" } }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "husky": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", "dev": true }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ignore-walk": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", "dev": true, "requires": { "minimatch": "^3.0.4" } }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "dependencies": { "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" } } } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", "dev": true }, "internal-slot": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "requires": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" } }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { "has-bigints": "^1.0.1" } }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { "binary-extensions": "^2.0.0" } }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true }, "is-builtin-module": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", "dev": true, "requires": { "builtin-modules": "^3.3.0" } }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { "isobject": "^3.0.1" } }, "is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "requires": { "@types/estree": "*" } }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { "is-unc-path": "^1.0.0" } }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, "is-ssh": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "requires": { "protocols": "^2.0.1" } }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" } }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { "has-symbols": "^1.0.2" } }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { "unc-path-regex": "^0.1.2" } }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { "call-bind": "^1.0.2" } }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "requires": { "@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-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest/-/jest-29.4.3.tgz", "integrity": "sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA==", "dev": true, "requires": { "@jest/core": "^29.4.3", "@jest/types": "^29.4.3", "import-local": "^3.0.2", "jest-cli": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-changed-files": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.4.3.tgz", "integrity": "sha512-Vn5cLuWuwmi2GNNbokPOEcvrXGSGrqVnPEZV7rC6P7ck07Dyw9RFnvWglnupSh+hGys0ajGtw/bc2ZgweljQoQ==", "dev": true, "requires": { "execa": "^5.0.0", "p-limit": "^3.1.0" } }, "jest-circus": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.4.3.tgz", "integrity": "sha512-Vw/bVvcexmdJ7MLmgdT3ZjkJ3LKu8IlpefYokxiqoZy6OCQ2VAm6Vk3t/qHiAGUXbdbJKJWnc8gH3ypTbB/OBw==", "dev": true, "requires": { "@jest/environment": "^29.4.3", "@jest/expect": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-runtime": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "p-limit": "^3.1.0", "pretty-format": "^29.4.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-cli": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.4.3.tgz", "integrity": "sha512-PiiAPuFNfWWolCE6t3ZrDXQc6OsAuM3/tVW0u27UWc1KE+n/HSn5dSE6B2juqN7WP+PP0jAcnKtGmI4u8GMYCg==", "dev": true, "requires": { "@jest/core": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", "jest-config": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "prompts": "^2.0.1", "yargs": "^17.3.1" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-config": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.4.3.tgz", "integrity": "sha512-eCIpqhGnIjdUCXGtLhz4gdDoxKSWXKjzNcc5r+0S1GKOp2fwOipx5mRcwa9GB/ArsxJ1jlj2lmlD9bZAsBxaWQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.4.3", "@jest/types": "^29.4.3", "babel-jest": "^29.4.3", "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.4.3", "jest-environment-node": "^29.4.3", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-runner": "^29.4.3", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.4.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "babel-jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.3.tgz", "integrity": "sha512-o45Wyn32svZE+LnMVWv/Z4x0SwtLbh4FyGcYtR20kIWd+rdrDZ9Fzq8Ml3MYLD+mZvEdzCjZsCnYZ2jpJyQ+Nw==", "dev": true, "requires": { "@jest/transform": "^29.4.3", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.4.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" } }, "babel-plugin-jest-hoist": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.3.tgz", "integrity": "sha512-mB6q2q3oahKphy5V7CpnNqZOCkxxZ9aokf1eh82Dy3jQmg4xvM1tGrh5y6BQUJh4a3Pj9+eLfwvAZ7VNKg7H8Q==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.4.3.tgz", "integrity": "sha512-gWx6COtSuma6n9bw+8/F+2PCXrIgxV/D1TJFnp6OyBK2cxPWg0K9p/sriNYeifKjpUkMViWQ09DSWtzJQRETsw==", "dev": true, "requires": { "babel-plugin-jest-hoist": "^29.4.3", "babel-preset-current-node-syntax": "^1.0.0" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-diff": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.3.tgz", "integrity": "sha512-YB+ocenx7FZ3T5O9lMVMeLYV4265socJKtkwgk/6YUz/VsEzYDkiMuMhWzZmxm3wDRQvayJu/PjkjjSkjoHsCA==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-docblock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.4.3.tgz", "integrity": "sha512-1ElHNAnKcbJb/b+L+7j0/w7bDvljw4gTv1wL9fYOczeJrbTbkMGQ5iQPFJ3eFQH19VPTx1IyfePdqSpePKss7Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "jest-util": "^29.4.3", "pretty-format": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-environment-node": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.4.3.tgz", "integrity": "sha512-gAiEnSKF104fsGDXNkwk49jD/0N0Bqu2K9+aMQXA6avzsA9H3Fiv1PW2D+gzbOSR705bWd2wJZRFEFpV0tXISg==", "dev": true, "requires": { "@jest/environment": "^29.4.3", "@jest/fake-timers": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "jest-mock": "^29.4.3", "jest-util": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-get-type": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true }, "jest-haste-map": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", "dev": true, "requires": { "@jest/types": "^28.1.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^28.0.2", "jest-util": "^28.1.3", "jest-worker": "^28.1.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.4.3.tgz", "integrity": "sha512-9yw4VC1v2NspMMeV3daQ1yXPNxMgCzwq9BocCwYrRgXe4uaEJPAN0ZK37nFBhcy3cUwEVstFecFLaTHpF7NiGA==", "dev": true, "requires": { "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" } }, "jest-matcher-utils": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.4.3.tgz", "integrity": "sha512-TTciiXEONycZ03h6R6pYiZlSkvYgT0l8aa49z/DLSGYjex4orMUcafuLXYyyEDWB1RKglq00jzwY00Ei7yFNVg==", "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^29.4.3", "jest-get-type": "^29.4.3", "pretty-format": "^29.4.3" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-message-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.4.3.tgz", "integrity": "sha512-1Y8Zd4ZCN7o/QnWdMmT76If8LuDv23Z1DRovBj/vcSFNlGCJGoO8D1nJDw1AdyAGUk0myDLFGN5RbNeJyCRGCw==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.4.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.4.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-mock": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.4.3.tgz", "integrity": "sha512-LjFgMg+xed9BdkPMyIJh+r3KeHt1klXPJYBULXVVAkbTaaKjPX1o1uVCAZADMEp/kOxGTwy/Ot8XbvgItOrHEg==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "jest-util": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", "dev": true }, "jest-resolve": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.4.3.tgz", "integrity": "sha512-GPokE1tzguRyT7dkxBim4wSx6E45S3bOQ7ZdKEG+Qj0Oac9+6AwJPCk0TZh5Vu0xzeX4afpb+eDmgbmZFFwpOw==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.4.3", "jest-validate": "^29.4.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-resolve-dependencies": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.3.tgz", "integrity": "sha512-uvKMZAQ3nmXLH7O8WAOhS5l0iWyT3WmnJBdmIHiV5tBbdaDZ1wqtNX04FONGoaFvSOSHBJxnwAVnSn1WHdGVaw==", "dev": true, "requires": { "jest-regex-util": "^29.4.3", "jest-snapshot": "^29.4.3" }, "dependencies": { "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true } } }, "jest-runner": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.4.3.tgz", "integrity": "sha512-GWPTEiGmtHZv1KKeWlTX9SIFuK19uLXlRQU43ceOQ2hIfA5yPEJC7AMkvFKpdCHx6pNEdOD+2+8zbniEi3v3gA==", "dev": true, "requires": { "@jest/console": "^29.4.3", "@jest/environment": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", "jest-environment-node": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-leak-detector": "^29.4.3", "jest-message-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-runtime": "^29.4.3", "jest-util": "^29.4.3", "jest-watcher": "^29.4.3", "jest-worker": "^29.4.3", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-runtime": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.4.3.tgz", "integrity": "sha512-F5bHvxSH+LvLV24vVB3L8K467dt3y3dio6V3W89dUz9nzvTpqd/HcT9zfYKL2aZPvD63vQFgLvaUX/UpUhrP6Q==", "dev": true, "requires": { "@jest/environment": "^29.4.3", "@jest/fake-timers": "^29.4.3", "@jest/globals": "^29.4.3", "@jest/source-map": "^29.4.3", "@jest/test-result": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.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.4.3", "jest-message-util": "^29.4.3", "jest-mock": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-resolve": "^29.4.3", "jest-snapshot": "^29.4.3", "jest-util": "^29.4.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-snapshot": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.4.3.tgz", "integrity": "sha512-NGlsqL0jLPDW91dz304QTM/SNO99lpcSYYAjNiX0Ou+sSGgkanKBcSjCfp/pqmiiO1nQaOyLp6XQddAzRcx3Xw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.4.3", "@jest/transform": "^29.4.3", "@jest/types": "^29.4.3", "@types/babel__traverse": "^7.0.6", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.4.3", "graceful-fs": "^4.2.9", "jest-diff": "^29.4.3", "jest-get-type": "^29.4.3", "jest-haste-map": "^29.4.3", "jest-matcher-utils": "^29.4.3", "jest-message-util": "^29.4.3", "jest-util": "^29.4.3", "natural-compare": "^1.4.0", "pretty-format": "^29.4.3", "semver": "^7.3.5" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/transform": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.4.3.tgz", "integrity": "sha512-8u0+fBGWolDshsFgPQJESkDa72da/EVwvL+II0trN2DR66wMwiQ9/CihaGfHdlLGFzbBZwMykFtxuwFdZqlKwg==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.4.3", "@jridgewell/trace-mapping": "^0.3.15", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.4.3", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-haste-map": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.4.3.tgz", "integrity": "sha512-eZIgAS8tvm5IZMtKlR8Y+feEOMfo2pSQkmNbufdbMzMSn9nitgGxF1waM/+LbryO3OkMcKS98SUb+j/cQxp/vQ==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", "jest-util": "^29.4.3", "jest-worker": "^29.4.3", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-regex-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-worker": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.4.3.tgz", "integrity": "sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.4.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "jest-util": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", "dev": true, "requires": { "@jest/types": "^28.1.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-validate": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.4.3.tgz", "integrity": "sha512-J3u5v7aPQoXPzaar6GndAVhdQcZr/3osWSgTeKg5v574I9ybX/dTyH0AJFb5XgXIB7faVhf+rS7t4p3lL9qFaw==", "dev": true, "requires": { "@jest/types": "^29.4.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", "pretty-format": "^29.4.3" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-watcher": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.4.3.tgz", "integrity": "sha512-zwlXH3DN3iksoIZNk73etl1HzKyi5FuQdYLnkQKm5BW4n8HpoG59xSwpVdFrnh60iRRaRBGw0gcymIxjJENPcA==", "dev": true, "requires": { "@jest/test-result": "^29.4.3", "@jest/types": "^29.4.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.4.3", "string-length": "^4.0.1" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@jest/types": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.4.3.tgz", "integrity": "sha512-bPYfw8V65v17m2Od1cv44FH+SiKW7w2Xu7trhcdTLUmSv85rfKsP+qXSjO4KGJr4dtPSzl/gvslZBXctf1qGEA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-util": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.4.3.tgz", "integrity": "sha512-ToSGORAz4SSSoqxDSylWX8JzkOQR7zoBtNRsA7e+1WUX5F8jrOwaNpuh1YfJHJKDHXLHmObv5eOjejUd+/Ws+Q==", "dev": true, "requires": { "@jest/types": "^29.4.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jest-worker": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json5": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "requires": { "graceful-fs": "^4.1.6" } }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "konan": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/konan/-/konan-2.1.1.tgz", "integrity": "sha512-7ZhYV84UzJ0PR/RJnnsMZcAbn+kLasJhVNWsu8ZyVEJYRpGA5XESQ9d/7zOa08U0Ou4cmB++hMNY/3OSV9KIbg==", "dev": true, "requires": { "@babel/parser": "^7.10.5", "@babel/traverse": "^7.10.5" } }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "lint-staged": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", "dev": true, "requires": { "chalk": "5.2.0", "cli-truncate": "^3.1.0", "commander": "^10.0.0", "debug": "^4.3.4", "execa": "^7.0.0", "lilconfig": "2.1.0", "listr2": "^5.0.7", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", "yaml": "^2.2.1" }, "dependencies": { "chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true }, "commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, "execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", "human-signals": "^4.3.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^3.0.7", "strip-final-newline": "^3.0.0" } }, "human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true }, "is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, "npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { "path-key": "^4.0.0" } }, "onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { "mimic-fn": "^4.0.0" } }, "path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, "strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true } } }, "listr2": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "requires": { "cli-truncate": "^2.1.0", "colorette": "^2.0.19", "log-update": "^4.0.0", "p-map": "^4.0.0", "rfdc": "^1.3.0", "rxjs": "^7.8.0", "through": "^2.3.8", "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } } } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "log-update": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", "slice-ansi": "^4.0.0", "wrap-ansi": "^6.2.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } } } }, "longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" } }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "requires": { "sourcemap-codec": "^1.4.8" } }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" }, "dependencies": { "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { "tmpl": "1.0.5" } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true }, "markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", "dev": true }, "mdast-util-definitions": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz", "integrity": "sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "unist-util-visit": "^4.0.0" } }, "mdast-util-find-and-replace": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz", "integrity": "sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw==", "dev": true, "requires": { "escape-string-regexp": "^5.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.0.0" }, "dependencies": { "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true } } }, "mdast-util-from-markdown": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "decode-named-character-reference": "^1.0.0", "mdast-util-to-string": "^3.1.0", "micromark": "^3.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-decode-string": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "unist-util-stringify-position": "^3.0.0", "uvu": "^0.5.0" }, "dependencies": { "mdast-util-to-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", "dev": true } } }, "mdast-util-gfm": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz", "integrity": "sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ==", "dev": true, "requires": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-gfm-autolink-literal": "^1.0.0", "mdast-util-gfm-footnote": "^1.0.0", "mdast-util-gfm-strikethrough": "^1.0.0", "mdast-util-gfm-table": "^1.0.0", "mdast-util-gfm-task-list-item": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" } }, "mdast-util-gfm-autolink-literal": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz", "integrity": "sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "ccount": "^2.0.0", "mdast-util-find-and-replace": "^2.0.0", "micromark-util-character": "^1.0.0" } }, "mdast-util-gfm-footnote": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz", "integrity": "sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0", "micromark-util-normalize-identifier": "^1.0.0" } }, "mdast-util-gfm-strikethrough": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.2.tgz", "integrity": "sha512-T/4DVHXcujH6jx1yqpcAYYwd+z5lAYMw4Ls6yhTfbMMtCt0PHY4gEfhW9+lKsLBtyhUGKRIzcUA2FATVqnvPDA==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "mdast-util-gfm-table": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz", "integrity": "sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "mdast-util-gfm-task-list-item": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz", "integrity": "sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "mdast-util-inject": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz", "integrity": "sha512-CcJ0mHa36QYumDKiZ2OIR+ClhfOM7zIzN+Wfy8tRZ1hpH9DKLCS+Mh4DyK5bCxzE9uxMWcbIpeNFWsg1zrj/2g==", "dev": true, "requires": { "mdast-util-to-string": "^1.0.0" } }, "mdast-util-to-hast": { "version": "12.2.4", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz", "integrity": "sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg==", "dev": true, "requires": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-definitions": "^5.0.0", "micromark-util-sanitize-uri": "^1.1.0", "trim-lines": "^3.0.0", "unist-builder": "^3.0.0", "unist-util-generated": "^2.0.0", "unist-util-position": "^4.0.0", "unist-util-visit": "^4.0.0" } }, "mdast-util-to-markdown": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.4.0.tgz", "integrity": "sha512-IjXARf/O8VGx/pc5SZ7syfydq1DYL9vd92orsG5U0b4GNCmAvXzu+n7sbzfIKrXwB0AVrYk3NV2kXl0AIi9LCA==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "longest-streak": "^3.0.0", "mdast-util-to-string": "^3.0.0", "micromark-util-decode-string": "^1.0.0", "unist-util-visit": "^4.0.0", "zwitch": "^2.0.0" }, "dependencies": { "mdast-util-to-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", "dev": true } } }, "mdast-util-to-string": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", "dev": true }, "mdast-util-toc": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-6.1.0.tgz", "integrity": "sha512-0PuqZELXZl4ms1sF7Lqigrqik4Ll3UhbI+jdTrfw7pZ9QPawgl7LD4GQ8MkU7bT/EwiVqChNTbifa2jLLKo76A==", "dev": true, "requires": { "@types/extend": "^3.0.0", "@types/github-slugger": "^1.0.0", "@types/mdast": "^3.0.0", "extend": "^3.0.0", "github-slugger": "^1.0.0", "mdast-util-to-string": "^3.1.0", "unist-util-is": "^5.0.0", "unist-util-visit": "^3.0.0" }, "dependencies": { "mdast-util-to-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", "dev": true }, "unist-util-visit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", "dev": true, "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^4.0.0" } }, "unist-util-visit-parents": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", "dev": true, "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } } } }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "micromark": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", "dev": true, "requires": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "micromark-core-commonmark": "^1.0.1", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "micromark-core-commonmark": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", "dev": true, "requires": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", "micromark-factory-label": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-factory-title": "^1.0.0", "micromark-factory-whitespace": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-html-tag-name": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "micromark-extension-gfm": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz", "integrity": "sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==", "dev": true, "requires": { "micromark-extension-gfm-autolink-literal": "^1.0.0", "micromark-extension-gfm-footnote": "^1.0.0", "micromark-extension-gfm-strikethrough": "^1.0.0", "micromark-extension-gfm-table": "^1.0.0", "micromark-extension-gfm-tagfilter": "^1.0.0", "micromark-extension-gfm-task-list-item": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-extension-gfm-autolink-literal": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz", "integrity": "sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==", "dev": true, "requires": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-extension-gfm-footnote": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz", "integrity": "sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==", "dev": true, "requires": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-extension-gfm-strikethrough": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz", "integrity": "sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==", "dev": true, "requires": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-extension-gfm-table": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz", "integrity": "sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==", "dev": true, "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-extension-gfm-tagfilter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz", "integrity": "sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==", "dev": true, "requires": { "micromark-util-types": "^1.0.0" } }, "micromark-extension-gfm-task-list-item": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz", "integrity": "sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==", "dev": true, "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-factory-destination": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", "dev": true, "requires": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-factory-label": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", "dev": true, "requires": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-factory-space": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", "dev": true, "requires": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-factory-title": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", "dev": true, "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-factory-whitespace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", "dev": true, "requires": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-util-character": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", "dev": true, "requires": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-util-chunked": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", "dev": true, "requires": { "micromark-util-symbol": "^1.0.0" } }, "micromark-util-classify-character": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", "dev": true, "requires": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-util-combine-extensions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", "dev": true, "requires": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "micromark-util-decode-numeric-character-reference": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", "dev": true, "requires": { "micromark-util-symbol": "^1.0.0" } }, "micromark-util-decode-string": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", "dev": true, "requires": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "micromark-util-encode": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", "dev": true }, "micromark-util-html-tag-name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", "dev": true }, "micromark-util-normalize-identifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", "dev": true, "requires": { "micromark-util-symbol": "^1.0.0" } }, "micromark-util-resolve-all": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", "dev": true, "requires": { "micromark-util-types": "^1.0.0" } }, "micromark-util-sanitize-uri": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", "dev": true, "requires": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "micromark-util-subtokenize": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", "dev": true, "requires": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "micromark-util-symbol": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", "dev": true }, "micromark-util-types": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", "dev": true }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { "minimist": "^1.2.6" } }, "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", "dev": true }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, "optional": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" }, "dependencies": { "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, "requires": { "whatwg-url": "^5.0.0" } }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-releases": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, "normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" }, "dependencies": { "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" } }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", "dev": true, "requires": { "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" }, "dependencies": { "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } } } }, "p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, "requires": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" } }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, "parse-path": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "requires": { "protocols": "^2.0.0" } }, "parse-url": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "requires": { "parse-path": "^7.0.0" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, "requires": { "path-root-regex": "^0.1.0" } }, "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, "pify": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pify/-/pify-6.1.0.tgz", "integrity": "sha512-KocF8ve28eFjjuBKKGvzOBGzG8ew2OqOOSxTTZhirkzH7h3BI1vyzqlR0qbfcDBve1Yzo3FVlWUAtCRrbVN8Fw==", "dev": true }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true } } }, "platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, "portfinder": { "version": "1.0.32", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "requires": { "async": "^2.6.4", "debug": "^3.2.7", "mkdirp": "^0.5.6" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "optional": true, "requires": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "prettier": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true }, "pretty-format": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", "dev": true, "requires": { "@jest/schemas": "^29.4.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "dependencies": { "@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, "requires": { "@sinclair/typebox": "^0.25.16" } }, "@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "property-information": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", "dev": true }, "protocols": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, "qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "requires": { "side-channel": "^1.0.4" } }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, "read-pkg": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, "requires": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", "parse-json": "^5.2.0", "type-fest": "^2.0.0" }, "dependencies": { "type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true } } }, "read-pkg-up": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, "requires": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", "type-fest": "^2.5.0" }, "dependencies": { "find-up": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "requires": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "locate-path": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", "dev": true, "requires": { "p-locate": "^6.0.0" } }, "p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "requires": { "yocto-queue": "^1.0.0" } }, "p-locate": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "requires": { "p-limit": "^4.0.0" } }, "path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true }, "type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true }, "yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true } } }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" } }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "functions-have-names": "^1.2.2" } }, "regexpu-core": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "regjsgen": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", "dev": true }, "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } }, "remark": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.2.tgz", "integrity": "sha512-A3ARm2V4BgiRXaUo5K0dRvJ1lbogrbXnhkJRmD0yw092/Yl0kOCZt1k9ZeElEwkZsWGsMumz6qL5MfNJH9nOBA==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "remark-parse": "^10.0.0", "remark-stringify": "^10.0.0", "unified": "^10.0.0" } }, "remark-gfm": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-gfm": "^2.0.0", "micromark-extension-gfm": "^2.0.0", "unified": "^10.0.0" } }, "remark-html": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/remark-html/-/remark-html-15.0.1.tgz", "integrity": "sha512-7ta5UPRqj8nP0GhGMYUAghZ/DRno7dgq7alcW90A7+9pgJsXzGJlFgwF8HOP1b1tMgT3WwbeANN+CaTimMfyNQ==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "hast-util-sanitize": "^4.0.0", "hast-util-to-html": "^8.0.0", "mdast-util-to-hast": "^12.0.0", "unified": "^10.0.0" } }, "remark-parse": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "unified": "^10.0.0" } }, "remark-reference-links": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-6.0.1.tgz", "integrity": "sha512-34wY2C6HXSuKVTRtyJJwefkUD8zBOZOSHFZ4aSTnU2F656gr9WeuQ2dL6IJDK3NPd2F6xKF2t4XXcQY9MygAXg==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "unified": "^10.0.0", "unist-util-visit": "^4.0.0" } }, "remark-stringify": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.0.0", "unified": "^10.0.0" } }, "remark-toc": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/remark-toc/-/remark-toc-8.0.1.tgz", "integrity": "sha512-7he2VOm/cy13zilnOTZcyAoyoolV26ULlon6XyCFU+vG54Z/LWJnwphj/xKIDLOt66QmJUgTyUvLVHi2aAElyg==", "dev": true, "requires": { "@types/mdast": "^3.0.0", "mdast-util-toc": "^6.0.0", "unified": "^10.0.0" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" } }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve.exports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", "integrity": "sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==", "dev": true }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "requires": { "fsevents": "~2.3.2" } }, "rollup-plugin-terser": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", "terser": "^5.0.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "rxjs": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, "requires": { "tslib": "^2.1.0" } }, "sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, "requires": { "mri": "^1.1.0" } }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "serialize-javascript": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { "kind-of": "^6.0.2" } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" } }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, "dependencies": { "ansi-styles": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, "is-fullwidth-code-point": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true } } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, "optional": true }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", "dev": true, "requires": { "stubs": "^3.0.0" } }, "string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.20.4" } }, "stringify-entities": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", "dev": true, "requires": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", "dev": true }, "stubs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "teeny-request": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.1.tgz", "integrity": "sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==", "dev": true, "requires": { "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.1", "stream-events": "^1.0.5", "uuid": "^8.0.0" } }, "terser": { "version": "5.16.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true } } }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, "trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true }, "trough": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", "dev": true }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" } }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, "unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dev": true, "requires": { "@types/unist": "^2.0.0", "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^5.0.0" } }, "union": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "requires": { "qs": "^6.4.0" } }, "unist-builder": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-3.0.0.tgz", "integrity": "sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==", "dev": true, "requires": { "@types/unist": "^2.0.0" } }, "unist-util-generated": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.0.tgz", "integrity": "sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==", "dev": true }, "unist-util-is": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", "dev": true }, "unist-util-position": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.3.tgz", "integrity": "sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==", "dev": true, "requires": { "@types/unist": "^2.0.0" } }, "unist-util-stringify-position": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", "dev": true, "requires": { "@types/unist": "^2.0.0" } }, "unist-util-visit": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", "dev": true, "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "unist-util-visit-parents": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", "dev": true, "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" } }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, "urlgrey": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-1.0.0.tgz", "integrity": "sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==", "dev": true, "requires": { "fast-url-parser": "^1.1.3" } }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "uvu": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", "dev": true, "requires": { "dequal": "^2.0.0", "diff": "^5.0.0", "kleur": "^4.0.3", "sade": "^1.7.3" }, "dependencies": { "kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true } } }, "v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0" } }, "v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "vfile": { "version": "5.3.6", "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", "dev": true, "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-message": "^3.0.0" } }, "vfile-message": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", "dev": true, "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" } }, "vfile-reporter": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-7.0.4.tgz", "integrity": "sha512-4cWalUnLrEnbeUQ+hARG5YZtaHieVK3Jp4iG5HslttkVl+MHunSGNAIrODOTLbtjWsNZJRMCkL66AhvZAYuJ9A==", "dev": true, "requires": { "@types/supports-color": "^8.0.0", "string-width": "^5.0.0", "supports-color": "^9.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-sort": "^3.0.0", "vfile-statistics": "^2.0.0" }, "dependencies": { "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { "ansi-regex": "^6.0.1" } }, "supports-color": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", "dev": true } } }, "vfile-sort": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-3.0.0.tgz", "integrity": "sha512-fJNctnuMi3l4ikTVcKpxTbzHeCgvDhnI44amA3NVDvA6rTC6oKCFpCVyT5n2fFMr3ebfr+WVQZedOCd73rzSxg==", "dev": true, "requires": { "vfile-message": "^3.0.0" } }, "vfile-statistics": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-2.0.0.tgz", "integrity": "sha512-foOWtcnJhKN9M2+20AOTlWi2dxNfAoeNIoxD5GXcO182UJyId4QrXa41fWrgcfV3FWTjdEDy3I4cpLVcQscIMA==", "dev": true, "requires": { "vfile-message": "^3.0.0" } }, "vue-template-compiler": { "version": "2.7.14", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "optional": true, "requires": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { "makeerror": "1.0.12" } }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, "whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "requires": { "iconv-lite": "0.6.3" } }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "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" } }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "dependencies": { "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yaml": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true }, "yargs": { "version": "17.6.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { "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" } }, "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, "zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true } } } moment-luxon-93c85a3/package.json000066400000000000000000000054571477254173100170310ustar00rootroot00000000000000{ "name": "luxon", "version": "3.6.1", "description": "Immutable date wrapper", "author": "Isaac Cambron", "keywords": [ "date", "immutable" ], "repository": "https://github.com/moment/luxon", "exports": { ".": { "import": "./src/luxon.js", "require": "./build/node/luxon.js" }, "./package.json": "./package.json" }, "scripts": { "build": "babel-node tasks/buildAll.js", "build-node": "babel-node tasks/buildNode.js", "build-global": "babel-node tasks/buildGlobal.js", "jest": "jest", "test": "jest --coverage", "api-docs": "mkdir -p build && documentation build src/luxon.js -f html -o build/api-docs && sed -i.bak 's/<\\/body>/ moment-luxon-93c85a3/site/demo/requirejs.html000066400000000000000000000007531477254173100213240ustar00rootroot00000000000000 moment-luxon-93c85a3/site/docs/000077500000000000000000000000001477254173100164245ustar00rootroot00000000000000moment-luxon-93c85a3/site/docs/_coverpage.md000066400000000000000000000005611477254173100210620ustar00rootroot00000000000000![logo](_media/Luxon_icon_64x64.png) # Luxon 3.x > A powerful, modern, and friendly wrapper for JavaScript dates and times. * DateTimes, Durations, and Intervals * Immutable, chainable, unambiguous API. * Native time zone and Intl support (no locale or tz files) [GitHub](https://github.com/moment/luxon/) [Get started](#Luxon) ![color](#e8dffc) moment-luxon-93c85a3/site/docs/_media/000077500000000000000000000000001477254173100176425ustar00rootroot00000000000000moment-luxon-93c85a3/site/docs/_media/Luxon_icon.svg000066400000000000000000000123751477254173100225100ustar00rootroot00000000000000 Luxon_icon Created with Sketch. moment-luxon-93c85a3/site/docs/_media/Luxon_icon_180x180.png000066400000000000000000000507451477254173100235110ustar00rootroot00000000000000PNG  IHDR=2sRGB@IDATxAD% JDJlJ4*(R*"%*H+!}{am{vΝ{sܓ!NQRUU&|R!?TpX TN%˰,Cc9E!9vHc!9va˱= j:6^PPm"O7O~H'Xv8ߑênXƺ\@WFXLm' 6FгPkjtu紾?Y;lk9cùS5QȲlr76ro?Ƚ͗LYzC\-={\8ɃpXՖ3UR'W  ԒCUϐ7p{TaND2Kgj꘼32"ՌZJ{H33:\ N&cd$˓R |&#O&dʨZq&%}Nz֘p j+^@\*55^G`8YMh955cR9 hF'Ti&mR:D KQ >Gs 1µ ߔNr;{66CS;{HsT~<dz^N*[l}~*g_Z uVsV!C&U֚JWO33n6&81Z&}bF}zZW+>b7)ДWVQU" zvWrJFr'NP,@~V$?$ۭfʘYUX\EU dSeΪmYB䡎/ny>*}^wPOl~qƫ[d5OMC&Xqu՟(<x5ychN-#[nuI(>^XT\DD<͇!Cd{6_vUh WJKսʘ19vHyJGs.<=,HO#* ը)]E8"%(A|,.JSXU=*UUkQ|wRA I^0*\ 5IiQo~/RnyP*S*xѥ6&>YmغBݲ@Rw QKED ˨ZJM$!8g א dzwzHY.Rg3uBKĦ$ϥn:X59*%1ȯynEg(g !?I~m~F|Yȫ\Ѯ,VI@|*sݹD%6{ڲm:@eEQ[6.9*[7$! (c%#d>%0G=?:xxOSt,XCU*g4q>S~"X1}[ ʑ_=~z!5Z$ SRb9jw+D0psQW^RM5 { JseueQ=;,HzOgABjJmJ9jH2D;-Ű> 3ں7tV%eBN-E&3ZJҧJzE;L%ҏ9 )dt,AБy-j_NZfRBsu}Rᯗ(;A@KԳ]P v~Jn#=kDxTPyo+UG/_Vjzc7;g"X맽RRT?o_uJuu V8aH38O zv`Q2v6Ɗ-O/(f|>Suu`vd-H6@ʙ_ ҎVMV/o'"`<&{wyL]|k͙(h?b2e̢k7^ո&)X i _ɴEԘ{d-Pi2 l#GR.xImmcB8 /͓C6CL-UgO]4R{ε$ 酒Pv|`s݂\Ojۏ$tp!uLbh1佻̙3*]<* ^&@ lk5eP`MԽ~ &EذchwAB`ی lFt0=ȴmaNs[0\̯R a7U>~v[OD??TάqJW<)qZR p.U0CnZ8k"rrHWk,왟W IG{U~,`}gĞD-,M f9%m f" | 2+nO_27 V3gN7ܹNҷ~459W9g 7y6ήD)i^Ou44N7쓡~ C܌DvG~\h+"3q^EDjEBr¿b6`\5&\B*nU?MFH[?͑5cv>`HGnIjMbWeT|(o?9vv ~(zne\-ITFa DO$0Gܺ:"0<NW"ruK:3Bq2^v~k6&w{fD^D^e2#E6iM"Ƽ hRQK$Rm* vZoFl}}fXm<{T+eJ:46͈lXf1,`x:Nɰ7ubx$L'c5f>v gu<7rd˭WG%/d: ]yp,_Jq+ǝx%o]s {`ڳWMG oPYXrd{[d}/g!"=_׹F3 W0'{5ح1tg]C>rWQD=O7抨Y7oן?ˣg.oգw,TQN1CΏ'f͕#ovO/9 wizRXYT̥Б?uИq3k-W3f4xq_%2Vj֣ı J+PF{6wyalZ <HѼo29}gq̷zH{ M}~y1BV` hZ;`Y3JT9 lUBs~oɉ8gxK]U_վV^{>Ty?->egt}|/ٷv_?޾F]Vj oo?A A֡qZϷ7Gh3Y@ǯ\0ʙK$r/;޾Z2^&% Wl)t8Dr[]|2gS|pleZ+$UU% W_JlZz=VzP6C vEFE|SH)6wdJ_O= F!2sXq0SU(V6LEȺiVd26Uw5xJU\ v=) UqV$tSypiW*n(1{[ yrj(\N x"⦅(i]Twuþ*fE=0;Iw=Zsډɴ yr[@#nno@*%^f -7$HnS{TIX)Cӣ7 phn#GN:>{hN{[kP Ѯ} AB$V)$q/uXn\SԬ JFdYp-ɵV]" 0[]:%,LԝziBwW$ꇩ)s|9Qz4i&`0(zpVq(r*GS$gwgz6ZU:H 0C*6aƒ1"LW?nY'o F4쯐RK^vH28R P&&1 w6[ &HF6Ң5(f_qM?e%!#bFw|= -N~|S{D]-ۼuGG|헝f0("b`9gi/ I^>tdr6ųzKOyj<'FQ=ZG*eϚK՗I5&9 Yɧ Uw9 U7z,)3lٶJ&i-)Z+.!р:oSmp_p`X39DܵHn71R?O~}L/&ZiԳ; y7zdv}u+ 3$Q4V^'|1 2j3¬3o5SR]]SZT=RԸ4Kei'F7$q@DZC:ۓr?&m?K{m*s+aRFϾ|UU.]/0&>n2˗yʵ#sZ4n[;]兮k$Y9t&x]$aIIB_|s]mNz/zw,J~q|;3om~t b=c!wjjؚ?ErtǪOdmd PT,L]yi5kqF7BT}S'us ;r_g{[j|7m#f7=ӳeUj${NY//+5{%Oϩ}M̺(| 2܉`Y3OVk?g`M=RlT;/va㰪Rf S:rAo!ڮz{bY;hTTEwl@]`i* KD) i'23CE|׉ l&p*N;ջewjȻwgnđ*R#_m8ޙ[=>t'\ ^Q BD1SK4[̓;' v }f5_3m?,a,gaE%y& Жq _؏$]dU-ѦG`h.`Ḡ +?P'y.0,IƊgx]˓:FoX~=sO)ˡ: uя"cLYl|^keV |v_򸌠Guu~_?}X]uYuߨ'7QFQi DGկbHч%?,y˾,n1Zbiu:pۯ1uHܻ-t'nVw7M/['׭jh(LNLg-{]zXOpï+YSثSb9b'D A]n< sRC5|xRCIoϗ9ŋ B) sHGx0RʞO}}jYvaIa-[Wu16e*Sm9}HQ|D&H>*DLLi}u#9,Y5 &\͚6K3a3 l#=cYg0#MY7K)*"vFќo_"RVQ|ueY{Y/-R^|lS7S}aW _D*u|=+~X"X$:Jn`N Si d szG0d#lQx {x;;k1A7zE0?a-{nݰV2igZ"/6Ƹ^ٓf$1AlΧ[=H(ON|dPBM>np{\WJ'6xWИ2X!PC8ºYeּIk1QFhӮ^KlGǒuUHw2v2 e!TC@-øJëN_n* [:89 `i gdi'sv nl5Jʳ> d*~;"γ5? \TBWX 7fҧM$/%E*Z&=?}8brkRh4]ﭲg\}zKQr\!q0LY˲RW"z'^Q?P0 ,V bawZekXV+(hr5:DZ3?vw.3T'fF* åh 1` Dui>Bo]Ԗxy'pM3B~XN#N~j?lUKFR),[la 𢃼Ȓ SEW"';#LQ!-_45X,Ë́ >ҋr=~aP\+Z}D}d^׌cK_ CxaEXx |ڃ~?Pڸ yN-_Ò=yЦ'ml-ouaܗV?>TY r!F&/0e5y;eZ}l ѭ>(+aB z)V( s3a4,vbFhxr⑏/Nhzo߸Y /i"RtL+}Gaɴk=CכI~o^+I̓g|vp42O<GfFrca=-3|7DGT8ph3l϶qu:pWqŬՋNMk)mgeH9u +6ݰ&JVDmtPm[o xb+7]oNu}}aޞr&1i8,8s%I/2ip;i\m0@G,*Ɏ +-jp,m&P10cѹLx2<%@ єu[³3\׍ kb̈,>/JcG 2&i_'zZRx۔g+Uz}3F *!<7 kC#گ^u9EDU.<8{^fr\Bxx4{|%^nZ/5L[YsX"?, 2$(Oc%b7/¢.i L7]5jgmtkf‹뤽Lv\}!CہE7`9C{M~og_(#A6p)R㚖J\#~2@Sᩃ^&g{>7p{? a NH1p\r܈Ooɢ#"!0,?nÌIy)9s JPc$UjY:0@s93B#wnkP7gjIe;,n]Pcظ`n9mγ =fʃAOB@+QAэQ )-t $Q;'uo=˔X37/:jH!Z$R}X$z$VdB8'buqbAFS&KJÐgz;ٹ&ohDF(dt͈&DGS#; %5^.GhCy]swęخB8&ѶO րxp7ndFt yrH\9Zbœ x%"W,##^e@~Dddu'beȡ-n`hɩHB Z3I.oq"tk.w(C!h~,r>\u4k;(C/]rm ŰϖCaw {zðÀH0#DroRRwry\b\`(d8ӄ }Q2}n0`[zR ]0Ld4Gy.5)A Hn3 /%BВ1)O}'AɅ³cS͒msrI[1vX'ݼP^h`(Pfl[u9K4d`\~`fR~(N'aN)XJN$8 !߾0(E!@ag1O#L:D[n&7v u 0KLh0*8-lB#&J͘z] AxkWGp"0vjoTq0AsDe 8'"f(^Z#he>@L͌ەPck;XY""kԶ%Ҏ? ~/+ĩu, AlIjm-s`zu+{^]]$bxP#O d&ԘFi('@3*!yD&l2Xq_V@  >e5舉 q)h gQ<OmIY>^~Hΰ"L("@sM$ b/7|uئqv-<"0ɳ k4g bx/@4 *1u[@Ot(>rإ)&19Px%J{x, )<9X0TLx7 7xరr:SlC^/#&OFFk5C\FpP $6?+.;[?k뺨W0Rox,*kǜƌVqsоNcU׾;vʛ|U}l`{4}A[#6/\X~:fgĜC5)CR?-Ѯfȃy ZGP&OJNz>~*uxLapw]~NJ=Yó]zZCqčˋ7w~)2֧0eC:2?Nf$.сZ#D+%NYdJqɋH(K-sҡ6@-9LΛY7 diΗs;*\^n Vvy\<@gȥ<3T 2<z.Mur1Zv h {_̇ImVN#>$Zn_Y X r$+=qu%53|>[r62?'~1D2bk½%\\k4aʟkokRUDXց/k>x Z$A߂O%}]4^piapC".Lzzwd9fuSkTAJzAܯ23IoJto!9Yh#ڊ6sVE N(2mX9ĤXv aFI!5Z9!Ɲ۬fdcf}yz5%kw1!=;<y\HF ^X喈I $q8"3z2 %ur [Lc>:͌slSI ܯՊ:\'yaOr?l?HnCs΀ ҢAɍ1{s{!5޾/ޤ?NgٶK$&Ob7a4-10:Mmఞ}ۙJ`%WlYǃ|)n$3g:mDq3vt-u\; F8ְJ0xDA"'[F܌E;5SY+VPE9N4GfbR|+*#6 u[Mg3 Qg|yix|3 i!䛍nx@B+)9QcdcU:9?5A E44d gBT]'"g&!&tIr!FoȣGtWܴ~e\þ$P愁{+Bjts=gtju^6hx]) x^$_2!0* 䞰2g:_b:Xb:rkdZ>3ûXve/sϗ8H5pNCkE{w7isuՈHGcfN3̦2S&U^iZG@SC&a;J9&;?5a+鬣n`E\[ӑ z%>ϼ ,H=$k'<*-^J=^7'|kZw9!ݙ ~ȣ^))=y/VF@aPi㮀!VDN2|:OOszӃ/Y8*V"[ FnfGMğoܦss `Yz,#ɩ$#1ucѰň|ȮuYъֱk،v'_whn3y֍CGW?WK̫^}k.zq:1gYs D&@5I2Xv# &:CH`ƑN<!+a4b/}7k7:$gYL;k>2ϖ2PL^D. y%X)~O'1Ox^:fT=Hf/[^w!Im0wDeWos]ߝxQYy؃ M3TO^|KQS; G̏VzOD EGU*:T|>T ?$tXy讷dȩ]?Ӱkh=S^&rOᦻQf=Ju"%*"$ s)mk0U_j<ƜWDGXq*H/h45B ₕ= h5' \xjfm MD&=ݭĈZ^EgQlڶ[@8y DŽ5.VzA2erӱHS3eE3aM3`Ds[FLj&=cXeI -Yu~]cL&;rdSW7tȯ>ɳG[ <9NQl?f݆nU}VI.(^*&:O8i4 |=6 b$, ѕXmk|s$ \_ѫj=Vhj1=ՐD"2F˘ETUǰX-qeeՍioDxsYd2fQ< X<+'E-v> (~N2:1]=z'гF˨ f=pjLøӭ, {$H nUIE|bq\'𳆈cxa#R#&f!&$P&'%N4w$XW|:/3cts_.K1|Qu mt9; N{oSsn0[_P,t8ybpܼ훸uޙUȞQLȽ$9"V?+"LK8Ȯ/,1_۪~ Hjh3ČP_ȅntu`W1}8!ߗoz5_nh*F ~[{v^3I49Aw1YA]@Xu ( ("| <a7*k^4. FjDDr_;u VL Ji!5E\Z%xz/d4Yv颗dwZ> XAd='-h3^wkl3Cuvl"͘SjjVbA@n5!HAzps% !p&mXlZ\2ًYo9{ hYI7 QtPmS\0bُ.l!I _MW:=+eϼl'>&mx_~ ̧Y،f` \8`y6D|KSE%K~n1Wv$$ ՛h4bWͣ6K҆yXLniZS}΃3P6^atLuzZ\X'H@@EKƩ5k(M$X$Yum{B$oiq㝂;aRsȯb 9ł3CB[5rLZ'0eܷ(#5D1E~o3L_2Zv`Qla$OzfFv#=I7i0eUi.A`uamFnEc)}ƌ sALO9&XBڪ$āLQrkٲ@IF-Z 6 ;k{cQjz-֞[j5o|jSo v BK DANI{~ٹVٺcm s 7שkQ!m:)zF$>v@;K؏I쨂FpC|ck]E ֈ y$(d܉m$i[^>(NpJgJu?jzz;5/tn4LtyINs#3-DYZש+$_9N4uT> QZ'T%E\hIC¤ZOf-}̆vuf86VZ I!,BB4HB mLPEpٗ%J5l`Nj=OyQ U,kG qȜQu&rk])|4m$՝#lgvh:j2LrhHƲ! V-]GlSj5IuAa/V;2~LRCGxg-O#yE( Z':YHfۮuA%pľ {WıfY:AReޗy @iO#7)%&:K{D2=> rN"%@YG iVIjM6Gzl̞GE%i4 ~/#3~\8i9UNP}d3gv)1Čz]B+=??;{֘pqNbyћΤ7ښ:uӀ6yvsu]:w<ۇ3qhoiqݾG5xi,VR3%"ՌrNM-mmmOTեȨ]G]-IFkTRV}'0_a~\jIS}' i@tp.R\eSۤI`^Pvpoڣw䰪 E. UYKnkiDXmkmnܐ-ZSChC ڡQv-*J_MTd]Fk)>!8$ Xdu9G›IQ<6Uk^ҏoLөIENDB`moment-luxon-93c85a3/site/docs/_media/Luxon_icon_180x180@2x.png000066400000000000000000001376431477254173100240660ustar00rootroot00000000000000PNG  IHDRhhzasRGB@IDATxgMzSP:RPA)ذb PDE"EP"E}s#ۚO.df2d~yԀ\CwPSJU8(K *YTŃe-*JHWk9J~K٢rJ~{^G뵔k9So(P@mc`@/ZBԺȳ?K,JRdR5kve)2\~l//V;_e?q<>#L,gj$UAT@1U9CPkZ PsZ-:;zw'MG4q)vT'x&U[?ȤZ,}+yDA5M\|'o:EdCsq+D-.PMEմ7Q/G`tc^ +^@<+4ޟ!&p&v50'٧O:YRz,㲻@t0"|xRN7vdWJ"3_v`0;P/]ŬiLJ'wD-!fE4sok wʧ|7>@[(7Hr࠺Pfy"Mn~8{4q| S@y@2pP] R~碏@@^`5Ko5ÕG}N; ?.[>*B1wLޕ4Ypֽ3RG# L:n@~.'>,V!>@H30 PDw/zH EoůF$#DV>j/I;t޿IUTW eN,-Po)k;&[OQMb[|p=E,_>#}dzp/t%0+zih*Щt7"E13%]RmbnfNշ#2>@G=M].O_qnpܱkoj ]omFw.^oY2*T*\*T0c]HUTR3%CוJ/#ƿH=L}Gߋ>Vyvڭ-\9BڽW"-^ZaZqyzrٖ߲޾+*^NUPSU)_KVu"(/:abj@5k:&ElRw⯯tt u-ݸB-[5W-_=O;WZX T PPU\_:UyxRF:_VQ(+SNtwSnEFAupw˒E"ӆ-MS dYr坻.QzGPkRF.EwKX@ˏ)|-sVO,u%J7*bW:ARX@-X:U-\D\S,b ֵNQV56VDKsA.J. u\S:Y GYQs|vޒ #wNYXմiE.E"Nqj[ؗwDz\9|$s>u\C7Yr7GVi95uX4ߺRͨ3~`|I2:*wnV?RMmxڳogR7~.^>:9T ^+aO;࿹s>A&q>nYsxصU͘aEmqo>YN/P--v٩c#__+UP='M঺(AʤIB{%㩓2lW?~eȔGkgdo|piѰ:cEK7A %#E7ڵ H EQi/3^"86 '?1Rv-PH)նمKU'DD1Gq>>@{8bQb|&J6pSvnRgÈOyop۟pQ1+Wbx@(IW S~\D]WJ(\jsy=5W;/2Yn'0>W;GNYL$M>-W>ת\WL]8ճ]Z^]`\ $W_?-`^(q3K%o&oJym*n{ܴO{м69u=>@oHA5_⢺qre5Ƿų/ƽ0|A:|q0AM,V:P>@'8`pzA5D9KΏF?&{VMŊTJWQX--l+ ʧ; ۬26}X\߲!/]{۲ yiZtّS oq#:dj8V*.9~4>q<.PHЀcdԸt;B*jWUeKUQf.t*yZlb}n ٷ. VZ^.Psb!"g4VvB o۫>FnܲZ 3A$Xd'qgNg DcVj{˲ v_/sxyTÍ9z4<1nWW_9ܷHaULSXudF UI ӡ!aYrB9/%H˪K<:TޮSWwF >sh|3bq.a'e F7GP$}FQծvwdsUzsQ^5kLf]lb((%tۮVhuC~gn#5K+ |vq$,觲;GgK@T#]j@ -20fO0xPo?V t%@*h1S:_Zhm3 x|>V`pԣZΜJ&s%)Hz6b%G= 9~?Flu" a"1C>}řOKPvx.Go@ h9S }zOܜWP?-[st1Ql5Sei-/bV $mYTY~P4+}}@uʱ=v(UB]@jʁMv 5շ΍< 9y>U.9 :,G, XݗZ5=Wz@ H/(PgvX#:gMJFR#noy(rJuU]1uڊMryD=vIj1X.'sOuqyJVbvqq9 G 8_$<>Jw-Mnri=KMm^.弄kkRO- <]I=Q4/3m;DTd;ZwG\s+xk~x5K,5iG +NE]{ +$J /Ar;9'-݊ Ӄ/eAM^eQ'f?#xCXUzꡪɳ\NU6#ϡ=`~5Nd S>F x kJe}t5I<䤗bQwund @!թ́u:Gngzkjq~=$b\js9?.F {8?0ϛ4#EkzN2J).Nps 5.=< bFWK;Npx@1|6ItbnmUdIGZb&y7:%XNtIӴ#YV:޲xYjzURUvw?>+$I/ۓWH)%ny;χC8/% ^t=egC`;=վ$Bo"LΔDÉo0#˷Sy%YTXK.TTgH>^7@N%t&}$t V^jsy/AoMi:MUP;i&~@$cZ^N.Rߠ?9=k7.SC?6n]STwHON3N:7S^ށJNݳ]"(6ȕ@G3| Ithnmn$ǡ$m.h' T3C=;ɧF_6D^i1NBoG*N;057[rb\FyWy:Իy (794%攗C2> FyҞFreL 8pjWO@mز*d̃9/s6D?aF4sK<Ӄ/T`'$ؤ1ʓ5k=v@"\kjޟpnm(RT䏀?ޏs93˼?W`WFU^h; V8xPy_IR~^{Nַs:BAG;i暗 ^Xfy^" @*дR"TvD:j?5|AWCWG `1$0l*ebGLNIvk##O#s# L@ FxA`E[=` \x=F+wk<{KX STEu?ޏseƺcCW?MU\G #\dNze~V8eaAoE\y&9}Hh'˷ ՉV ^ \27"0]1ͣ"7t2(XNNx.u_y'wd նg2__bs9`'tP=m4q ]>RO|W?Afv[%j򥫪3J|Gm!s`XbJ`fNIhT0T7DwD'lL w?G ,X\y\GԦ"NU]ï#'EWArRoe/lc 0-{8.f7SzZ旺WLfr Sj^;eƀ5$ϸ<I'o4O]SP6ej!ٻ3|,b%@ZsWp)1`^e)@9n+Y]`CmvP成}1Ѹh`N3 *ebMe4@Vwl}ѪVZ5 D2_?G #ڱ/FSg 6mǪ@߫3q7U0j TgzY;7"𕄞uJ6Cq=$iFf"Ǽ,/|mپ^}< ftǜXדFRs%xr3qA$X1Ѹ!ZV+C?vl|Y$J7#M8Ry;:sޔ0*MsГ l7oS_3 8Udj7 DS%:b{A`q:D2=^ٰqO{Ju77_? F&P^Ď6cW6h`Bי_?MF 9xLp`)E`1 6j4h RM'c`J'6*nڌ_?MF 0#M.f#L ,L l#M1hWblf25n`kuK+qgrdq>@-H6N6\8hAsv-.#ՙތ4 }GLK;$j Vm5@K&cyƕj!nUry.Y1@8xɿW  6QdZT3c/'I@v* ^E>kՂ`)H 2&J.rjjq8_V1$o, !Ñox`eHE314fhɹu]-G(FrGz%Bi08hvG#nD 0%/+Q ǼDgm&5MIjrq~=9hD,Wd 3F oq^1)L9D"٧*QN5!Oy:2zkt6:rƕoypbnGz;..MIO$ )aJ^`:Ώ&:.3PoL.nLPEČFgW#t.8BEN9u޸r*܎X F\H%tR/5iB#aisp3_CpZLLGWIg~?Rٻä uDjFm89v>w7W%&{v`h1ҹp1e;^`&w &Fh-}&T= E SikԆ_9o E9\eWv0ń40Qzk7\Ȍy_'=h&prAy{t9` bB$یHu@u|6:D1/>5ϩ2hˠ( 2|H$t^`&]u<*@Kx5̱;7_XV$kԓnFs>@ݍ͡'bY#m` B48Xv#1} t77&r~~-2ߤ%kY%AyXoo t\~zTBET,C/PX *Uv%Q  9#@csLijuj*uޖ`ma>"@ 8w9mV'\vEtV[;vm`sVy*Ԑ$ ȟMw%M{ádP/STHUj/#иvk#"8#Xg%"@ˣdݷGY<19WQ&sgvަoG3XM֪ &vP6=//{H^*\]#T8 @r5nJ"݇klݱAwϺE^vtɊ -WҋpcmY޳C=Z~X.ހ4!m_oȦp9^ fkD6cuz/}٢VYWGVi n(_!븿#L2hz ֙4X v50ya:X@uxF49jZ|&3#-;3Q%j٪9j߁=q7kW;>ӁQڍ˵fy3t31!ptC/eYSfcUwwN${;6vykrcXXTPQXYc Yoj #/X^,zG NOz/@Q `<@nPDga;||yE [ɱo8$X s؞OP7㈵;Vi g*jF,tw:VXsI c(~jofΒjQq׼WTW(}w{$gJ}& :)vPp@cbTJj}< ǼsOYk5}J\" GاRO6];(ca''ۏy͵s_2b V^]/@8.3RhiQGOG{nmnv[z6FBzAu@ >XynIikPɄ<+T&gI}bqˣO|jnBqvk+{cGhKHOp*AϨ@6g2². SULHvf"NZٚ,#HL+y.&9sZ0R/|=tG+Rҳ>商6> zBZ o2D[' *:orꔬg/#ϬuDSеfyq7_z,nnaӬSV[^M5 gBvP5mnپN/ՈλX5[W cle6w!;miZ69۷ ƞ_$ $[^-=2?sQ}e8OG-,VVBr;mٿs#5V+|N >Luv_,-ɲm 8W8YU3W9yI-Y %`eSzwkr&fԜz&o:쩼4p@+J:;я#* m)~U`LrPJ̓N"S%jxO7B͘?NS-@d06[:C8hn4 c,>]߹_hミNlM0P~!ޛðUF̧}2ȲE9`!}3uDYeXx (VlMgg;@DS:o۱Q5A3$jhYQ"&[ &uɤwW}>l*+?[ \Dot,m{a^sL ^ʯA%05N4%5Y"&'d~$0m `$Bnڭhe)SbV1\L_czͳC<F{8_dse3,G7|U[)bqxi]1GXB1kТl` >!%q&%_4Yn VڶCmq0)X0kYU^ci0۩e{ag>e{rӳm7S ݟEb=͏ 6@"%(HFvر|Jg/zd,~۳௩jc[ڟp̧TbV V$ӽǫ>\lb}nzWM Dd2A͓TCqjqz3(pl0t)hv޳=hy^hg5trX~!܈QҝtL7mUCDe֊O{]W콈IF]Quj/&Wm=|s WP(=oS 5+ 'h kkmCg*Q͎߶f"EZlh9Г/H>_j/e5!W/0:hۀ3\!.vcb'KpFvք%ʱ[_8Ao:=˺IhsN;hY9۲}_ \w3\fa׆|!^p?B0vkg߻H8ːbWKUcBSnT][ݠ-@O|Af+ لgLrg+wbh8I h4nX&fF&gBpNX.'ܤI6 t[E5kI{+& 2߷3+?ֲ/~;p5&ˌ#}&'i>rm&irWԕݞ U]1hgY' Sk!@g~s,.cX8c 'X~Tqn)q;Z4o- 3٩T"D,+~V'790|}O?*Myx^)Xrl߹Q2@:Eܬ'vŠ<h8s *URx!8Ix||!cg!i/VOJ>Ώ~C} p3QbvJ zae|glC0nNj]8Jxŋ2`_?n ,l٤piYҌClFk&Ϋ^c!#לVJpOΏz/V[.de=Rݰeb[gkJ~r>%5v`ӪЛ7S :ޛ@ 2>TjV(0I8&˄kM%C(gdy3iGB+f{s,E^:X=Yc}osN]Zeog_Ym=/E&m(#Ф^c?<(In7<(+6Z4<#j)]lӦ?մi!Ǒ_OxA͖9>И7򁐠;L.JҌv WcˢqۄFd$YHGuTJ\(ѺQ:u%؄-U9.'a ǒ W=VK{:֩~zY\VM2'n%I&B_/$/D~0M갧~A8g+ I;_ء9VU3.^ԄeR=ۿGO|_.䢰HhE#$]]gS_W_N~E@ϲ}i 9L Η[k +QZ.?ƺn;eΘ9FkrFPbnen۞k oQ$dpOqWi{?L7~WY>UF7,lj'/)`A&&/-ӶT.$zJZ}XPDr-[kZdR bk 3zY"ud{OncusG' 0Vn) gOGܩpfc GY[B1C|a};~"%|qhQQVsp,*GXE-DdD[zz``ǐg/Ls7u:-P"T.9 vQ8 BoA&s;`C}iw')0 L&gwM'[ a6'w:g}(\QfP9c<Q1w[ť^V;l {q> je@B%ï׎,(Bca'$zAbZ惋{(i\m̫9΋"~ء`:qFJe8"YCJ_:U=F̋G2$!Uy Ǝ 3?K]%?#8dt W>"fgUT0&0KtqKM݌ @22@3: tt/ꀚvt$XgL=C>I='`~պ?ݯ՟מ\Р A>gD>.N'e쐟 k( Ò1Nb|k[i,-)oUZ+-} No3fSf#J;O`Lvy1hʆ#dX8D 4TUee `N*sԓoȲPi*nzXT'd^6 R,Z ³ת"V'_Uam'wShaILGM4CI@k 'M(I*[*qWyQOa=];;.yG_9 t Y@IDAT„ zC'a%6ʧ#l+epq#6фijpNb^vvz v9Zw/s_9u@NxM9D^fA!lVm&E@;bu̹ϫıZ;SUawwbwꍵ̺|8QN3B{Z/Ex9/d{Z\c_sg/ S0Tku-ڛTjao߹Yh%r\}mD׆(aX/ N_vʿM12YܒuZOdDXe|4q6袵$q'䁸dlCEN '<}E㳔PnްKBl4 S;]CwJ!q5$JxpeUdLlU{R̮~vgz$N}5WyؑY"NxH82,3"Ä$L(VD&bYC&JM~^H(Ѱ}Ƒъ=pN0qʭ6e'YKGMDf35JƇ_sSܖ8 H B`$^z=7B67^ igˎŝ+!R釅KWn:\@}VMhǶ;M71qn܃ۢv3}/}OrϽD"3}ƫn6O,g&a<Dj d;!/#&pܗ5WE'؆NDIH1h"A"3ZlHlཿ1gyak+"O1P˭^_^\x07#NCs*U?mM6O#z 3*U w[Wt|#D2d>룝.-?;fΗOQ}~vԸNkkW5mˀSt191K:cI6=–UD"2OB;9A~,6}lcvbD3t"vpXTCvna28ܜ=9G0b9µ2gĜbnYcmM9k U:E$,oE!"&"~}[-r7΅,%8p"Y=Ƿ:?5DЪ%y"1i!߳:0MM:[9vՉl2mÏ)a_],qڸ:G8?D|f~41+[k?WvH)=m=c헼-rJhw C<,KDNW22Cp8!ލ4/p%%7Cj$Ј% Hi(;XZZ\TÏc@ǝ>Zt"ṡCESqE ^Pq(:wO;$ũq bvdTRb^Q+fl,x,\x 5"ݫCo$"*bꇢgk DsE )8Kƺsc^_W8QKa\Jb?\w M4 P=A8LR1/2K93̟綻SH;?nXTѯ*&#/OG_b/lqK4v|"1IFq.AdҴiAM@:-"fa[yo]IOvXtOT0.#q>7xW7.zKrk Y/#GTvyTLJKrZ\ 8M&T$._3dz3>$Ϧ!sNia1RLɘF-L-yL(ޤ=T5,;UxBG_~zFp ';bgz,H'@V.k5MY!DDg990y7$h1:<%ø CpmDm#q,D<9϶f6 %SGڦO2T.~&}f:Ybo_h3S>D%T, N;iČG[JbAɃɲ$c<<x6M:۷f.1ĜceزɽmSlj"e(4D> ՚Þ>%;=4?Ʊ_ LȰ~]#"DXn{/qɻ% Z\IQq[óۧWЦDVErNuʛZ/m˰ݳ\{W;vL5fO9&$o!9 _kzT.ŊtGEIDc<< sN=3it@r%L.r;vFqqmBᨇɜq؆>6\Үi9n7dFdee9 5p#Lʏ%#ղ\pJ& @xoU Q`=!JENkB*rm88A=y }rC(Rz?+@k"1b \Y.7h"n*1:{x}YD6ͳI< Ud uN{si9e/Sۦdr%y#pn)fq1 ǰ9[?Vn$9xl e@a3BBU ^&L4=2FCV0,5rNlcx "2yͳtt=}rNu6OpiN)vkmd?k{׶R_x:mx8''@O 5 DQ>`V ^Z&ԻhhoBm9 Vo䄝U9Ȥ/M %QZoڽ+>AHyLxY^TmyA]KqL i3\YQ\yfyxM'qӃ^ɜdn2GsL庋$4⠝ D+wDK13qQp&'cRdE|P~p%D1pxsg.6/6EYfZLZ"*TL&) DDJ[@n (PyYܭu'l療&}scE_MͣuD&ZH Y{zF&=ڮτ'p}Yyy{vHK|cn2GsL\砹Aļ-@?W=VS`tW P;:,p9~^횳Ӂ0r_{lyqgh5CLXQ zyLϺE#4 8xhC"/GJl%R5O4"sGjнst|m=y "bc΁Z ͳ3+W?Q]`U}<'cU {9O`vbtxnoj:B㺡*@#B)^u' W,"N!'%ZhgIl F{Ct#݄ $|q Lj}3)n dx!iom7u'<^ʥHm4!"DpD\Ka7"#Y/ŝ$ծs=:*IԻzSqBL8W2/{?q;97Y֧BZ&iSƍ%ު/rpOILVr']mNL -nTO6YURx%pwK2vƼ$Rn1}ߕCs4o}WZ@| [PX册}+u<ֺ6N"/d΀3#Oc∿a+b oa׉gdY rnlx'&/Ym"fy\gy3d$М}5[n.6xXL8f!;.* uK|or v8 qc8%oҧm:qyQj`%vfŖ!g*ZsU 'z GI[<[9,>@b@#W"8EmHY>߀m|VíB I:W1y clΧiH眻{d# %dwCvHd[X'puбCrhąr$[)L㝉 )EFdM6ʉ MsNa'IDK(d/qgDrm/.0E)F830PB!sJѪE=qO@CXErmɜ15yz9;%uhkghe9y:=QzHu$JaCb3SĪrP#ދ}<HF ,;y(DsX瀤ژ[Ju!1`-31kn a;Y DŽ/fnenbZ.Sx}HJlTti?[("yRr]cB{yvR,խL+]3"+X R걪<30f.cӟlLl4"f1ię-!ѶiK:>wxHB9Z!\ o׵CËuH.{N ip!dS瓯QI,jrFJ$V1.I'yY7\_sz_GKQbvkpgggg e8 KR/ d&L{VU;1&Sl47، z ڔ5}Ks XeɠL!/ Zg|m\(ɄK/"fR(9E!0Ƃ'vĢUPFM=1@r|&AK^=;9ڏ6yy,ex11Ip01~'[4.GCS/I]<3"mf (D3VGb0/ק iLlF4}I_SՋOnY (n8;db,>kՌ m7چJ-̧/\gSHb@tC,b= =/Fk2M!%OHk?X-*J0t9Ida.DZ٧_s]KEdAu)$X 51}KE8@8NUvjX'6V(_~Ix!l>YHΉSe‡M -E1铺Ƭ }] 3 p )Z&< %A6=& _~s"r$w0\?Lz7X(fMkbbhDzCm_ȵ$?YO.K+O+(2\@WX"|:8H7yn/qb;=#}sIJFk =БPֿI^x X6b+nȣpT$-*NsOҭ|Ԕ}tN9r4sˊ#]~#ahqEtaU#b‹t$㪕0õms@\aQ/Ș[$r 's^)6b\Xq s++ZMhm>sz(\m-Z1ZĚ1kmVBmun g{Hl}^& fDAç#Ym~n B Ή+; өh lK)pֵ dFipy5VU#ư?Knv0'3ŽKm8<3F/oS S3*yxWIztEE`,@,B8\[u^d`s!/nk*-wL(gΒ &]X:Y,ZbdY$K4Bt.7qH%EWdϤJ2lRY.?q7Q7vȨǴLgk8)/dȌDH29`XZD#i+<,wg?NE4.zel.)/DĂppȑY]n0m.{QB`"I,]Ҍ6p QސFІSص5CoOEbbѼ,96k8]{D/@ dc#Zi Q^/&zU>.&sęCG6I7Q ";Eo''ۏ4?t|*~ F <[bSNl8DF9g𚳞u,9c؊{Cל ֽ"Sl2%apL|yEIe\l&Y$ &PQs!C4Y ,Ye!aoݦ#'!Hr.V=/ֈB.]$7%9"D e!`ꡜbN5_16Ժr bTrOM\1%(v-~Cv6$sG5m2I)6b(TX߻'PD>.eMُZS"IPVXV&(ܠ,9@/΂46n]- ] z'1[1g!n4_Oׇ@fT&򛾻!&7ލ8KpS,eeR[vbv/? Z!6Xu"t;VW-q>HnDa* {|t[U'5,o h``s!IzCNd9@M3LvjѨ6ɀ?M\\;bD8zϺIQk6Y#@n{NMT,F,ΰQ?w]VCnG/M!uǬm$:-b xvVNkk,Z@8"f M<vhg8xccy"[e#B l?IVE*k 5g ]$^g\LB╨$dBVZS胶 c]E%f d$3N4`s#/dcޟ^(KIh3CA]!0>ij([ U7^*vaӬAm{|ɉcl4hD l&o=@KJt n@0!6kwd Ϛr˔%E(Omu}f 8=r+}41F2⌔V7;0mfFgqDqN4K5۵-%rX:-7G"(+4s'#s2OzL1` -4-6o7h<G'$2cZzSm3ɠx:p3h=cnvrMĬǗS6$SL~W0cDMp8n bR)320U^ik2X܋X^FE""1 YqXi YcA뙴b"uu'Dm)&YQebr@g;Vr9@Q='=NB1vZiV1>Y$ׄ@b?g^& qXי-CwrAIks5W; N,H`dB.`A^v_6 O :oI߬FB^l[mZ\&FpDTVf'@;85%ak6g=3iҖUך+ܱ{vunaEr(5(m8eT3PF|h&+b[0Ӛ ^~V&ڇ(hG o&YϠLz1\m:pulE`0Yt+;D(m3MnrrX|V krvrh }sr8(kdIzg2]9םXub)㖙Ő5It6x%ChJ;|s RJwa Zb ski>rk}xqfbYfnk\O(zĀXZ 5cWtsȥ97`'m+;Jgz&sb.abI*p;ه:U6cMyCZ;C: 0ŢZdfB`U? n<:a5u5uLhxjCx ``afJF\>k81 DEjd&HB-88-ݕU?dIsHMj2W#CvS͓ sXO{S,yx{sog`ВAhdwMo ވD>Չv L&Wt:'x_Wuf鴇?p!}[tF_8ׄ#7i~ }sESڝk^ <-N2M8YC>3dv L b~*OHk\ ٕkF;z]$"9)t_atf :9I$8sy8+3oJ\$rsL#0$aGY;gq"]{: swe͎[IԶnύ8RM^lےg۩Iԍ羔DnXeH\oqd!M(hʤ~^H4BZyj/sߩjY\]k틗SCigDm 2A&d,`Շ,nwu`ł UlDDQXL4P G=i|SvM(Q+ޱJrDh?&32ժi1+~V ᒣQոOzljѰrxoS_𪺪Ӫg4CQ m.; 0 E}5.)(ehWgU{:w6𥤅j_&Z%lzuh@#͓OgggKJFԹZMNQwrHމM'޺V90Аϴ%iB/jd9a$sZe@/dD">L t쁡UiΕ'⋒I>zx#܌sYsM;8 bշȔL1P8]u+#CH55Y◄)SrHyjzMd8R=m˹4rxQ"*P&m`kgl<{Ϡb:3s&T9 r+]b.ACvp@/~.Zɔ9NN;9ߪc&HI?s(fխ^hEM48;Em6OϠd%i挗mru'F۶,V.1S{KT3t^Vca3[mTLC 1{#mN֧}d^iMsJ1b˯kB>wDlo*ନ}t#!H7҈t/) ]iRFs3oowfܚ339n&83?/XHwlψ8ffAf;1>c|XgϵcQ#cyo}s9J9N(|xcjg#!!>O: z3 ti%Sf|8WTs!!CDo9ΙȮ>m0==+Zq-o{( :'n\7n]c1mꇐs(hYBа[0asAn@fI߅N ~1ʍ!ل$TD$\6SH_3FgϞ&i;wﺺ9O9qZz/Y^.֠a7V:j`#y#^Mp 9y aÏ$륓W*Tr-L1uĤГFɄp8~t!3*`i8} ep%$mdkA9gwr{ Ȭ^͸yLy(< >c,|AqҳB\t?J>BV%Bc1B?r;]x=fRS& ]7m(1׈ ^(v%((=?Z[ğ` +,u![ks<>#׵<]a3ٮBF4?cO'Sû.q΃+Mhh]uDZY;>"NۋVoͬαDO$XeE+J~CB]>G2acHeGfĪ|N501228B0J)XbP$Ή?E8fʣK;wߕ@̑7{ eWFuɥ(y˰OjV:=JDi-?9rg+"y*yb47B'Qgd|"N[&ͬT]-o72㲐v 9R.hb^5z ,#rg/&"*Ƀ'?ڀ*%qKIw`;w%P6qu)Bo1|FyyuQMJFS.ݚ=1&-J4C]3{y^bAb9RMCR;(uZ)Z8w9d*.Y]_^Їܽ-|XQJ :F4s\ 2^_T~Ɍ!S+ӀtsYU9x,~{St{z_sӉsSzO:AϘVX ^t}e5Z 8t J42ijϼB d=,#81GatqT$pử.|T 7hO<׭ݨmΡeKru Q<2iY1n:t V]{&|L(x 3Vڨ|i{WZ4ѳ#Pmҕ[#3k z}vfŒb[iҏϔJtOTgx!Bƿx߱MݽwK j5tSU ś Ziԅ_z ybz4yueвṀNZ+TC2~n~L")3`|@,L<8" _~AnfƔ)!{cƞ&(QGL%@񓔀9?ZWz};, 3Pu}?gfC5m]~kaHV$px|ՂyoLG^gz(Cx 4U ws4EL}rڏGCkhN"Sfԟ:Ĭ l-F y~ZOcxRjHOz쫞6駯y颟?qGȥVaj'݀1OIeۊw:Og:}IdbJT]Qda5~.XҲ?>g58(0ΪJj4JpdLV338p 8Xu*[/LCZ&|>N8رG;kwiwBc=U&vVKnHc=J q1Goͅ߈tzdֺ333ČݐYڼg|PBX\[w 1R/S15%w_ETAҕRuLhJCE 5`+z*o,_#uO ue6ծ1yŖ'ӵ* &MFya۴i-|#sAmlz׹[6 9f;eA͝{݌Ph%Cn2robtL"rL: ɤ= _'&RG %+s4YQU_aWѽ4[;F`;~w\^ed~A!Ȏ]vHg>U\ٝ-T96lOHs.*-)F y"yA8C͏{MheszYSt'xv{SvXդ|6VM]d9J4a }LtnGBv uG!ETw8:QMtm+!U!UJ+)YS=WqxXϿ ?HCz6՝6bO|N¹ҳOɟ3 {a/ 6!q#湅3 f"J#:՝W_(eԇ|f87dW?vAJ"1%F7 G5(G0N4eJp?EIDATOڒY#+!^O2gnh=U9>;m"%>S_]4m2g>|]=s5쫝$r%Q>ZÙf%xBI{<( PmZP=up|z]4~!, aSHK=%0͗C?h5Z‡Nƴ>^"(h4lQ.%.)0SD xpK2vBuU~_kS dm 39GҶ&nY5c>И 3YR粒F~޼}Mtx/G<467姇0Q\=:<4]@^= z 73UB)s\\ tcm&y噘ʃQ S"[Dy/#cU=̾q |U9@k:0ܜ{G;?:엗 ~w65˵Fn-wFJXT(K_Zo R4u #ç}|b`04 [%J%NQ+_eg f@Zu Y ~1$_z8'FNM^1ۺ-t̜:ֱV|~/R6_]nߧNbO"݈ꈒg<^<}:iIx6 GY^We/Swk9DH6u.)@W3ק~#GwMVsDvOj 7ĵI@)l5ώV3^to&uwt䛾Dݝ^DTĠX0Lj_A=FO訩S9w#G;ր:Od|_S{NZjOtiE:#‚ u"Uo,(y~ŗYtZ.P{W:JԕeLS{VTmDUV#kG]9_[,f^QJxg6NF~_ A x㾿?d}ڏ*WnKÄ98c۝&99 KkM% Vrq3qUT&K]y茬$'|)_L֥"{;PC{ʭd[#)xѺݵ@[TPݢ.߳~U9L,UjTn FѶu53< ϩiyEWefoma>bCkB%8?ؙAfHHo_t@Dze/]"OV g{&3fKb%F=YJiSg9߼DWVuI1Qt "tD駤'O=JF<ۿo~cճOm)2"jXF`Թ?g8N 8 <AI{echpRPvRzg3quW(eȟp#U0t޵^JJ9]g~0a{S5_:<?M鼖zw[܄1IDzѶZd] A:/oYqg\2QsgZ] (PMVDl=n.WAO? nQY|!i|뒯vdXQʣ*Kwֻ)c&-0Q'G)42:PyX?Y~nFRq'&_4ؒ9̦q<ɔ)(h(&,-JDU Eu?'|~LM)r8Xo[?owُ[L&6e NP*}lu3h|-cl9^i8١ᇈ.&W:vV?A} ϵ0ɔ)a g~G!~'TMF@RۊKĠfO&]ƟZtQR&>F#sdBnY]U AڡeNq*l)eKZҲf H4Vkxi9iVti5h+E>͠RېһOy ]թ=3woi}`18 Ng%cΟ1wMg&#i Q兦(t$ҍ?Ypxd6̤LK=̦5/{uq-T}Qg^,f.F0}i즁R.d|*oן!/6Z7ykܨrW3~Q(Cz~ʱ֭_ zp#,Lu"wP宝Lq6~>lmij閐z Hgy0 YT+o1n*7M:;+C<(YI.s%T=bA3S淣wRh$fg|,PNɎig0iR=DP>FTvn+U~mY+.ܯN-k:`R&yj.O!W̵j:q!I$[O)?}ϡ#Tz Rlwfg_nWLzg`Jqf?&[. ۝Qf>G2k #YnSƣ<Ef`wuQ]`:`0=k{sޓ[Hu~:7 n ū m7 Fbj&93#6 ={r <Ael$hv^8^]hQ&ssg|:OpwJW]jr><4P:~v?RANu> 鎅]Z|% [t:vf28S\+\$2m)Kȿq\ k!v 'nj_9'j;ֹَ_<~լz dY/Yk3u9&IܙE!-sVgt:!x$ z63 !p96N{G1DEWц | +ꕒ, u Q_8O`.C\4٨i9vfWϝtܐ@#{&_m~*@fѐ5蹕O}0n?}lopu,D p.yFZI4Ґ0\ TC0pPlԗxOOpFaS뷮?c?ی؄b 11JSK. tS?&<#;rt!R-u)oc -6ipՇO`\@+qHܱ{$b`M1d/+C"V$}#^:fxzUracTѤ! OKzD{6j8cػ(DZ;ܬaG`4]Ĉ54"t:C6%]1^o_wO]8 ~qӄ;2Gn>-uT{0+IzQlY r'ujC b%[Jt!٪PA(ұC2)9PVl'It"TNIRzĞ!mTQrf"Cnd~P> > kN2x"KPzn/\9!FLvJBw '}߰Ƚ E u5bhPKԟzKO_uSP3&Y芧.D_uu"*@CmX䟪`{$ >k+2NXR,=@H >æv'|1!t(UwhZ\w0nzYal=ZBfd!AW˸?cpn"=y'o9-j A!sx~@ (b\-ĕ&CӪE꘧ğ 3aqGۊk,3zI[mBjxdw hAه =$_ζO;?/0-\;㤎^i=\$Oj2ut yhehG ~">CF"2zK@!:30* Pd&`AѬ f6JTUCI5T]wzJuz.ւoc4AgAC?TL]u }πj}O $xz1ȢA2kKW틊=O2Ao$;*Z ( 1d&uq O6ށT!:z3_g.乀9U/6q9S&ʳ6g/D yI(-2M{ Lr |XM2/Ҵ..4Q2룧w*2 g DHrt[;ӻ:H7Mr08{I\BǠzJ͌PLI39Px,*|S@HdDmeN-mL9@ݺ/sfQ- % (a@"s<2(M~,2Sԍw.o9^X uĒ (Kl)FJ#e(Zg!mV#r<̟܄DorWRzV_1a&Caqhq@G-=_>1OGMϧJ* :Oʠ97/zukN\_vkY]Z CY饛~BNņrEf]x0׽ Lvlsa ?X9] "6-jiڡ2AȐ遡v)^h\TsdU U?ai(;0(K^w^T-U.RG]h{v^)_쩯mhY6#j8U2~m僣j{ tǻtT)]DѐLS; zP^A6K;[1CA` "BMGOZ{w"ɉs{UKIJ5r8ӒPWň) >y4U"w3g)9ЅʭSMyJ﫭{p81(XP@Lg1y*GDxNRQb{P'BӁ"]҈}wv;!Mׄ[8Yo=aE]S1eShn`%սG; S%1aHcUHNS )w $C}9SW<2=< ύaWG@Qz5fOǵPCe/f ❆餱igXzק2\HPR"UMcg4l) CG/BiFR> ӔM?`"ՍKs)ӽe: O&= ۜ1lZn z? 3OB5F@UG.Pp\bB } Sa}LCM,'<63(+ Qn3L;!.' Hc h0(__9-\1,r% -1aڙ=8/ozg0,ʂU/Z8”骖~gM RnS0e0A"A+s ||!5TOFcU"K*ͨ v-smPEѶ;!q]c)%LnO#=4F"O9?>PJo2A^FWOc[jVJt(CnBQȤ\ey%% VDU?`?S$0oFIhHRːM\hF)L8VR=%a-wǧ1:c01 BQhf 3J5ŗ>İ^fgЫg~O"3#q/w];*K6 @?aV'*YZ(@g,Տ_qцj3Gچn4&DFp&WLh=7{w_{jm]-;j] Fۧ x*V ?f nyƪO RU).bUKN,<~M[+ ǻ)k7pM Aa˖ٓ)6᫪h>Ȧ0hJA"hE!֮6]8 F5z~0K8G_U, (QjB oO&xL+Sq}mDeU,D|{elKP-_`>As +pZ ,0p+(%PpbK9{t-]As6n#S].Q`߱MbɆ猳JYvOK! ClFWùd}0* z6KAc\ |CWú|6G>7o^CD:XéȈpGqQL%D>" {82!THlkO ]lb$l)é\Cnfg;ʔ0繟)i$ i. 泉YfթR64p-vB>s7.W0 W=HIh^NŐ^5ˏ2d9í0uՄoxߴ jp؈-@Ae\˂{Bt^_W:hhT,_R_ˤ!qШŹ7ѺJ|2IE+:_u(?_hfB5F"YwS~&]g֐2xhd&I"4-2c,cAsa0RZ_\YFyk讧KH2"2kn骕 )k}&enq=-eɔ f85(>zP@z/h߬v!aЋcY>y، Y1pB[3rA'J=8뷮HŃKP2i8{YKHln9q͜#K!ɔ)1E8s?w efyTQ\<<(^/vѬ- Ih]vg3 Ly5K{>Ґ ;R5d _Es܏x]r;<J-ytGPJ~PpVwu[^aq"Jxh;@NN!c\7T`dwa3>f ' t"0@aY>M{6:BlG/=eBoiISH\$OňX"2es穙*\K 4XWiY$[HQH) |(G*'.^9Go] xێ.g2OJ6χ*ѐ-S^s vןnf_^IR%TA 9u޽o5_;V|;8z=! f!g.̅d4W7x}6)]S fM 'SXL@̄ WNJwWUv9/:qB#piD)eLaR0"K:qX08*l5/NC&M&I{"eTމ xꯥA5fs$#O&a%L~%g:͜{[tn>4AXՂka%ILڛW!$뾕 t5iLK GZHTҤ %C% @d|[yڒ/MUk5NM9_KB<^Mjod0h^缡N،@1{sZ}#ڻkwƭ%V¼l +LXaܦI>K 1kS 8fyb|Q4Z;GM0s@#cPi]ӔIL3 \iv@SG 0k\q[mo37 9M:HCpoeԫ'FXU1qn& \VByhv z\{jag:@2i, fiPKDEyfECsi˭##awWۇ m&2LZc_)Ǿm腒.C̜d܆ z F.\? 6 26lbSBZ6qc\)®a!]0ǙمKf_5EO?G#4w؁/]t  Zc{.^W(m20Dn)}}mҪa UkyfQӗ|m**6z|l2Ek+UƷ෉ mKfIҜI0h3gQxc2[i&-V()g 59cppeμ{Z96cj4ϩw>ffh@X{ V{z)@ϝ EYS4ET/Z2e <8L,@\o4K96cݧ'0bQ 1P:y>|Ww^sG4C>9ڒ{;vp3j9i]Eeۉ;XCWX 43<j++Kp2b4e0{sљ5U5äL|1 :i8mTpH $ bL`F7Hġr/ TZ)TY[aKgvT Tn9j-Zpo^n@e܈dмS_9#a5>dXG ; #Rǟwħ*u4־E)\7Ot#Qfo+SvSm2hy8{k7"HҦ+7K ?u~R-S=]udA- CWNThڇt 6(nrH\ZۿZn"Ag~_,.c6q ULǓv]gr,^T-ʒ]cn.Vl [̝M<_e*d`0mi_]V"q D_0ž~O.fM _0=3u2]ENdݰE`SrM蹙 ߳? / זLl8y 7~`м%# M;Ϛ0]s[gdkXsQ³2;YuSt6,]<>w svjiis><^>R tiW!%W n1ɓ=D־ES)pfǚHb4сffV 0Wa>HP awG}$PL}Zr }gx'^1 9k0+'Ă?0T@yjdrS/ڶy>Jp 45B6bǁ< xI$JCpr' pB]s5{/(ZpMn_xQ#$gN Atҋa8~ Cx6UF;AgN dfW߼w>t[WvU-k])&M9iι^B9)2h^hwB0i]B2EqIJLyxҚ')ZiRBTU$V vJ]8^T,й!9ʐ]tTl I4 C&m:TwÙ򈪥Fgv1D^)@O;f{mK4s>`^ʺ*]HDSA6Q1h8qq@]!f.s74@ZdJ4TXN^|k(p k7B7"yjѵעY hy" l $JMYBLF@9]oʉs)݂3:?SL:=xV\ xHm۷Tܹw+dBFيv 6q4Uf$2h1.l0iS by[;7֑~B *OۉL&c& n(Kwi_ ӵ!66Nk7 Q3hpI=]<4p>Aq7ҕc&>5Db !=@VπQ^[.;,tҲrUKX3PyBԍ $0pgмGq=[mu4jNc:sd}(( fXaX%t8`V|Oxeʐ9FᇎYx#ѭ-<{&DۖvbnעQ3t">6+D!A4ҋJf]R?Un#{Lɭ0g\G1W*Ř}&6![m 14Š=v\{p0.^}],ׂ@Aw9ˈ<^̓ ҞU㎟##Щm2yµnF"ZH4yi =4ޤ3Š}ܫyCJ磩i\ .(X="dA.z/Γȋ%.Ncgw)F%t{\ղImwDtA%wWTo5YQb⁘*qt˛s11ȰYFiDEv_y2}o߽!]:*^:#0"rJd)ev pSSybx;6i SzQao1h7f2{;DvN0<"# ]gVl \|(]v ;_da]2װEξsl:GtՂ&I.T,7|.yTg / lLQR ]v/3Fy  W@ &OgWi8c5 @ PeRgiRe~HR9N2t)d2f  0疙owwF:+񵛗B^hkAQ~PWsdIij{V?xb~[xydĻTn˹KĬߊ'hU, xA!,B $4&7xi/ז'DXŠ ܰ1vaͫ-~* HL9j7dP=$0ƸAAA4u1,ϫ냹[K`Nmf(qt~6r.tc2[/vuA,oM74=v>JX4x~`'k/DrVTe*\#$c> =m C2ŠMF\->ې%xޖ/@ܗnY2#wxkjP QJ2:鑜!8vm֔ msRybcѹ_iQS r5G &RH'4Dz/i{kz;ZSbYM!^LH;gK}5"-DRDP *!xʕkàz%4蟲i5{%'-7u\=ӵb>zQMWzd[^$}]*wGK\TPzbĻ\0{PHT-4 *aVX :H.c 4iM,/L$\w gJ)2y;^.M!}p'J|3Z :|P{HC`D pM.Rl=OllV X %cH"yMfdd؇z02W,^Gwx: k.,f}rF[`Fhʤr0왃oHܚDϳ#@0<,Z[ :a/ 7D#p>rz}h}x 4=C$D+YIQ͟1P+`X v3֛ h10ˆݾ/zC:$;#+$&l @oњNM.B,SCΒ1gd]M\*cPʤbh6'3wb! „T[}>d 5OSőS;}?Å]$"W@"Rr[ Wi`_;% @*g-LjkkX{fqKDQG6ºٝ eT¦J--S@S&91/UX[qyH%buѯ*aDAp]ʲT@}/P_0bW\~U[#q)nb;3.>9{gI1%NR2i iOr~V d6uαƼTm ӗbazcBQDS:uhp #`+mIĠ9H)3,wW{)2R0^{ ߑA z6ɲehŠ5)[vl`}q֚BNH:.MGƙZn X Z7«TĈڐ_T P[^mH3!-i-YjȾzfw.|%NZ X26)2XYLέt¹NWBLjj 3Uu:i$ =ƯH-5bN4EX :IVU *׷n 5Hujl$^i:ڨXg0t¾NWGf`ʶx[Y5P;$ڰXm10X :k+/U:5BC`蛇;2AbʡbСa2?uMFaD 4/ROp"Rb^ɓxO"@{QOiT!&? T[5b <5\ŠM %,e/d+Of|ؖAi:bQ `tHk ~g~]<|Ȋ2 RfS}<#ϊ/ R/%RyL :;wЎ ѷNn ]DT8Yrq!mZqʳhg!3w IENDB`moment-luxon-93c85a3/site/docs/_media/Luxon_icon_32x32.png000066400000000000000000000035231477254173100233310ustar00rootroot00000000000000PNG  IHDR szzsRGB IDATX W PUcewqA-SpOk1'K,rMLF4mIѱqIK1R 7FP:ߕ Sg=_ʕflu@s3%W/ c\vZ ]u"z/UfOS)12nn&ȏzkҠzQ oBT),>Jt]J f>/|XcqFXE ɓR5nA0dy\`Q:SeNTW]T%Cyߗ(4AM \SuxW[ xd-;' ʢV[̿MlFӌD|F^Sbqvm.h X93w[an_Fn^*E'&5h(X,-M_% d2ELדH2lJ _MA,bۺ^_ئ꼪R3KݺxEa;\p lpD[$Bڈ;[0qV̳JF XabOEvN*bH`me# RY9){r-tȦ?)d8MbqpwE#vȔ̈(%6m {'E,­;InOP64 &^.#AC@JzrpbŽƃNo\9`X>C{Ng},i$>NDP`(maޚ7"%/.3mAT8yƾ&<]`J/I1_bbOGdI)_:_g33"<uУ(Yu]G[w{:_Tvl-a0y#Zµh*H]Mzctr mP(VTq;ђ? I¿:Ƶde<@PG/,fUE(3[;RY Ȉ+&b3 PR2f~^A2=ט WִW ϴd^ l1͞BLb4(v]ȹo_R.;65/޺s 1B.?7>]a4D8-׳kFQ$ :ƃ!:wubt;&SL ٫YI *cͫ倘4~AE@!`Z&Onj31`8ue称_>|n: ٽd6p}H/q2/|FyU]L:O#bPRjRA,b@yQǮ4Gϝ2[+\M{wƾæa3Q!>FEd]ޖyS*26 #u8.wE-ˆ՛'$`Na9rU [NDRnu-Y42M)**~D5:(0ucRMJr͉Hlժ0!,?LFƠSXE50ќӌ]JUfn|LsWF|Z:y7S)IENDB`moment-luxon-93c85a3/site/docs/_media/Luxon_icon_64x64.png000066400000000000000000000105171477254173100233440ustar00rootroot00000000000000PNG  IHDR@@iqsRGB IDATx[ xM^7bPsb ,EcxJDm 5xxZO[Ck1QZ<31CD*)jh2ݷu>N}{g׿k鈷B|%'#9TmFEB^0__#m" Efܹ~X0(,iǧsmˊcq4eUG%%?g1CY+V1孇b"/->҉4;a[&c"BRv4ݍ?¯Ql֪UwvTF jUs\@Q\ -h?$s[F࿄wWA/` "oy2թmTK#yLC (| `2c$ZoMSW҆RpiUXEXђr?)9%STL8=K*pvhA}ݧRYqX7qb4c K[׊&F4MN<m/H\QEr;cX!ٗs$fIgb(-2ݺw? eM֨ԀFuמ",zwk88,-~vOMt]2K٤il$&"#mx'PRTycV$pC3 ڬ=yȪ[2_]u"ZyAЙW&V/Fnh~g{d4jeٜ*!]?`--\?SIQQҥnmU0.nS[? K[=wnBUPo>ǿ϶qjbN_nk i\$+o~u:Lݾ% B<kU$G*<}<ߴfjG=ڍ#"WuD[/+7k]5CӆjB`Y I'd+hT#ݪ-S7^AԦE_:pvf-0{"T:d)ye02XZ>M"mG&k4Ƀ5+?|!9`F$Z%tvK,Zh[E54R1m-WP"^$S_i\[`-s'!͑(BEIk\>O-x:+B3'zA?@œQ=xّ҆t1Mć[RP½ȳ^\B4 ҁY4Қ^>WۦhˑxɉX6c_GH]甽q<=ٿ-a4.H, ̣`6m;,yQr:$c`m (Ԋ.ҁ3kojSɥh/)*:\cӤ vi@iLWf}tVro9TV'G77^3}=ܾlVʲw:|h=/sD Id`k_KS5GW`R575$sfIrÒM +%jE·O.wN՚Beh5L~'W c'U1S\M9:mǤ?P 6Ve`V?$:<1OS݋~ufٝz-\zza \ۋ!MmǐSTjcm x3OT9T 0n5gئju['d9۬'0~!+ 43Jl ZvFE3 IBؙDmS8^q&[,7+_ {kwuQw5,w)˺u=E,0jءlK{G.>_jSGJ\WU7(͘J{0̢~S=V5b؊QAcsb %lR";h@2Ds"ūÎ!3eWDu0)՚J,uWx b@ad `vU|G>7Cy-9aW%5CȪc0H-LyX0VI\k9]8*:la 2^9n({Y R56R\;d7\SK @t߼N_LO8iS+N St`?ƀ/O3$)Ma7"lKA<^#լҘϾtqH{8s=-+<կنa5Owp3@+Ar( fmZd2oe;) HYlL}Lѱin=nN__c2N\$]vm=ns$]$OaԛI"HXcM|؄}x $.! ̀N_T;)[; 5^U%[A2ҌQpOSdbP2G3G=FOpNنf玼QL_ϓyL-O\fé.e!E8L4=K&6RyG_?fv/"ȓ$upDsvNP8`ЭqorP!?s(re:~q9`ȩdiH,3B uJOy a>X?L$ÉG,=$P9bUȚ?HfVqWȊT^'Bl9͎I*K&`9aKɂ(24*DE9;$.f:j^gZ69QR !U8"eBxJʢ7~]^?&B'3kE>AI%7)%xogsJ8ȇX oX@Ɍ̿fȏ^|!IENDB`moment-luxon-93c85a3/site/docs/_sidebar.md000066400000000000000000000006461477254173100205240ustar00rootroot00000000000000* [Home](/) * [Install guide](install.md) * [A quick tour](tour.md) * [Upgrade guide](upgrading.md) * [Intl](intl.md) * [Time zones and offsets](zones.md) * [Calendars](calendars.md) * [Formatting](formatting.md) * [Parsing](parsing.md) * [Math](math.md) * [Validity](validity.md) * [API docs](api-docs/index.html ':ignore') * [Support matrix](matrix.md) * [For Moment users](moment.md) * [Why does Luxon exist?](why.md) moment-luxon-93c85a3/site/index.html000066400000000000000000000021541477254173100174730ustar00rootroot00000000000000 luxon - Immutable date wrapper
moment-luxon-93c85a3/src/000077500000000000000000000000001477254173100153175ustar00rootroot00000000000000moment-luxon-93c85a3/src/datetime.js000066400000000000000000002736671477254173100174760ustar00rootroot00000000000000import Duration from "./duration.js"; import Interval from "./interval.js"; import Settings from "./settings.js"; import Info from "./info.js"; import Formatter from "./impl/formatter.js"; import FixedOffsetZone from "./zones/fixedOffsetZone.js"; import Locale from "./impl/locale.js"; import { isUndefined, maybeArray, isDate, isNumber, bestBy, daysInMonth, daysInYear, isLeapYear, weeksInWeekYear, normalizeObject, roundTo, objToLocalTS, padStart, } from "./impl/util.js"; import { normalizeZone } from "./impl/zoneUtil.js"; import diff from "./impl/diff.js"; import { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from "./impl/regexParser.js"; import { parseFromTokens, explainFromTokens, formatOptsToTokens, expandMacroTokens, TokenParser, } from "./impl/tokenParser.js"; import { gregorianToWeek, weekToGregorian, gregorianToOrdinal, ordinalToGregorian, hasInvalidGregorianData, hasInvalidWeekData, hasInvalidOrdinalData, hasInvalidTimeData, usesLocalWeekValues, isoWeekdayToLocal, } from "./impl/conversions.js"; import * as Formats from "./impl/formats.js"; import { InvalidArgumentError, ConflictingSpecificationError, InvalidUnitError, InvalidDateTimeError, } from "./errors.js"; import Invalid from "./impl/invalid.js"; const INVALID = "Invalid DateTime"; const MAX_DATE = 8.64e15; function unsupportedZone(zone) { return new Invalid("unsupported zone", `the zone "${zone.name}" is not supported`); } // we cache week data on the DT object and this intermediates the cache /** * @param {DateTime} dt */ function possiblyCachedWeekData(dt) { if (dt.weekData === null) { dt.weekData = gregorianToWeek(dt.c); } return dt.weekData; } /** * @param {DateTime} dt */ function possiblyCachedLocalWeekData(dt) { if (dt.localWeekData === null) { dt.localWeekData = gregorianToWeek( dt.c, dt.loc.getMinDaysInFirstWeek(), dt.loc.getStartOfWeek() ); } return dt.localWeekData; } // clone really means, "make a new object with these modifications". all "setters" really use this // to create a new object while only changing some of the properties function clone(inst, alts) { const current = { ts: inst.ts, zone: inst.zone, c: inst.c, o: inst.o, loc: inst.loc, invalid: inst.invalid, }; return new DateTime({ ...current, ...alts, old: current }); } // find the right offset a given local time. The o input is our guess, which determines which // offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST) function fixOffset(localTS, o, tz) { // Our UTC time is just a guess because our offset is just a guess let utcGuess = localTS - o * 60 * 1000; // Test whether the zone matches the offset for this ts const o2 = tz.offset(utcGuess); // If so, offset didn't change and we're done if (o === o2) { return [utcGuess, o]; } // If not, change the ts by the difference in the offset utcGuess -= (o2 - o) * 60 * 1000; // If that gives us the local time we want, we're done const o3 = tz.offset(utcGuess); if (o2 === o3) { return [utcGuess, o2]; } // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)]; } // convert an epoch timestamp into a calendar object with the given offset function tsToObj(ts, offset) { ts += offset * 60 * 1000; const d = new Date(ts); return { year: d.getUTCFullYear(), month: d.getUTCMonth() + 1, day: d.getUTCDate(), hour: d.getUTCHours(), minute: d.getUTCMinutes(), second: d.getUTCSeconds(), millisecond: d.getUTCMilliseconds(), }; } // convert a calendar object to a epoch timestamp function objToTS(obj, offset, zone) { return fixOffset(objToLocalTS(obj), offset, zone); } // create a new DT instance by adding a duration, adjusting for DSTs function adjustTime(inst, dur) { const oPre = inst.o, year = inst.c.year + Math.trunc(dur.years), month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3, c = { ...inst.c, year, month, day: Math.min(inst.c.day, daysInMonth(year, month)) + Math.trunc(dur.days) + Math.trunc(dur.weeks) * 7, }, millisToAdd = Duration.fromObject({ years: dur.years - Math.trunc(dur.years), quarters: dur.quarters - Math.trunc(dur.quarters), months: dur.months - Math.trunc(dur.months), weeks: dur.weeks - Math.trunc(dur.weeks), days: dur.days - Math.trunc(dur.days), hours: dur.hours, minutes: dur.minutes, seconds: dur.seconds, milliseconds: dur.milliseconds, }).as("milliseconds"), localTS = objToLocalTS(c); let [ts, o] = fixOffset(localTS, oPre, inst.zone); if (millisToAdd !== 0) { ts += millisToAdd; // that could have changed the offset by going over a DST, but we want to keep the ts the same o = inst.zone.offset(ts); } return { ts, o }; } // helper useful in turning the results of parsing into real dates // by handling the zone options function parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) { const { setZone, zone } = opts; if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) { const interpretationZone = parsedZone || zone, inst = DateTime.fromObject(parsed, { ...opts, zone: interpretationZone, specificOffset, }); return setZone ? inst : inst.setZone(zone); } else { return DateTime.invalid( new Invalid("unparsable", `the input "${text}" can't be parsed as ${format}`) ); } } // if you want to output a technical format (e.g. RFC 2822), this helper // helps handle the details function toTechFormat(dt, format, allowZ = true) { return dt.isValid ? Formatter.create(Locale.create("en-US"), { allowZ, forceSimple: true, }).formatDateTimeFromString(dt, format) : null; } function toISODate(o, extended) { const longFormat = o.c.year > 9999 || o.c.year < 0; let c = ""; if (longFormat && o.c.year >= 0) c += "+"; c += padStart(o.c.year, longFormat ? 6 : 4); if (extended) { c += "-"; c += padStart(o.c.month); c += "-"; c += padStart(o.c.day); } else { c += padStart(o.c.month); c += padStart(o.c.day); } return c; } function toISOTime( o, extended, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone ) { let c = padStart(o.c.hour); if (extended) { c += ":"; c += padStart(o.c.minute); if (o.c.millisecond !== 0 || o.c.second !== 0 || !suppressSeconds) { c += ":"; } } else { c += padStart(o.c.minute); } if (o.c.millisecond !== 0 || o.c.second !== 0 || !suppressSeconds) { c += padStart(o.c.second); if (o.c.millisecond !== 0 || !suppressMilliseconds) { c += "."; c += padStart(o.c.millisecond, 3); } } if (includeOffset) { if (o.isOffsetFixed && o.offset === 0 && !extendedZone) { c += "Z"; } else if (o.o < 0) { c += "-"; c += padStart(Math.trunc(-o.o / 60)); c += ":"; c += padStart(Math.trunc(-o.o % 60)); } else { c += "+"; c += padStart(Math.trunc(o.o / 60)); c += ":"; c += padStart(Math.trunc(o.o % 60)); } } if (extendedZone) { c += "[" + o.zone.ianaName + "]"; } return c; } // defaults for unspecified units in the supported calendars const defaultUnitValues = { month: 1, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, }, defaultWeekUnitValues = { weekNumber: 1, weekday: 1, hour: 0, minute: 0, second: 0, millisecond: 0, }, defaultOrdinalUnitValues = { ordinal: 1, hour: 0, minute: 0, second: 0, millisecond: 0, }; // Units in the supported calendars, sorted by bigness const orderedUnits = ["year", "month", "day", "hour", "minute", "second", "millisecond"], orderedWeekUnits = [ "weekYear", "weekNumber", "weekday", "hour", "minute", "second", "millisecond", ], orderedOrdinalUnits = ["year", "ordinal", "hour", "minute", "second", "millisecond"]; // standardize case and plurality in units function normalizeUnit(unit) { const normalized = { year: "year", years: "year", month: "month", months: "month", day: "day", days: "day", hour: "hour", hours: "hour", minute: "minute", minutes: "minute", quarter: "quarter", quarters: "quarter", second: "second", seconds: "second", millisecond: "millisecond", milliseconds: "millisecond", weekday: "weekday", weekdays: "weekday", weeknumber: "weekNumber", weeksnumber: "weekNumber", weeknumbers: "weekNumber", weekyear: "weekYear", weekyears: "weekYear", ordinal: "ordinal", }[unit.toLowerCase()]; if (!normalized) throw new InvalidUnitError(unit); return normalized; } function normalizeUnitWithLocalWeeks(unit) { switch (unit.toLowerCase()) { case "localweekday": case "localweekdays": return "localWeekday"; case "localweeknumber": case "localweeknumbers": return "localWeekNumber"; case "localweekyear": case "localweekyears": return "localWeekYear"; default: return normalizeUnit(unit); } } // cache offsets for zones based on the current timestamp when this function is // first called. When we are handling a datetime from components like (year, // month, day, hour) in a time zone, we need a guess about what the timezone // offset is so that we can convert into a UTC timestamp. One way is to find the // offset of now in the zone. The actual date may have a different offset (for // example, if we handle a date in June while we're in December in a zone that // observes DST), but we can check and adjust that. // // When handling many dates, calculating the offset for now every time is // expensive. It's just a guess, so we can cache the offset to use even if we // are right on a time change boundary (we'll just correct in the other // direction). Using a timestamp from first read is a slight optimization for // handling dates close to the current date, since those dates will usually be // in the same offset (we could set the timestamp statically, instead). We use a // single timestamp for all zones to make things a bit more predictable. // // This is safe for quickDT (used by local() and utc()) because we don't fill in // higher-order units from tsNow (as we do in fromObject, this requires that // offset is calculated from tsNow). /** * @param {Zone} zone * @return {number} */ function guessOffsetForZone(zone) { if (zoneOffsetTs === undefined) { zoneOffsetTs = Settings.now(); } // Do not cache anything but IANA zones, because it is not safe to do so. // Guessing an offset which is not present in the zone can cause wrong results from fixOffset if (zone.type !== "iana") { return zone.offset(zoneOffsetTs); } const zoneName = zone.name; let offsetGuess = zoneOffsetGuessCache.get(zoneName); if (offsetGuess === undefined) { offsetGuess = zone.offset(zoneOffsetTs); zoneOffsetGuessCache.set(zoneName, offsetGuess); } return offsetGuess; } // this is a dumbed down version of fromObject() that runs about 60% faster // but doesn't do any validation, makes a bunch of assumptions about what units // are present, and so on. function quickDT(obj, opts) { const zone = normalizeZone(opts.zone, Settings.defaultZone); if (!zone.isValid) { return DateTime.invalid(unsupportedZone(zone)); } const loc = Locale.fromObject(opts); let ts, o; // assume we have the higher-order units if (!isUndefined(obj.year)) { for (const u of orderedUnits) { if (isUndefined(obj[u])) { obj[u] = defaultUnitValues[u]; } } const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj); if (invalid) { return DateTime.invalid(invalid); } const offsetProvis = guessOffsetForZone(zone); [ts, o] = objToTS(obj, offsetProvis, zone); } else { ts = Settings.now(); } return new DateTime({ ts, zone, loc, o }); } function diffRelative(start, end, opts) { const round = isUndefined(opts.round) ? true : opts.round, format = (c, unit) => { c = roundTo(c, round || opts.calendary ? 0 : 2, true); const formatter = end.loc.clone(opts).relFormatter(opts); return formatter.format(c, unit); }, differ = (unit) => { if (opts.calendary) { if (!end.hasSame(start, unit)) { return end.startOf(unit).diff(start.startOf(unit), unit).get(unit); } else return 0; } else { return end.diff(start, unit).get(unit); } }; if (opts.unit) { return format(differ(opts.unit), opts.unit); } for (const unit of opts.units) { const count = differ(unit); if (Math.abs(count) >= 1) { return format(count, unit); } } return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]); } function lastOpts(argList) { let opts = {}, args; if (argList.length > 0 && typeof argList[argList.length - 1] === "object") { opts = argList[argList.length - 1]; args = Array.from(argList).slice(0, argList.length - 1); } else { args = Array.from(argList); } return [opts, args]; } /** * Timestamp to use for cached zone offset guesses (exposed for test) */ let zoneOffsetTs; /** * Cache for zone offset guesses (exposed for test). * * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of * zone.offset(). */ const zoneOffsetGuessCache = new Map(); /** * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them. * * A DateTime comprises of: * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch. * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone). * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`. * * Here is a brief overview of the most commonly used functionality it provides: * * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}. * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month}, * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors. * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors. * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors. * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}. * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}. * * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation. */ export default class DateTime { /** * @access private */ constructor(config) { const zone = config.zone || Settings.defaultZone; let invalid = config.invalid || (Number.isNaN(config.ts) ? new Invalid("invalid input") : null) || (!zone.isValid ? unsupportedZone(zone) : null); /** * @access private */ this.ts = isUndefined(config.ts) ? Settings.now() : config.ts; let c = null, o = null; if (!invalid) { const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone); if (unchanged) { [c, o] = [config.old.c, config.old.o]; } else { // If an offset has been passed and we have not been called from // clone(), we can trust it and avoid the offset calculation. const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts); c = tsToObj(this.ts, ot); invalid = Number.isNaN(c.year) ? new Invalid("invalid input") : null; c = invalid ? null : c; o = invalid ? null : ot; } } /** * @access private */ this._zone = zone; /** * @access private */ this.loc = config.loc || Locale.create(); /** * @access private */ this.invalid = invalid; /** * @access private */ this.weekData = null; /** * @access private */ this.localWeekData = null; /** * @access private */ this.c = c; /** * @access private */ this.o = o; /** * @access private */ this.isLuxonDateTime = true; } // CONSTRUCT /** * Create a DateTime for the current instant, in the system's time zone. * * Use Settings to override these default values if needed. * @example DateTime.now().toISO() //~> now in the ISO format * @return {DateTime} */ static now() { return new DateTime({}); } /** * Create a local DateTime * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used * @param {number} [month=1] - The month, 1-indexed * @param {number} [day=1] - The day of the month, 1-indexed * @param {number} [hour=0] - The hour of the day, in 24-hour time * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 * @example DateTime.local() //~> now * @example DateTime.local({ zone: "America/New_York" }) //~> now, in US east coast time * @example DateTime.local(2017) //~> 2017-01-01T00:00:00 * @example DateTime.local(2017, 3) //~> 2017-03-01T00:00:00 * @example DateTime.local(2017, 3, 12, { locale: "fr" }) //~> 2017-03-12T00:00:00, with a French locale * @example DateTime.local(2017, 3, 12, 5) //~> 2017-03-12T05:00:00 * @example DateTime.local(2017, 3, 12, 5, { zone: "utc" }) //~> 2017-03-12T05:00:00, in UTC * @example DateTime.local(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00 * @example DateTime.local(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10 * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765) //~> 2017-03-12T05:45:10.765 * @return {DateTime} */ static local() { const [opts, args] = lastOpts(arguments), [year, month, day, hour, minute, second, millisecond] = args; return quickDT({ year, month, day, hour, minute, second, millisecond }, opts); } /** * Create a DateTime in UTC * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used * @param {number} [month=1] - The month, 1-indexed * @param {number} [day=1] - The day of the month * @param {number} [hour=0] - The hour of the day, in 24-hour time * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59 * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59 * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999 * @param {Object} options - configuration options for the DateTime * @param {string} [options.locale] - a locale to set on the resulting DateTime instance * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance * @example DateTime.utc() //~> now * @example DateTime.utc(2017) //~> 2017-01-01T00:00:00Z * @example DateTime.utc(2017, 3) //~> 2017-03-01T00:00:00Z * @example DateTime.utc(2017, 3, 12) //~> 2017-03-12T00:00:00Z * @example DateTime.utc(2017, 3, 12, 5) //~> 2017-03-12T05:00:00Z * @example DateTime.utc(2017, 3, 12, 5, 45) //~> 2017-03-12T05:45:00Z * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: "fr" }) //~> 2017-03-12T05:45:00Z with a French locale * @example DateTime.utc(2017, 3, 12, 5, 45, 10) //~> 2017-03-12T05:45:10Z * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: "fr" }) //~> 2017-03-12T05:45:10.765Z with a French locale * @return {DateTime} */ static utc() { const [opts, args] = lastOpts(arguments), [year, month, day, hour, minute, second, millisecond] = args; opts.zone = FixedOffsetZone.utcInstance; return quickDT({ year, month, day, hour, minute, second, millisecond }, opts); } /** * Create a DateTime from a JavaScript Date object. Uses the default zone. * @param {Date} date - a JavaScript Date object * @param {Object} options - configuration options for the DateTime * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into * @return {DateTime} */ static fromJSDate(date, options = {}) { const ts = isDate(date) ? date.valueOf() : NaN; if (Number.isNaN(ts)) { return DateTime.invalid("invalid input"); } const zoneToUse = normalizeZone(options.zone, Settings.defaultZone); if (!zoneToUse.isValid) { return DateTime.invalid(unsupportedZone(zoneToUse)); } return new DateTime({ ts: ts, zone: zoneToUse, loc: Locale.fromObject(options), }); } /** * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. * @param {number} milliseconds - a number of milliseconds since 1970 UTC * @param {Object} options - configuration options for the DateTime * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into * @param {string} [options.locale] - a locale to set on the resulting DateTime instance * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance * @return {DateTime} */ static fromMillis(milliseconds, options = {}) { if (!isNumber(milliseconds)) { throw new InvalidArgumentError( `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}` ); } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) { // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start return DateTime.invalid("Timestamp out of range"); } else { return new DateTime({ ts: milliseconds, zone: normalizeZone(options.zone, Settings.defaultZone), loc: Locale.fromObject(options), }); } } /** * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone. * @param {number} seconds - a number of seconds since 1970 UTC * @param {Object} options - configuration options for the DateTime * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into * @param {string} [options.locale] - a locale to set on the resulting DateTime instance * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance * @return {DateTime} */ static fromSeconds(seconds, options = {}) { if (!isNumber(seconds)) { throw new InvalidArgumentError("fromSeconds requires a numerical input"); } else { return new DateTime({ ts: seconds * 1000, zone: normalizeZone(options.zone, Settings.defaultZone), loc: Locale.fromObject(options), }); } } /** * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults. * @param {Object} obj - the object to create the DateTime from * @param {number} obj.year - a year, such as 1987 * @param {number} obj.month - a month, 1-12 * @param {number} obj.day - a day of the month, 1-31, depending on the month * @param {number} obj.ordinal - day of the year, 1-365 or 366 * @param {number} obj.weekYear - an ISO week year * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday * @param {number} obj.localWeekYear - a week year, according to the locale * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale * @param {number} obj.hour - hour of the day, 0-23 * @param {number} obj.minute - minute of the hour, 0-59 * @param {number} obj.second - second of the minute, 0-59 * @param {number} obj.millisecond - millisecond of the second, 0-999 * @param {Object} opts - options for creating this DateTime * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone() * @param {string} [opts.locale='system\'s locale'] - a locale to set on the resulting DateTime instance * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25' * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01' * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06 * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }), * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' }) * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' }) * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13' * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" }).toISODate() //=> '2021-12-26' * @return {DateTime} */ static fromObject(obj, opts = {}) { obj = obj || {}; const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone); if (!zoneToUse.isValid) { return DateTime.invalid(unsupportedZone(zoneToUse)); } const loc = Locale.fromObject(opts); const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks); const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc); const tsNow = Settings.now(), offsetProvis = !isUndefined(opts.specificOffset) ? opts.specificOffset : zoneToUse.offset(tsNow), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber; // cases: // just a weekday -> this week's instance of that weekday, no worries // (gregorian data or ordinal) + (weekYear or weekNumber) -> error // (gregorian month or day) + ordinal -> error // otherwise just use weeks or ordinals or gregorian, depending on what's specified if ((containsGregor || containsOrdinal) && definiteWeekDef) { throw new ConflictingSpecificationError( "Can't mix weekYear/weekNumber units with year/month/day or ordinals" ); } if (containsGregorMD && containsOrdinal) { throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); } const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor); // configure ourselves to deal with gregorian dates or week stuff let units, defaultValues, objNow = tsToObj(tsNow, offsetProvis); if (useWeekData) { units = orderedWeekUnits; defaultValues = defaultWeekUnitValues; objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek); } else if (containsOrdinal) { units = orderedOrdinalUnits; defaultValues = defaultOrdinalUnitValues; objNow = gregorianToOrdinal(objNow); } else { units = orderedUnits; defaultValues = defaultUnitValues; } // set default values for missing stuff let foundFirst = false; for (const u of units) { const v = normalized[u]; if (!isUndefined(v)) { foundFirst = true; } else if (foundFirst) { normalized[u] = defaultValues[u]; } else { normalized[u] = objNow[u]; } } // make sure the values we have are in range const higherOrderInvalid = useWeekData ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? hasInvalidOrdinalData(normalized) : hasInvalidGregorianData(normalized), invalid = higherOrderInvalid || hasInvalidTimeData(normalized); if (invalid) { return DateTime.invalid(invalid); } // compute the actual time const gregorian = useWeekData ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek) : containsOrdinal ? ordinalToGregorian(normalized) : normalized, [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse), inst = new DateTime({ ts: tsFinal, zone: zoneToUse, o: offsetFinal, loc, }); // gregorian data + weekday serves only to validate if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) { return DateTime.invalid( "mismatched weekday", `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}` ); } if (!inst.isValid) { return DateTime.invalid(inst.invalid); } return inst; } /** * Create a DateTime from an ISO 8601 string * @param {string} text - the ISO string * @param {Object} opts - options to affect the creation * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance * @example DateTime.fromISO('2016-05-25T09:08:34.123') * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00') * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true}) * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'}) * @example DateTime.fromISO('2016-W05-4') * @return {DateTime} */ static fromISO(text, opts = {}) { const [vals, parsedZone] = parseISODate(text); return parseDataToDateTime(vals, parsedZone, opts, "ISO 8601", text); } /** * Create a DateTime from an RFC 2822 string * @param {string} text - the RFC 2822 string * @param {Object} opts - options to affect the creation * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT') * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600') * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z') * @return {DateTime} */ static fromRFC2822(text, opts = {}) { const [vals, parsedZone] = parseRFC2822Date(text); return parseDataToDateTime(vals, parsedZone, opts, "RFC 2822", text); } /** * Create a DateTime from an HTTP header date * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 * @param {string} text - the HTTP header date * @param {Object} opts - options to affect the creation * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in. * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods. * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT') * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT') * @example DateTime.fromHTTP('Sun Nov 6 08:49:37 1994') * @return {DateTime} */ static fromHTTP(text, opts = {}) { const [vals, parsedZone] = parseHTTPDate(text); return parseDataToDateTime(vals, parsedZone, opts, "HTTP", opts); } /** * Create a DateTime from an input string and format string. * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens). * @param {string} text - the string to parse * @param {string} fmt - the format the string is expected to be in (see the link below for the formats) * @param {Object} opts - options to affect the creation * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance * @return {DateTime} */ static fromFormat(text, fmt, opts = {}) { if (isUndefined(text) || isUndefined(fmt)) { throw new InvalidArgumentError("fromFormat requires an input string and a format"); } const { locale = null, numberingSystem = null } = opts, localeToUse = Locale.fromOpts({ locale, numberingSystem, defaultToEN: true, }), [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt); if (invalid) { return DateTime.invalid(invalid); } else { return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset); } } /** * @deprecated use fromFormat instead */ static fromString(text, fmt, opts = {}) { return DateTime.fromFormat(text, fmt, opts); } /** * Create a DateTime from a SQL date, time, or datetime * Defaults to en-US if no locale has been specified, regardless of the system's locale * @param {string} text - the string to parse * @param {Object} opts - options to affect the creation * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance * @example DateTime.fromSQL('2017-05-15') * @example DateTime.fromSQL('2017-05-15 09:12:34') * @example DateTime.fromSQL('2017-05-15 09:12:34.342') * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00') * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles') * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true }) * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' }) * @example DateTime.fromSQL('09:12:34.342') * @return {DateTime} */ static fromSQL(text, opts = {}) { const [vals, parsedZone] = parseSQL(text); return parseDataToDateTime(vals, parsedZone, opts, "SQL", text); } /** * Create an invalid DateTime. * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent. * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information * @return {DateTime} */ static invalid(reason, explanation = null) { if (!reason) { throw new InvalidArgumentError("need to specify a reason the DateTime is invalid"); } const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); if (Settings.throwOnInvalid) { throw new InvalidDateTimeError(invalid); } else { return new DateTime({ invalid }); } } /** * Check if an object is an instance of DateTime. Works across context boundaries * @param {object} o * @return {boolean} */ static isDateTime(o) { return (o && o.isLuxonDateTime) || false; } /** * Produce the format string for a set of options * @param formatOpts * @param localeOpts * @returns {string} */ static parseFormatForOpts(formatOpts, localeOpts = {}) { const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts)); return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(""); } /** * Produce the the fully expanded format token for the locale * Does NOT quote characters, so quoted tokens will not round trip correctly * @param fmt * @param localeOpts * @returns {string} */ static expandFormat(fmt, localeOpts = {}) { const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts)); return expanded.map((t) => t.val).join(""); } static resetCache() { zoneOffsetTs = undefined; zoneOffsetGuessCache.clear(); } // INFO /** * Get the value of unit. * @param {string} unit - a unit such as 'minute' or 'day' * @example DateTime.local(2017, 7, 4).get('month'); //=> 7 * @example DateTime.local(2017, 7, 4).get('day'); //=> 4 * @return {number} */ get(unit) { return this[unit]; } /** * Returns whether the DateTime is valid. Invalid DateTimes occur when: * * The DateTime was created from invalid calendar information, such as the 13th month or February 30 * * The DateTime was created by an operation on another invalid date * @type {boolean} */ get isValid() { return this.invalid === null; } /** * Returns an error code if this DateTime is invalid, or null if the DateTime is valid * @type {string} */ get invalidReason() { return this.invalid ? this.invalid.reason : null; } /** * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid * @type {string} */ get invalidExplanation() { return this.invalid ? this.invalid.explanation : null; } /** * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime * * @type {string} */ get locale() { return this.isValid ? this.loc.locale : null; } /** * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime * * @type {string} */ get numberingSystem() { return this.isValid ? this.loc.numberingSystem : null; } /** * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime * * @type {string} */ get outputCalendar() { return this.isValid ? this.loc.outputCalendar : null; } /** * Get the time zone associated with this DateTime. * @type {Zone} */ get zone() { return this._zone; } /** * Get the name of the time zone. * @type {string} */ get zoneName() { return this.isValid ? this.zone.name : null; } /** * Get the year * @example DateTime.local(2017, 5, 25).year //=> 2017 * @type {number} */ get year() { return this.isValid ? this.c.year : NaN; } /** * Get the quarter * @example DateTime.local(2017, 5, 25).quarter //=> 2 * @type {number} */ get quarter() { return this.isValid ? Math.ceil(this.c.month / 3) : NaN; } /** * Get the month (1-12). * @example DateTime.local(2017, 5, 25).month //=> 5 * @type {number} */ get month() { return this.isValid ? this.c.month : NaN; } /** * Get the day of the month (1-30ish). * @example DateTime.local(2017, 5, 25).day //=> 25 * @type {number} */ get day() { return this.isValid ? this.c.day : NaN; } /** * Get the hour of the day (0-23). * @example DateTime.local(2017, 5, 25, 9).hour //=> 9 * @type {number} */ get hour() { return this.isValid ? this.c.hour : NaN; } /** * Get the minute of the hour (0-59). * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30 * @type {number} */ get minute() { return this.isValid ? this.c.minute : NaN; } /** * Get the second of the minute (0-59). * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52 * @type {number} */ get second() { return this.isValid ? this.c.second : NaN; } /** * Get the millisecond of the second (0-999). * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654 * @type {number} */ get millisecond() { return this.isValid ? this.c.millisecond : NaN; } /** * Get the week year * @see https://en.wikipedia.org/wiki/ISO_week_date * @example DateTime.local(2014, 12, 31).weekYear //=> 2015 * @type {number} */ get weekYear() { return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN; } /** * Get the week number of the week year (1-52ish). * @see https://en.wikipedia.org/wiki/ISO_week_date * @example DateTime.local(2017, 5, 25).weekNumber //=> 21 * @type {number} */ get weekNumber() { return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN; } /** * Get the day of the week. * 1 is Monday and 7 is Sunday * @see https://en.wikipedia.org/wiki/ISO_week_date * @example DateTime.local(2014, 11, 31).weekday //=> 4 * @type {number} */ get weekday() { return this.isValid ? possiblyCachedWeekData(this).weekday : NaN; } /** * Returns true if this date is on a weekend according to the locale, false otherwise * @returns {boolean} */ get isWeekend() { return this.isValid && this.loc.getWeekendDays().includes(this.weekday); } /** * Get the day of the week according to the locale. * 1 is the first day of the week and 7 is the last day of the week. * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1, * @returns {number} */ get localWeekday() { return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN; } /** * Get the week number of the week year according to the locale. Different locales assign week numbers differently, * because the week can start on different days of the week (see localWeekday) and because a different number of days * is required for a week to count as the first week of a year. * @returns {number} */ get localWeekNumber() { return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN; } /** * Get the week year according to the locale. Different locales assign week numbers (and therefor week years) * differently, see localWeekNumber. * @returns {number} */ get localWeekYear() { return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN; } /** * Get the ordinal (meaning the day of the year) * @example DateTime.local(2017, 5, 25).ordinal //=> 145 * @type {number|DateTime} */ get ordinal() { return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN; } /** * Get the human readable short month name, such as 'Oct'. * Defaults to the system's locale if no locale has been specified * @example DateTime.local(2017, 10, 30).monthShort //=> Oct * @type {string} */ get monthShort() { return this.isValid ? Info.months("short", { locObj: this.loc })[this.month - 1] : null; } /** * Get the human readable long month name, such as 'October'. * Defaults to the system's locale if no locale has been specified * @example DateTime.local(2017, 10, 30).monthLong //=> October * @type {string} */ get monthLong() { return this.isValid ? Info.months("long", { locObj: this.loc })[this.month - 1] : null; } /** * Get the human readable short weekday, such as 'Mon'. * Defaults to the system's locale if no locale has been specified * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon * @type {string} */ get weekdayShort() { return this.isValid ? Info.weekdays("short", { locObj: this.loc })[this.weekday - 1] : null; } /** * Get the human readable long weekday, such as 'Monday'. * Defaults to the system's locale if no locale has been specified * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday * @type {string} */ get weekdayLong() { return this.isValid ? Info.weekdays("long", { locObj: this.loc })[this.weekday - 1] : null; } /** * Get the UTC offset of this DateTime in minutes * @example DateTime.now().offset //=> -240 * @example DateTime.utc().offset //=> 0 * @type {number} */ get offset() { return this.isValid ? +this.o : NaN; } /** * Get the short human name for the zone's current offset, for example "EST" or "EDT". * Defaults to the system's locale if no locale has been specified * @type {string} */ get offsetNameShort() { if (this.isValid) { return this.zone.offsetName(this.ts, { format: "short", locale: this.locale, }); } else { return null; } } /** * Get the long human name for the zone's current offset, for example "Eastern Standard Time" or "Eastern Daylight Time". * Defaults to the system's locale if no locale has been specified * @type {string} */ get offsetNameLong() { if (this.isValid) { return this.zone.offsetName(this.ts, { format: "long", locale: this.locale, }); } else { return null; } } /** * Get whether this zone's offset ever changes, as in a DST. * @type {boolean} */ get isOffsetFixed() { return this.isValid ? this.zone.isUniversal : null; } /** * Get whether the DateTime is in a DST. * @type {boolean} */ get isInDST() { if (this.isOffsetFixed) { return false; } else { return ( this.offset > this.set({ month: 1, day: 1 }).offset || this.offset > this.set({ month: 5 }).offset ); } } /** * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC * in this DateTime's zone. During DST changes local time can be ambiguous, for example * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`. * This method will return both possible DateTimes if this DateTime's local time is ambiguous. * @returns {DateTime[]} */ getPossibleOffsets() { if (!this.isValid || this.isOffsetFixed) { return [this]; } const dayMs = 86400000; const minuteMs = 60000; const localTS = objToLocalTS(this.c); const oEarlier = this.zone.offset(localTS - dayMs); const oLater = this.zone.offset(localTS + dayMs); const o1 = this.zone.offset(localTS - oEarlier * minuteMs); const o2 = this.zone.offset(localTS - oLater * minuteMs); if (o1 === o2) { return [this]; } const ts1 = localTS - o1 * minuteMs; const ts2 = localTS - o2 * minuteMs; const c1 = tsToObj(ts1, o1); const c2 = tsToObj(ts2, o2); if ( c1.hour === c2.hour && c1.minute === c2.minute && c1.second === c2.second && c1.millisecond === c2.millisecond ) { return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })]; } return [this]; } /** * Returns true if this DateTime is in a leap year, false otherwise * @example DateTime.local(2016).isInLeapYear //=> true * @example DateTime.local(2013).isInLeapYear //=> false * @type {boolean} */ get isInLeapYear() { return isLeapYear(this.year); } /** * Returns the number of days in this DateTime's month * @example DateTime.local(2016, 2).daysInMonth //=> 29 * @example DateTime.local(2016, 3).daysInMonth //=> 31 * @type {number} */ get daysInMonth() { return daysInMonth(this.year, this.month); } /** * Returns the number of days in this DateTime's year * @example DateTime.local(2016).daysInYear //=> 366 * @example DateTime.local(2013).daysInYear //=> 365 * @type {number} */ get daysInYear() { return this.isValid ? daysInYear(this.year) : NaN; } /** * Returns the number of weeks in this DateTime's year * @see https://en.wikipedia.org/wiki/ISO_week_date * @example DateTime.local(2004).weeksInWeekYear //=> 53 * @example DateTime.local(2013).weeksInWeekYear //=> 52 * @type {number} */ get weeksInWeekYear() { return this.isValid ? weeksInWeekYear(this.weekYear) : NaN; } /** * Returns the number of weeks in this DateTime's local week year * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52 * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53 * @type {number} */ get weeksInLocalWeekYear() { return this.isValid ? weeksInWeekYear( this.localWeekYear, this.loc.getMinDaysInFirstWeek(), this.loc.getStartOfWeek() ) : NaN; } /** * Returns the resolved Intl options for this DateTime. * This is useful in understanding the behavior of formatting methods * @param {Object} opts - the same options as toLocaleString * @return {Object} */ resolvedLocaleOptions(opts = {}) { const { locale, numberingSystem, calendar } = Formatter.create( this.loc.clone(opts), opts ).resolvedOptions(this); return { locale, numberingSystem, outputCalendar: calendar }; } // TRANSFORM /** * "Set" the DateTime's zone to UTC. Returns a newly-constructed DateTime. * * Equivalent to {@link DateTime#setZone}('utc') * @param {number} [offset=0] - optionally, an offset from UTC in minutes * @param {Object} [opts={}] - options to pass to `setZone()` * @return {DateTime} */ toUTC(offset = 0, opts = {}) { return this.setZone(FixedOffsetZone.instance(offset), opts); } /** * "Set" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime. * * Equivalent to `setZone('local')` * @return {DateTime} */ toLocal() { return this.setZone(Settings.defaultZone); } /** * "Set" the DateTime's zone to specified zone. Returns a newly-constructed DateTime. * * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones. * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class. * @param {Object} opts - options * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this. * @return {DateTime} */ setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) { zone = normalizeZone(zone, Settings.defaultZone); if (zone.equals(this.zone)) { return this; } else if (!zone.isValid) { return DateTime.invalid(unsupportedZone(zone)); } else { let newTS = this.ts; if (keepLocalTime || keepCalendarTime) { const offsetGuess = zone.offset(this.ts); const asObj = this.toObject(); [newTS] = objToTS(asObj, offsetGuess, zone); } return clone(this, { ts: newTS, zone }); } } /** * "Set" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime. * @param {Object} properties - the properties to set * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' }) * @return {DateTime} */ reconfigure({ locale, numberingSystem, outputCalendar } = {}) { const loc = this.loc.clone({ locale, numberingSystem, outputCalendar }); return clone(this, { loc }); } /** * "Set" the locale. Returns a newly-constructed DateTime. * Just a convenient alias for reconfigure({ locale }) * @example DateTime.local(2017, 5, 25).setLocale('en-GB') * @return {DateTime} */ setLocale(locale) { return this.reconfigure({ locale }); } /** * "Set" the values of specified units. Returns a newly-constructed DateTime. * You can only set units with this method; for "setting" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}. * * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`. * They cannot be mixed with ISO-week units like `weekday`. * @param {Object} values - a mapping of units to numbers * @example dt.set({ year: 2017 }) * @example dt.set({ hour: 8, minute: 30 }) * @example dt.set({ weekday: 5 }) * @example dt.set({ year: 2005, ordinal: 234 }) * @return {DateTime} */ set(values) { if (!this.isValid) return this; const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks); const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc); const settingWeekStuff = !isUndefined(normalized.weekYear) || !isUndefined(normalized.weekNumber) || !isUndefined(normalized.weekday), containsOrdinal = !isUndefined(normalized.ordinal), containsGregorYear = !isUndefined(normalized.year), containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day), containsGregor = containsGregorYear || containsGregorMD, definiteWeekDef = normalized.weekYear || normalized.weekNumber; if ((containsGregor || containsOrdinal) && definiteWeekDef) { throw new ConflictingSpecificationError( "Can't mix weekYear/weekNumber units with year/month/day or ordinals" ); } if (containsGregorMD && containsOrdinal) { throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day"); } let mixed; if (settingWeekStuff) { mixed = weekToGregorian( { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized }, minDaysInFirstWeek, startOfWeek ); } else if (!isUndefined(normalized.ordinal)) { mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized }); } else { mixed = { ...this.toObject(), ...normalized }; // if we didn't set the day but we ended up on an overflow date, // use the last day of the right month if (isUndefined(normalized.day)) { mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day); } } const [ts, o] = objToTS(mixed, this.o, this.zone); return clone(this, { ts, o }); } /** * Add a period of time to this DateTime and return the resulting DateTime * * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between. * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() * @example DateTime.now().plus(123) //~> in 123 milliseconds * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min * @return {DateTime} */ plus(duration) { if (!this.isValid) return this; const dur = Duration.fromDurationLike(duration); return clone(this, adjustTime(this, dur)); } /** * Subtract a period of time to this DateTime and return the resulting DateTime * See {@link DateTime#plus} * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() @return {DateTime} */ minus(duration) { if (!this.isValid) return this; const dur = Duration.fromDurationLike(duration).negate(); return clone(this, adjustTime(this, dur)); } /** * "Set" this DateTime to the beginning of a unit of time. * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. * @param {Object} opts - options * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01' * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01' * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00' * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00' * @return {DateTime} */ startOf(unit, { useLocaleWeeks = false } = {}) { if (!this.isValid) return this; const o = {}, normalizedUnit = Duration.normalizeUnit(unit); switch (normalizedUnit) { case "years": o.month = 1; // falls through case "quarters": case "months": o.day = 1; // falls through case "weeks": case "days": o.hour = 0; // falls through case "hours": o.minute = 0; // falls through case "minutes": o.second = 0; // falls through case "seconds": o.millisecond = 0; break; case "milliseconds": break; // no default, invalid units throw in normalizeUnit() } if (normalizedUnit === "weeks") { if (useLocaleWeeks) { const startOfWeek = this.loc.getStartOfWeek(); const { weekday } = this; if (weekday < startOfWeek) { o.weekNumber = this.weekNumber - 1; } o.weekday = startOfWeek; } else { o.weekday = 1; } } if (normalizedUnit === "quarters") { const q = Math.ceil(this.month / 3); o.month = (q - 1) * 3 + 1; } return this.set(o); } /** * "Set" this DateTime to the end (meaning the last millisecond) of a unit of time * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'. * @param {Object} opts - options * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00' * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00' * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00' * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00' * @return {DateTime} */ endOf(unit, opts) { return this.isValid ? this.plus({ [unit]: 1 }) .startOf(unit, opts) .minus(1) : this; } // OUTPUT /** * Returns a string representation of this DateTime formatted according to the specified format string. * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens). * Defaults to en-US if no locale has been specified, regardless of the system's locale. * @param {string} fmt - the format string * @param {Object} opts - opts to override the configuration options on this DateTime * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22' * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22' * @example DateTime.now().toFormat('yyyy LLL dd', { locale: "fr" }) //=> '2017 avr. 22' * @example DateTime.now().toFormat("HH 'hours and' mm 'minutes'") //=> '20 hours and 55 minutes' * @return {string} */ toFormat(fmt, opts = {}) { return this.isValid ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt) : INVALID; } /** * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`. * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation * of the DateTime in the assigned locale. * Defaults to the system's locale if no locale has been specified * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options * @param {Object} opts - opts to override the configuration options on this DateTime * @example DateTime.now().toLocaleString(); //=> 4/20/2017 * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017' * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017' * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022' * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM' * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM' * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20' * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM' * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32' * @return {string} */ toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) { return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; } /** * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. * Defaults to the system's locale if no locale has been specified * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`. * @example DateTime.now().toLocaleParts(); //=> [ * //=> { type: 'day', value: '25' }, * //=> { type: 'literal', value: '/' }, * //=> { type: 'month', value: '05' }, * //=> { type: 'literal', value: '/' }, * //=> { type: 'year', value: '1982' } * //=> ] */ toLocaleParts(opts = {}) { return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this) : []; } /** * Returns an ISO 8601-compliant string representation of this DateTime * @param {Object} opts - options * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' * @param {boolean} [opts.extendedZone=false] - add the time zone format extension * @param {string} [opts.format='extended'] - choose between the basic and extended format * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z' * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00' * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335' * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400' * @return {string|null} */ toISO({ format = "extended", suppressSeconds = false, suppressMilliseconds = false, includeOffset = true, extendedZone = false, } = {}) { if (!this.isValid) { return null; } const ext = format === "extended"; let c = toISODate(this, ext); c += "T"; c += toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone); return c; } /** * Returns an ISO 8601-compliant string representation of this DateTime's date component * @param {Object} opts - options * @param {string} [opts.format='extended'] - choose between the basic and extended format * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25' * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525' * @return {string|null} */ toISODate({ format = "extended" } = {}) { if (!this.isValid) { return null; } return toISODate(this, format === "extended"); } /** * Returns an ISO 8601-compliant string representation of this DateTime's week date * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2' * @return {string} */ toISOWeekDate() { return toTechFormat(this, "kkkk-'W'WW-c"); } /** * Returns an ISO 8601-compliant string representation of this DateTime's time component * @param {Object} opts - options * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' * @param {boolean} [opts.extendedZone=true] - add the time zone format extension * @param {boolean} [opts.includePrefix=false] - include the `T` prefix * @param {string} [opts.format='extended'] - choose between the basic and extended format * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z' * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z' * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z' * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z' * @return {string} */ toISOTime({ suppressMilliseconds = false, suppressSeconds = false, includeOffset = true, includePrefix = false, extendedZone = false, format = "extended", } = {}) { if (!this.isValid) { return null; } let c = includePrefix ? "T" : ""; return ( c + toISOTime( this, format === "extended", suppressSeconds, suppressMilliseconds, includeOffset, extendedZone ) ); } /** * Returns an RFC 2822-compatible string representation of this DateTime * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000' * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400' * @return {string} */ toRFC2822() { return toTechFormat(this, "EEE, dd LLL yyyy HH:mm:ss ZZZ", false); } /** * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT. * Specifically, the string conforms to RFC 1123. * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT' * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT' * @return {string} */ toHTTP() { return toTechFormat(this.toUTC(), "EEE, dd LLL yyyy HH:mm:ss 'GMT'"); } /** * Returns a string representation of this DateTime appropriate for use in SQL Date * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13' * @return {string|null} */ toSQLDate() { if (!this.isValid) { return null; } return toISODate(this, true); } /** * Returns a string representation of this DateTime appropriate for use in SQL Time * @param {Object} opts - options * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' * @example DateTime.utc().toSQL() //=> '05:15:16.345' * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00' * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345' * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York' * @return {string} */ toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) { let fmt = "HH:mm:ss.SSS"; if (includeZone || includeOffset) { if (includeOffsetSpace) { fmt += " "; } if (includeZone) { fmt += "z"; } else if (includeOffset) { fmt += "ZZ"; } } return toTechFormat(this, fmt, true); } /** * Returns a string representation of this DateTime appropriate for use in SQL DateTime * @param {Object} opts - options * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset. * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00' * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00' * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z' * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00' * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000' * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York' * @return {string} */ toSQL(opts = {}) { if (!this.isValid) { return null; } return `${this.toSQLDate()} ${this.toSQLTime(opts)}`; } /** * Returns a string representation of this DateTime appropriate for debugging * @return {string} */ toString() { return this.isValid ? this.toISO() : INVALID; } /** * Returns a string representation of this DateTime appropriate for the REPL. * @return {string} */ [Symbol.for("nodejs.util.inspect.custom")]() { if (this.isValid) { return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`; } else { return `DateTime { Invalid, reason: ${this.invalidReason} }`; } } /** * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis} * @return {number} */ valueOf() { return this.toMillis(); } /** * Returns the epoch milliseconds of this DateTime. * @return {number} */ toMillis() { return this.isValid ? this.ts : NaN; } /** * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime. * @return {number} */ toSeconds() { return this.isValid ? this.ts / 1000 : NaN; } /** * Returns the epoch seconds (as a whole number) of this DateTime. * @return {number} */ toUnixInteger() { return this.isValid ? Math.floor(this.ts / 1000) : NaN; } /** * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON. * @return {string} */ toJSON() { return this.toISO(); } /** * Returns a BSON serializable equivalent to this DateTime. * @return {Date} */ toBSON() { return this.toJSDate(); } /** * Returns a JavaScript object with this DateTime's year, month, day, and so on. * @param opts - options for generating the object * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 } * @return {Object} */ toObject(opts = {}) { if (!this.isValid) return {}; const base = { ...this.c }; if (opts.includeConfig) { base.outputCalendar = this.outputCalendar; base.numberingSystem = this.loc.numberingSystem; base.locale = this.loc.locale; } return base; } /** * Returns a JavaScript Date equivalent to this DateTime. * @return {Date} */ toJSDate() { return new Date(this.isValid ? this.ts : NaN); } // COMPARE /** * Return the difference between two DateTimes as a Duration. * @param {DateTime} otherDateTime - the DateTime to compare this one to * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration. * @param {Object} opts - options that affect the creation of the Duration * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use * @example * var i1 = DateTime.fromISO('1982-05-25T09:45'), * i2 = DateTime.fromISO('1983-10-14T10:30'); * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 } * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 } * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 } * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 } * @return {Duration} */ diff(otherDateTime, unit = "milliseconds", opts = {}) { if (!this.isValid || !otherDateTime.isValid) { return Duration.invalid("created by diffing an invalid DateTime"); } const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts }; const units = maybeArray(unit).map(Duration.normalizeUnit), otherIsLater = otherDateTime.valueOf() > this.valueOf(), earlier = otherIsLater ? this : otherDateTime, later = otherIsLater ? otherDateTime : this, diffed = diff(earlier, later, units, durOpts); return otherIsLater ? diffed.negate() : diffed; } /** * Return the difference between this DateTime and right now. * See {@link DateTime#diff} * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration * @param {Object} opts - options that affect the creation of the Duration * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use * @return {Duration} */ diffNow(unit = "milliseconds", opts = {}) { return this.diff(DateTime.now(), unit, opts); } /** * Return an Interval spanning between this DateTime and another DateTime * @param {DateTime} otherDateTime - the other end point of the Interval * @return {Interval|DateTime} */ until(otherDateTime) { return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this; } /** * Return whether this DateTime is in the same unit of time as another DateTime. * Higher-order units must also be identical for this function to return `true`. * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed. * @param {DateTime} otherDateTime - the other DateTime * @param {string} unit - the unit of time to check sameness on * @param {Object} opts - options * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day * @return {boolean} */ hasSame(otherDateTime, unit, opts) { if (!this.isValid) return false; const inputMs = otherDateTime.valueOf(); const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true }); return ( adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts) ); } /** * Equality check * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid. * To compare just the millisecond values, use `+dt1 === +dt2`. * @param {DateTime} other - the other DateTime * @return {boolean} */ equals(other) { return ( this.isValid && other.isValid && this.valueOf() === other.valueOf() && this.zone.equals(other.zone) && this.loc.equals(other.loc) ); } /** * Returns a string representation of a this time relative to now, such as "in two days". Can only internationalize if your * platform supports Intl.RelativeTimeFormat. Rounds down by default. * @param {Object} options - options that affect the output * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. * @param {string} [options.style="long"] - the style of units, must be "long", "short", or "narrow" * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of "years", "quarters", "months", "weeks", "days", "hours", "minutes", or "seconds" * @param {boolean} [options.round=true] - whether to round the numbers in the output. * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding. * @param {string} options.locale - override the locale of this DateTime * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this * @example DateTime.now().plus({ days: 1 }).toRelative() //=> "in 1 day" * @example DateTime.now().setLocale("es").toRelative({ days: 1 }) //=> "dentro de 1 día" * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: "fr" }) //=> "dans 23 heures" * @example DateTime.now().minus({ days: 2 }).toRelative() //=> "2 days ago" * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: "hours" }) //=> "48 hours ago" * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> "1.5 days ago" */ toRelative(options = {}) { if (!this.isValid) return null; const base = options.base || DateTime.fromObject({}, { zone: this.zone }), padding = options.padding ? (this < base ? -options.padding : options.padding) : 0; let units = ["years", "months", "days", "hours", "minutes", "seconds"]; let unit = options.unit; if (Array.isArray(options.unit)) { units = options.unit; unit = undefined; } return diffRelative(base, this.plus(padding), { ...options, numeric: "always", units, unit, }); } /** * Returns a string representation of this date relative to today, such as "yesterday" or "next month". * Only internationalizes on platforms that supports Intl.RelativeTimeFormat. * @param {Object} options - options that affect the output * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now. * @param {string} options.locale - override the locale of this DateTime * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of "years", "quarters", "months", "weeks", or "days" * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> "tomorrow" * @example DateTime.now().setLocale("es").plus({ days: 1 }).toRelative() //=> ""mañana" * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: "fr" }) //=> "demain" * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> "2 days ago" */ toRelativeCalendar(options = {}) { if (!this.isValid) return null; return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, { ...options, numeric: "auto", units: ["years", "months", "days"], calendary: true, }); } /** * Return the min of several date times * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum * @return {DateTime} the min DateTime, or undefined if called with no argument */ static min(...dateTimes) { if (!dateTimes.every(DateTime.isDateTime)) { throw new InvalidArgumentError("min requires all arguments be DateTimes"); } return bestBy(dateTimes, (i) => i.valueOf(), Math.min); } /** * Return the max of several date times * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum * @return {DateTime} the max DateTime, or undefined if called with no argument */ static max(...dateTimes) { if (!dateTimes.every(DateTime.isDateTime)) { throw new InvalidArgumentError("max requires all arguments be DateTimes"); } return bestBy(dateTimes, (i) => i.valueOf(), Math.max); } // MISC /** * Explain how a string would be parsed by fromFormat() * @param {string} text - the string to parse * @param {string} fmt - the format the string is expected to be in (see description) * @param {Object} options - options taken by fromFormat() * @return {Object} */ static fromFormatExplain(text, fmt, options = {}) { const { locale = null, numberingSystem = null } = options, localeToUse = Locale.fromOpts({ locale, numberingSystem, defaultToEN: true, }); return explainFromTokens(localeToUse, text, fmt); } /** * @deprecated use fromFormatExplain instead */ static fromStringExplain(text, fmt, options = {}) { return DateTime.fromFormatExplain(text, fmt, options); } /** * Build a parser for `fmt` using the given locale. This parser can be passed * to {@link DateTime.fromFormatParser} to a parse a date in this format. This * can be used to optimize cases where many dates need to be parsed in a * specific format. * * @param {String} fmt - the format the string is expected to be in (see * description) * @param {Object} options - options used to set locale and numberingSystem * for parser * @returns {TokenParser} - opaque object to be used */ static buildFormatParser(fmt, options = {}) { const { locale = null, numberingSystem = null } = options, localeToUse = Locale.fromOpts({ locale, numberingSystem, defaultToEN: true, }); return new TokenParser(localeToUse, fmt); } /** * Create a DateTime from an input string and format parser. * * The format parser must have been created with the same locale as this call. * * @param {String} text - the string to parse * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser} * @param {Object} opts - options taken by fromFormat() * @returns {DateTime} */ static fromFormatParser(text, formatParser, opts = {}) { if (isUndefined(text) || isUndefined(formatParser)) { throw new InvalidArgumentError( "fromFormatParser requires an input string and a format parser" ); } const { locale = null, numberingSystem = null } = opts, localeToUse = Locale.fromOpts({ locale, numberingSystem, defaultToEN: true, }); if (!localeToUse.equals(formatParser.locale)) { throw new InvalidArgumentError( `fromFormatParser called with a locale of ${localeToUse}, ` + `but the format parser was created for ${formatParser.locale}` ); } const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text); if (invalidReason) { return DateTime.invalid(invalidReason); } else { return parseDataToDateTime( result, zone, opts, `format ${formatParser.format}`, text, specificOffset ); } } // FORMAT PRESETS /** * {@link DateTime#toLocaleString} format like 10/14/1983 * @type {Object} */ static get DATE_SHORT() { return Formats.DATE_SHORT; } /** * {@link DateTime#toLocaleString} format like 'Oct 14, 1983' * @type {Object} */ static get DATE_MED() { return Formats.DATE_MED; } /** * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983' * @type {Object} */ static get DATE_MED_WITH_WEEKDAY() { return Formats.DATE_MED_WITH_WEEKDAY; } /** * {@link DateTime#toLocaleString} format like 'October 14, 1983' * @type {Object} */ static get DATE_FULL() { return Formats.DATE_FULL; } /** * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983' * @type {Object} */ static get DATE_HUGE() { return Formats.DATE_HUGE; } /** * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is. * @type {Object} */ static get TIME_SIMPLE() { return Formats.TIME_SIMPLE; } /** * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is. * @type {Object} */ static get TIME_WITH_SECONDS() { return Formats.TIME_WITH_SECONDS; } /** * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is. * @type {Object} */ static get TIME_WITH_SHORT_OFFSET() { return Formats.TIME_WITH_SHORT_OFFSET; } /** * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is. * @type {Object} */ static get TIME_WITH_LONG_OFFSET() { return Formats.TIME_WITH_LONG_OFFSET; } /** * {@link DateTime#toLocaleString} format like '09:30', always 24-hour. * @type {Object} */ static get TIME_24_SIMPLE() { return Formats.TIME_24_SIMPLE; } /** * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour. * @type {Object} */ static get TIME_24_WITH_SECONDS() { return Formats.TIME_24_WITH_SECONDS; } /** * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour. * @type {Object} */ static get TIME_24_WITH_SHORT_OFFSET() { return Formats.TIME_24_WITH_SHORT_OFFSET; } /** * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour. * @type {Object} */ static get TIME_24_WITH_LONG_OFFSET() { return Formats.TIME_24_WITH_LONG_OFFSET; } /** * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_SHORT() { return Formats.DATETIME_SHORT; } /** * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_SHORT_WITH_SECONDS() { return Formats.DATETIME_SHORT_WITH_SECONDS; } /** * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_MED() { return Formats.DATETIME_MED; } /** * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_MED_WITH_SECONDS() { return Formats.DATETIME_MED_WITH_SECONDS; } /** * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_MED_WITH_WEEKDAY() { return Formats.DATETIME_MED_WITH_WEEKDAY; } /** * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_FULL() { return Formats.DATETIME_FULL; } /** * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_FULL_WITH_SECONDS() { return Formats.DATETIME_FULL_WITH_SECONDS; } /** * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_HUGE() { return Formats.DATETIME_HUGE; } /** * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is. * @type {Object} */ static get DATETIME_HUGE_WITH_SECONDS() { return Formats.DATETIME_HUGE_WITH_SECONDS; } } /** * @private */ export function friendlyDateTime(dateTimeish) { if (DateTime.isDateTime(dateTimeish)) { return dateTimeish; } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) { return DateTime.fromJSDate(dateTimeish); } else if (dateTimeish && typeof dateTimeish === "object") { return DateTime.fromObject(dateTimeish); } else { throw new InvalidArgumentError( `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}` ); } } moment-luxon-93c85a3/src/duration.js000066400000000000000000001014151477254173100175040ustar00rootroot00000000000000import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from "./errors.js"; import Formatter from "./impl/formatter.js"; import Invalid from "./impl/invalid.js"; import Locale from "./impl/locale.js"; import { parseISODuration, parseISOTimeOnly } from "./impl/regexParser.js"; import { asNumber, hasOwnProperty, isNumber, isUndefined, normalizeObject, roundTo, } from "./impl/util.js"; import Settings from "./settings.js"; import DateTime from "./datetime.js"; const INVALID = "Invalid Duration"; // unit conversion constants export const lowOrderMatrix = { weeks: { days: 7, hours: 7 * 24, minutes: 7 * 24 * 60, seconds: 7 * 24 * 60 * 60, milliseconds: 7 * 24 * 60 * 60 * 1000, }, days: { hours: 24, minutes: 24 * 60, seconds: 24 * 60 * 60, milliseconds: 24 * 60 * 60 * 1000, }, hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 }, minutes: { seconds: 60, milliseconds: 60 * 1000 }, seconds: { milliseconds: 1000 }, }, casualMatrix = { years: { quarters: 4, months: 12, weeks: 52, days: 365, hours: 365 * 24, minutes: 365 * 24 * 60, seconds: 365 * 24 * 60 * 60, milliseconds: 365 * 24 * 60 * 60 * 1000, }, quarters: { months: 3, weeks: 13, days: 91, hours: 91 * 24, minutes: 91 * 24 * 60, seconds: 91 * 24 * 60 * 60, milliseconds: 91 * 24 * 60 * 60 * 1000, }, months: { weeks: 4, days: 30, hours: 30 * 24, minutes: 30 * 24 * 60, seconds: 30 * 24 * 60 * 60, milliseconds: 30 * 24 * 60 * 60 * 1000, }, ...lowOrderMatrix, }, daysInYearAccurate = 146097.0 / 400, daysInMonthAccurate = 146097.0 / 4800, accurateMatrix = { years: { quarters: 4, months: 12, weeks: daysInYearAccurate / 7, days: daysInYearAccurate, hours: daysInYearAccurate * 24, minutes: daysInYearAccurate * 24 * 60, seconds: daysInYearAccurate * 24 * 60 * 60, milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000, }, quarters: { months: 3, weeks: daysInYearAccurate / 28, days: daysInYearAccurate / 4, hours: (daysInYearAccurate * 24) / 4, minutes: (daysInYearAccurate * 24 * 60) / 4, seconds: (daysInYearAccurate * 24 * 60 * 60) / 4, milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4, }, months: { weeks: daysInMonthAccurate / 7, days: daysInMonthAccurate, hours: daysInMonthAccurate * 24, minutes: daysInMonthAccurate * 24 * 60, seconds: daysInMonthAccurate * 24 * 60 * 60, milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000, }, ...lowOrderMatrix, }; // units ordered by size const orderedUnits = [ "years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", ]; const reverseUnits = orderedUnits.slice(0).reverse(); // clone really means "create another instance just like this one, but with these changes" function clone(dur, alts, clear = false) { // deep merge for vals const conf = { values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) }, loc: dur.loc.clone(alts.loc), conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy, matrix: alts.matrix || dur.matrix, }; return new Duration(conf); } function durationToMillis(matrix, vals) { let sum = vals.milliseconds ?? 0; for (const unit of reverseUnits.slice(1)) { if (vals[unit]) { sum += vals[unit] * matrix[unit]["milliseconds"]; } } return sum; } // NB: mutates parameters function normalizeValues(matrix, vals) { // the logic below assumes the overall value of the duration is positive // if this is not the case, factor is used to make it so const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1; orderedUnits.reduceRight((previous, current) => { if (!isUndefined(vals[current])) { if (previous) { const previousVal = vals[previous] * factor; const conv = matrix[current][previous]; // if (previousVal < 0): // lower order unit is negative (e.g. { years: 2, days: -2 }) // normalize this by reducing the higher order unit by the appropriate amount // and increasing the lower order unit // this can never make the higher order unit negative, because this function only operates // on positive durations, so the amount of time represented by the lower order unit cannot // be larger than the higher order unit // else: // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 }) // in this case we attempt to convert as much as possible from the lower order unit into // the higher order one // // Math.floor takes care of both of these cases, rounding away from 0 // if previousVal < 0 it makes the absolute value larger // if previousVal >= it makes the absolute value smaller const rollUp = Math.floor(previousVal / conv); vals[current] += rollUp * factor; vals[previous] -= rollUp * conv * factor; } return current; } else { return previous; } }, null); // try to convert any decimals into smaller units if possible // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 } orderedUnits.reduce((previous, current) => { if (!isUndefined(vals[current])) { if (previous) { const fraction = vals[previous] % 1; vals[previous] -= fraction; vals[current] += fraction * matrix[previous][current]; } return current; } else { return previous; } }, null); } // Remove all properties with a value of 0 from an object function removeZeroes(vals) { const newVals = {}; for (const [key, value] of Object.entries(vals)) { if (value !== 0) { newVals[key] = value; } } return newVals; } /** * A Duration object represents a period of time, like "2 months" or "1 day, 1 hour". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime. * * Here is a brief overview of commonly used methods and getters in Duration: * * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}. * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors. * * **Configuration** See {@link Duration#locale} and {@link Duration#numberingSystem} accessors. * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}. * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON} * * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation. */ export default class Duration { /** * @private */ constructor(config) { const accurate = config.conversionAccuracy === "longterm" || false; let matrix = accurate ? accurateMatrix : casualMatrix; if (config.matrix) { matrix = config.matrix; } /** * @access private */ this.values = config.values; /** * @access private */ this.loc = config.loc || Locale.create(); /** * @access private */ this.conversionAccuracy = accurate ? "longterm" : "casual"; /** * @access private */ this.invalid = config.invalid || null; /** * @access private */ this.matrix = matrix; /** * @access private */ this.isLuxonDuration = true; } /** * Create Duration from a number of milliseconds. * @param {number} count of milliseconds * @param {Object} opts - options for parsing * @param {string} [opts.locale='en-US'] - the locale to use * @param {string} opts.numberingSystem - the numbering system to use * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use * @return {Duration} */ static fromMillis(count, opts) { return Duration.fromObject({ milliseconds: count }, opts); } /** * Create a Duration from a JavaScript object with keys like 'years' and 'hours'. * If this object is empty then a zero milliseconds duration is returned. * @param {Object} obj - the object to create the DateTime from * @param {number} obj.years * @param {number} obj.quarters * @param {number} obj.months * @param {number} obj.weeks * @param {number} obj.days * @param {number} obj.hours * @param {number} obj.minutes * @param {number} obj.seconds * @param {number} obj.milliseconds * @param {Object} [opts=[]] - options for creating this Duration * @param {string} [opts.locale='en-US'] - the locale to use * @param {string} opts.numberingSystem - the numbering system to use * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use * @param {string} [opts.matrix=Object] - the custom conversion system to use * @return {Duration} */ static fromObject(obj, opts = {}) { if (obj == null || typeof obj !== "object") { throw new InvalidArgumentError( `Duration.fromObject: argument expected to be an object, got ${ obj === null ? "null" : typeof obj }` ); } return new Duration({ values: normalizeObject(obj, Duration.normalizeUnit), loc: Locale.fromObject(opts), conversionAccuracy: opts.conversionAccuracy, matrix: opts.matrix, }); } /** * Create a Duration from DurationLike. * * @param {Object | number | Duration} durationLike * One of: * - object with keys like 'years' and 'hours'. * - number representing milliseconds * - Duration instance * @return {Duration} */ static fromDurationLike(durationLike) { if (isNumber(durationLike)) { return Duration.fromMillis(durationLike); } else if (Duration.isDuration(durationLike)) { return durationLike; } else if (typeof durationLike === "object") { return Duration.fromObject(durationLike); } else { throw new InvalidArgumentError( `Unknown duration argument ${durationLike} of type ${typeof durationLike}` ); } } /** * Create a Duration from an ISO 8601 duration string. * @param {string} text - text to parse * @param {Object} opts - options for parsing * @param {string} [opts.locale='en-US'] - the locale to use * @param {string} opts.numberingSystem - the numbering system to use * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use * @param {string} [opts.matrix=Object] - the preset conversion system to use * @see https://en.wikipedia.org/wiki/ISO_8601#Durations * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 } * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 } * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 } * @return {Duration} */ static fromISO(text, opts) { const [parsed] = parseISODuration(text); if (parsed) { return Duration.fromObject(parsed, opts); } else { return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); } } /** * Create a Duration from an ISO 8601 time string. * @param {string} text - text to parse * @param {Object} opts - options for parsing * @param {string} [opts.locale='en-US'] - the locale to use * @param {string} opts.numberingSystem - the numbering system to use * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use * @param {string} [opts.matrix=Object] - the conversion system to use * @see https://en.wikipedia.org/wiki/ISO_8601#Times * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 } * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 } * @return {Duration} */ static fromISOTime(text, opts) { const [parsed] = parseISOTimeOnly(text); if (parsed) { return Duration.fromObject(parsed, opts); } else { return Duration.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); } } /** * Create an invalid Duration. * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information * @return {Duration} */ static invalid(reason, explanation = null) { if (!reason) { throw new InvalidArgumentError("need to specify a reason the Duration is invalid"); } const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); if (Settings.throwOnInvalid) { throw new InvalidDurationError(invalid); } else { return new Duration({ invalid }); } } /** * @private */ static normalizeUnit(unit) { const normalized = { year: "years", years: "years", quarter: "quarters", quarters: "quarters", month: "months", months: "months", week: "weeks", weeks: "weeks", day: "days", days: "days", hour: "hours", hours: "hours", minute: "minutes", minutes: "minutes", second: "seconds", seconds: "seconds", millisecond: "milliseconds", milliseconds: "milliseconds", }[unit ? unit.toLowerCase() : unit]; if (!normalized) throw new InvalidUnitError(unit); return normalized; } /** * Check if an object is a Duration. Works across context boundaries * @param {object} o * @return {boolean} */ static isDuration(o) { return (o && o.isLuxonDuration) || false; } /** * Get the locale of a Duration, such 'en-GB' * @type {string} */ get locale() { return this.isValid ? this.loc.locale : null; } /** * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration * * @type {string} */ get numberingSystem() { return this.isValid ? this.loc.numberingSystem : null; } /** * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens: * * `S` for milliseconds * * `s` for seconds * * `m` for minutes * * `h` for hours * * `d` for days * * `w` for weeks * * `M` for months * * `y` for years * Notes: * * Add padding by repeating the token, e.g. "yy" pads the years to two digits, "hhhh" pads the hours out to four digits * * Tokens can be escaped by wrapping with single quotes. * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting. * @param {string} fmt - the format string * @param {Object} opts - options * @param {boolean} [opts.floor=true] - floor numerical values * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("y d s") //=> "1 6 2" * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("yy dd sss") //=> "01 06 002" * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat("M S") //=> "12 518402000" * @return {string} */ toFormat(fmt, opts = {}) { // reverse-compat since 1.2; we always round down now, never up, and we do it by default const fmtOpts = { ...opts, floor: opts.round !== false && opts.floor !== false, }; return this.isValid ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt) : INVALID; } /** * Returns a string representation of a Duration with all units included. * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`. * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor. * @example * ```js * var dur = Duration.fromObject({ days: 1, hours: 5, minutes: 6 }) * dur.toHuman() //=> '1 day, 5 hours, 6 minutes' * dur.toHuman({ listStyle: "long" }) //=> '1 day, 5 hours, and 6 minutes' * dur.toHuman({ unitDisplay: "short" }) //=> '1 day, 5 hr, 6 min' * ``` */ toHuman(opts = {}) { if (!this.isValid) return INVALID; const l = orderedUnits .map((unit) => { const val = this.values[unit]; if (isUndefined(val)) { return null; } return this.loc .numberFormatter({ style: "unit", unitDisplay: "long", ...opts, unit: unit.slice(0, -1) }) .format(val); }) .filter((n) => n); return this.loc .listFormatter({ type: "conjunction", style: opts.listStyle || "narrow", ...opts }) .format(l); } /** * Returns a JavaScript object with this Duration's values. * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 } * @return {Object} */ toObject() { if (!this.isValid) return {}; return { ...this.values }; } /** * Returns an ISO 8601-compliant string representation of this Duration. * @see https://en.wikipedia.org/wiki/ISO_8601#Durations * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S' * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S' * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M' * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M' * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S' * @return {string} */ toISO() { // we could use the formatter, but this is an easier way to get the minimum string if (!this.isValid) return null; let s = "P"; if (this.years !== 0) s += this.years + "Y"; if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + "M"; if (this.weeks !== 0) s += this.weeks + "W"; if (this.days !== 0) s += this.days + "D"; if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0) s += "T"; if (this.hours !== 0) s += this.hours + "H"; if (this.minutes !== 0) s += this.minutes + "M"; if (this.seconds !== 0 || this.milliseconds !== 0) // this will handle "floating point madness" by removing extra decimal places // https://stackoverflow.com/questions/588004/is-floating-point-math-broken s += roundTo(this.seconds + this.milliseconds / 1000, 3) + "S"; if (s === "P") s += "T0S"; return s; } /** * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day. * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours. * @see https://en.wikipedia.org/wiki/ISO_8601#Times * @param {Object} opts - options * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0 * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0 * @param {boolean} [opts.includePrefix=false] - include the `T` prefix * @param {string} [opts.format='extended'] - choose between the basic and extended format * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000' * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00' * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00' * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000' * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000' * @return {string} */ toISOTime(opts = {}) { if (!this.isValid) return null; const millis = this.toMillis(); if (millis < 0 || millis >= 86400000) return null; opts = { suppressMilliseconds: false, suppressSeconds: false, includePrefix: false, format: "extended", ...opts, includeOffset: false, }; const dateTime = DateTime.fromMillis(millis, { zone: "UTC" }); return dateTime.toISOTime(opts); } /** * Returns an ISO 8601 representation of this Duration appropriate for use in JSON. * @return {string} */ toJSON() { return this.toISO(); } /** * Returns an ISO 8601 representation of this Duration appropriate for use in debugging. * @return {string} */ toString() { return this.toISO(); } /** * Returns a string representation of this Duration appropriate for the REPL. * @return {string} */ [Symbol.for("nodejs.util.inspect.custom")]() { if (this.isValid) { return `Duration { values: ${JSON.stringify(this.values)} }`; } else { return `Duration { Invalid, reason: ${this.invalidReason} }`; } } /** * Returns an milliseconds value of this Duration. * @return {number} */ toMillis() { if (!this.isValid) return NaN; return durationToMillis(this.matrix, this.values); } /** * Returns an milliseconds value of this Duration. Alias of {@link toMillis} * @return {number} */ valueOf() { return this.toMillis(); } /** * Make this Duration longer by the specified amount. Return a newly-constructed Duration. * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() * @return {Duration} */ plus(duration) { if (!this.isValid) return this; const dur = Duration.fromDurationLike(duration), result = {}; for (const k of orderedUnits) { if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) { result[k] = dur.get(k) + this.get(k); } } return clone(this, { values: result }, true); } /** * Make this Duration shorter by the specified amount. Return a newly-constructed Duration. * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject() * @return {Duration} */ minus(duration) { if (!this.isValid) return this; const dur = Duration.fromDurationLike(duration); return this.plus(dur.negate()); } /** * Scale this Duration by the specified amount. Return a newly-constructed Duration. * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number. * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 } * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === "hours" ? x * 2 : x) //=> { hours: 2, minutes: 30 } * @return {Duration} */ mapUnits(fn) { if (!this.isValid) return this; const result = {}; for (const k of Object.keys(this.values)) { result[k] = asNumber(fn(this.values[k], k)); } return clone(this, { values: result }, true); } /** * Get the value of unit. * @param {string} unit - a unit such as 'minute' or 'day' * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2 * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0 * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3 * @return {number} */ get(unit) { return this[Duration.normalizeUnit(unit)]; } /** * "Set" the values of specified units. Return a newly-constructed Duration. * @param {Object} values - a mapping of units to numbers * @example dur.set({ years: 2017 }) * @example dur.set({ hours: 8, minutes: 30 }) * @return {Duration} */ set(values) { if (!this.isValid) return this; const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) }; return clone(this, { values: mixed }); } /** * "Set" the locale and/or numberingSystem. Returns a newly-constructed Duration. * @example dur.reconfigure({ locale: 'en-GB' }) * @return {Duration} */ reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) { const loc = this.loc.clone({ locale, numberingSystem }); const opts = { loc, matrix, conversionAccuracy }; return clone(this, opts); } /** * Return the length of the duration in the specified unit. * @param {string} unit - a unit such as 'minutes' or 'days' * @example Duration.fromObject({years: 1}).as('days') //=> 365 * @example Duration.fromObject({years: 1}).as('months') //=> 12 * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5 * @return {number} */ as(unit) { return this.isValid ? this.shiftTo(unit).get(unit) : NaN; } /** * Reduce this Duration to its canonical representation in its current units. * Assuming the overall value of the Duration is positive, this means: * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example) * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise * the overall value would be negative, see third example) * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example) * * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`. * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 } * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 } * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 } * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 } * @return {Duration} */ normalize() { if (!this.isValid) return this; const vals = this.toObject(); normalizeValues(this.matrix, vals); return clone(this, { values: vals }, true); } /** * Rescale units to its largest representation * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 } * @return {Duration} */ rescale() { if (!this.isValid) return this; const vals = removeZeroes(this.normalize().shiftToAll().toObject()); return clone(this, { values: vals }, true); } /** * Convert this Duration into its representation in a different set of units. * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 } * @return {Duration} */ shiftTo(...units) { if (!this.isValid) return this; if (units.length === 0) { return this; } units = units.map((u) => Duration.normalizeUnit(u)); const built = {}, accumulated = {}, vals = this.toObject(); let lastUnit; for (const k of orderedUnits) { if (units.indexOf(k) >= 0) { lastUnit = k; let own = 0; // anything we haven't boiled down yet should get boiled to this unit for (const ak in accumulated) { own += this.matrix[ak][k] * accumulated[ak]; accumulated[ak] = 0; } // plus anything that's already in this unit if (isNumber(vals[k])) { own += vals[k]; } // only keep the integer part for now in the hopes of putting any decimal part // into a smaller unit later const i = Math.trunc(own); built[k] = i; accumulated[k] = (own * 1000 - i * 1000) / 1000; // otherwise, keep it in the wings to boil it later } else if (isNumber(vals[k])) { accumulated[k] = vals[k]; } } // anything leftover becomes the decimal for the last unit // lastUnit must be defined since units is not empty for (const key in accumulated) { if (accumulated[key] !== 0) { built[lastUnit] += key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key]; } } normalizeValues(this.matrix, built); return clone(this, { values: built }, true); } /** * Shift this Duration to all available units. * Same as shiftTo("years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds") * @return {Duration} */ shiftToAll() { if (!this.isValid) return this; return this.shiftTo( "years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds" ); } /** * Return the negative of this Duration. * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 } * @return {Duration} */ negate() { if (!this.isValid) return this; const negated = {}; for (const k of Object.keys(this.values)) { negated[k] = this.values[k] === 0 ? 0 : -this.values[k]; } return clone(this, { values: negated }, true); } /** * Get the years. * @type {number} */ get years() { return this.isValid ? this.values.years || 0 : NaN; } /** * Get the quarters. * @type {number} */ get quarters() { return this.isValid ? this.values.quarters || 0 : NaN; } /** * Get the months. * @type {number} */ get months() { return this.isValid ? this.values.months || 0 : NaN; } /** * Get the weeks * @type {number} */ get weeks() { return this.isValid ? this.values.weeks || 0 : NaN; } /** * Get the days. * @type {number} */ get days() { return this.isValid ? this.values.days || 0 : NaN; } /** * Get the hours. * @type {number} */ get hours() { return this.isValid ? this.values.hours || 0 : NaN; } /** * Get the minutes. * @type {number} */ get minutes() { return this.isValid ? this.values.minutes || 0 : NaN; } /** * Get the seconds. * @return {number} */ get seconds() { return this.isValid ? this.values.seconds || 0 : NaN; } /** * Get the milliseconds. * @return {number} */ get milliseconds() { return this.isValid ? this.values.milliseconds || 0 : NaN; } /** * Returns whether the Duration is invalid. Invalid durations are returned by diff operations * on invalid DateTimes or Intervals. * @return {boolean} */ get isValid() { return this.invalid === null; } /** * Returns an error code if this Duration became invalid, or null if the Duration is valid * @return {string} */ get invalidReason() { return this.invalid ? this.invalid.reason : null; } /** * Returns an explanation of why this Duration became invalid, or null if the Duration is valid * @type {string} */ get invalidExplanation() { return this.invalid ? this.invalid.explanation : null; } /** * Equality check * Two Durations are equal iff they have the same units and the same values for each unit. * @param {Duration} other * @return {boolean} */ equals(other) { if (!this.isValid || !other.isValid) { return false; } if (!this.loc.equals(other.loc)) { return false; } function eq(v1, v2) { // Consider 0 and undefined as equal if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0; return v1 === v2; } for (const u of orderedUnits) { if (!eq(this.values[u], other.values[u])) { return false; } } return true; } } moment-luxon-93c85a3/src/errors.js000066400000000000000000000020271477254173100171720ustar00rootroot00000000000000// these aren't really private, but nor are they really useful to document /** * @private */ class LuxonError extends Error {} /** * @private */ export class InvalidDateTimeError extends LuxonError { constructor(reason) { super(`Invalid DateTime: ${reason.toMessage()}`); } } /** * @private */ export class InvalidIntervalError extends LuxonError { constructor(reason) { super(`Invalid Interval: ${reason.toMessage()}`); } } /** * @private */ export class InvalidDurationError extends LuxonError { constructor(reason) { super(`Invalid Duration: ${reason.toMessage()}`); } } /** * @private */ export class ConflictingSpecificationError extends LuxonError {} /** * @private */ export class InvalidUnitError extends LuxonError { constructor(unit) { super(`Invalid unit ${unit}`); } } /** * @private */ export class InvalidArgumentError extends LuxonError {} /** * @private */ export class ZoneIsAbstractError extends LuxonError { constructor() { super("Zone is an abstract class"); } } moment-luxon-93c85a3/src/impl/000077500000000000000000000000001477254173100162605ustar00rootroot00000000000000moment-luxon-93c85a3/src/impl/conversions.js000066400000000000000000000145041477254173100211720ustar00rootroot00000000000000import { integerBetween, isLeapYear, timeObject, daysInYear, daysInMonth, weeksInWeekYear, isInteger, isUndefined, } from "./util.js"; import Invalid from "./invalid.js"; import { ConflictingSpecificationError } from "../errors.js"; const nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334], leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335]; function unitOutOfRange(unit, value) { return new Invalid( "unit out of range", `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid` ); } export function dayOfWeek(year, month, day) { const d = new Date(Date.UTC(year, month - 1, day)); if (year < 100 && year >= 0) { d.setUTCFullYear(d.getUTCFullYear() - 1900); } const js = d.getUTCDay(); return js === 0 ? 7 : js; } function computeOrdinal(year, month, day) { return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1]; } function uncomputeOrdinal(year, ordinal) { const table = isLeapYear(year) ? leapLadder : nonLeapLadder, month0 = table.findIndex((i) => i < ordinal), day = ordinal - table[month0]; return { month: month0 + 1, day }; } export function isoWeekdayToLocal(isoWeekday, startOfWeek) { return ((isoWeekday - startOfWeek + 7) % 7) + 1; } /** * @private */ export function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) { const { year, month, day } = gregObj, ordinal = computeOrdinal(year, month, day), weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek); let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7), weekYear; if (weekNumber < 1) { weekYear = year - 1; weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek); } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) { weekYear = year + 1; weekNumber = 1; } else { weekYear = year; } return { weekYear, weekNumber, weekday, ...timeObject(gregObj) }; } export function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) { const { weekYear, weekNumber, weekday } = weekData, weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek), yearInDays = daysInYear(weekYear); let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek, year; if (ordinal < 1) { year = weekYear - 1; ordinal += daysInYear(year); } else if (ordinal > yearInDays) { year = weekYear + 1; ordinal -= daysInYear(weekYear); } else { year = weekYear; } const { month, day } = uncomputeOrdinal(year, ordinal); return { year, month, day, ...timeObject(weekData) }; } export function gregorianToOrdinal(gregData) { const { year, month, day } = gregData; const ordinal = computeOrdinal(year, month, day); return { year, ordinal, ...timeObject(gregData) }; } export function ordinalToGregorian(ordinalData) { const { year, ordinal } = ordinalData; const { month, day } = uncomputeOrdinal(year, ordinal); return { year, month, day, ...timeObject(ordinalData) }; } /** * Check if local week units like localWeekday are used in obj. * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties. * Modifies obj in-place! * @param obj the object values */ export function usesLocalWeekValues(obj, loc) { const hasLocaleWeekData = !isUndefined(obj.localWeekday) || !isUndefined(obj.localWeekNumber) || !isUndefined(obj.localWeekYear); if (hasLocaleWeekData) { const hasIsoWeekData = !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear); if (hasIsoWeekData) { throw new ConflictingSpecificationError( "Cannot mix locale-based week fields with ISO-based week fields" ); } if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday; if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber; if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear; delete obj.localWeekday; delete obj.localWeekNumber; delete obj.localWeekYear; return { minDaysInFirstWeek: loc.getMinDaysInFirstWeek(), startOfWeek: loc.getStartOfWeek(), }; } else { return { minDaysInFirstWeek: 4, startOfWeek: 1 }; } } export function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) { const validYear = isInteger(obj.weekYear), validWeek = integerBetween( obj.weekNumber, 1, weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek) ), validWeekday = integerBetween(obj.weekday, 1, 7); if (!validYear) { return unitOutOfRange("weekYear", obj.weekYear); } else if (!validWeek) { return unitOutOfRange("week", obj.weekNumber); } else if (!validWeekday) { return unitOutOfRange("weekday", obj.weekday); } else return false; } export function hasInvalidOrdinalData(obj) { const validYear = isInteger(obj.year), validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year)); if (!validYear) { return unitOutOfRange("year", obj.year); } else if (!validOrdinal) { return unitOutOfRange("ordinal", obj.ordinal); } else return false; } export function hasInvalidGregorianData(obj) { const validYear = isInteger(obj.year), validMonth = integerBetween(obj.month, 1, 12), validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month)); if (!validYear) { return unitOutOfRange("year", obj.year); } else if (!validMonth) { return unitOutOfRange("month", obj.month); } else if (!validDay) { return unitOutOfRange("day", obj.day); } else return false; } export function hasInvalidTimeData(obj) { const { hour, minute, second, millisecond } = obj; const validHour = integerBetween(hour, 0, 23) || (hour === 24 && minute === 0 && second === 0 && millisecond === 0), validMinute = integerBetween(minute, 0, 59), validSecond = integerBetween(second, 0, 59), validMillisecond = integerBetween(millisecond, 0, 999); if (!validHour) { return unitOutOfRange("hour", hour); } else if (!validMinute) { return unitOutOfRange("minute", minute); } else if (!validSecond) { return unitOutOfRange("second", second); } else if (!validMillisecond) { return unitOutOfRange("millisecond", millisecond); } else return false; } moment-luxon-93c85a3/src/impl/diff.js000066400000000000000000000057071477254173100175370ustar00rootroot00000000000000import Duration from "../duration.js"; function dayDiff(earlier, later) { const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf("day").valueOf(), ms = utcDayStart(later) - utcDayStart(earlier); return Math.floor(Duration.fromMillis(ms).as("days")); } function highOrderDiffs(cursor, later, units) { const differs = [ ["years", (a, b) => b.year - a.year], ["quarters", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4], ["months", (a, b) => b.month - a.month + (b.year - a.year) * 12], [ "weeks", (a, b) => { const days = dayDiff(a, b); return (days - (days % 7)) / 7; }, ], ["days", dayDiff], ]; const results = {}; const earlier = cursor; let lowestOrder, highWater; /* This loop tries to diff using larger units first. If we overshoot, we backtrack and try the next smaller unit. "cursor" starts out at the earlier timestamp and moves closer and closer to "later" as we use smaller and smaller units. highWater keeps track of where we would be if we added one more of the smallest unit, this is used later to potentially convert any difference smaller than the smallest higher order unit into a fraction of that smallest higher order unit */ for (const [unit, differ] of differs) { if (units.indexOf(unit) >= 0) { lowestOrder = unit; results[unit] = differ(cursor, later); highWater = earlier.plus(results); if (highWater > later) { // we overshot the end point, backtrack cursor by 1 results[unit]--; cursor = earlier.plus(results); // if we are still overshooting now, we need to backtrack again // this happens in certain situations when diffing times in different zones, // because this calculation ignores time zones if (cursor > later) { // keep the "overshot by 1" around as highWater highWater = cursor; // backtrack cursor by 1 results[unit]--; cursor = earlier.plus(results); } } else { cursor = highWater; } } } return [cursor, results, highWater, lowestOrder]; } export default function (earlier, later, units, opts) { let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units); const remainingMillis = later - cursor; const lowerOrderUnits = units.filter( (u) => ["hours", "minutes", "seconds", "milliseconds"].indexOf(u) >= 0 ); if (lowerOrderUnits.length === 0) { if (highWater < later) { highWater = cursor.plus({ [lowestOrder]: 1 }); } if (highWater !== cursor) { results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor); } } const duration = Duration.fromObject(results, opts); if (lowerOrderUnits.length > 0) { return Duration.fromMillis(remainingMillis, opts) .shiftTo(...lowerOrderUnits) .plus(duration); } else { return duration; } } moment-luxon-93c85a3/src/impl/digits.js000066400000000000000000000045031477254173100201030ustar00rootroot00000000000000const numberingSystems = { arab: "[\u0660-\u0669]", arabext: "[\u06F0-\u06F9]", bali: "[\u1B50-\u1B59]", beng: "[\u09E6-\u09EF]", deva: "[\u0966-\u096F]", fullwide: "[\uFF10-\uFF19]", gujr: "[\u0AE6-\u0AEF]", hanidec: "[〇|一|二|三|四|五|六|七|八|九]", khmr: "[\u17E0-\u17E9]", knda: "[\u0CE6-\u0CEF]", laoo: "[\u0ED0-\u0ED9]", limb: "[\u1946-\u194F]", mlym: "[\u0D66-\u0D6F]", mong: "[\u1810-\u1819]", mymr: "[\u1040-\u1049]", orya: "[\u0B66-\u0B6F]", tamldec: "[\u0BE6-\u0BEF]", telu: "[\u0C66-\u0C6F]", thai: "[\u0E50-\u0E59]", tibt: "[\u0F20-\u0F29]", latn: "\\d", }; const numberingSystemsUTF16 = { arab: [1632, 1641], arabext: [1776, 1785], bali: [6992, 7001], beng: [2534, 2543], deva: [2406, 2415], fullwide: [65296, 65303], gujr: [2790, 2799], khmr: [6112, 6121], knda: [3302, 3311], laoo: [3792, 3801], limb: [6470, 6479], mlym: [3430, 3439], mong: [6160, 6169], mymr: [4160, 4169], orya: [2918, 2927], tamldec: [3046, 3055], telu: [3174, 3183], thai: [3664, 3673], tibt: [3872, 3881], }; const hanidecChars = numberingSystems.hanidec.replace(/[\[|\]]/g, "").split(""); export function parseDigits(str) { let value = parseInt(str, 10); if (isNaN(value)) { value = ""; for (let i = 0; i < str.length; i++) { const code = str.charCodeAt(i); if (str[i].search(numberingSystems.hanidec) !== -1) { value += hanidecChars.indexOf(str[i]); } else { for (const key in numberingSystemsUTF16) { const [min, max] = numberingSystemsUTF16[key]; if (code >= min && code <= max) { value += code - min; } } } } return parseInt(value, 10); } else { return value; } } // cache of {numberingSystem: {append: regex}} const digitRegexCache = new Map(); export function resetDigitRegexCache() { digitRegexCache.clear(); } export function digitRegex({ numberingSystem }, append = "") { const ns = numberingSystem || "latn"; let appendCache = digitRegexCache.get(ns); if (appendCache === undefined) { appendCache = new Map(); digitRegexCache.set(ns, appendCache); } let regex = appendCache.get(append); if (regex === undefined) { regex = new RegExp(`${numberingSystems[ns]}${append}`); appendCache.set(append, regex); } return regex; } moment-luxon-93c85a3/src/impl/english.js000066400000000000000000000132741477254173100202560ustar00rootroot00000000000000import * as Formats from "./formats.js"; import { pick } from "./util.js"; function stringify(obj) { return JSON.stringify(obj, Object.keys(obj).sort()); } /** * @private */ export const monthsLong = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]; export const monthsShort = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]; export const monthsNarrow = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"]; export function months(length) { switch (length) { case "narrow": return [...monthsNarrow]; case "short": return [...monthsShort]; case "long": return [...monthsLong]; case "numeric": return ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"]; case "2-digit": return ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"]; default: return null; } } export const weekdaysLong = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]; export const weekdaysShort = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; export const weekdaysNarrow = ["M", "T", "W", "T", "F", "S", "S"]; export function weekdays(length) { switch (length) { case "narrow": return [...weekdaysNarrow]; case "short": return [...weekdaysShort]; case "long": return [...weekdaysLong]; case "numeric": return ["1", "2", "3", "4", "5", "6", "7"]; default: return null; } } export const meridiems = ["AM", "PM"]; export const erasLong = ["Before Christ", "Anno Domini"]; export const erasShort = ["BC", "AD"]; export const erasNarrow = ["B", "A"]; export function eras(length) { switch (length) { case "narrow": return [...erasNarrow]; case "short": return [...erasShort]; case "long": return [...erasLong]; default: return null; } } export function meridiemForDateTime(dt) { return meridiems[dt.hour < 12 ? 0 : 1]; } export function weekdayForDateTime(dt, length) { return weekdays(length)[dt.weekday - 1]; } export function monthForDateTime(dt, length) { return months(length)[dt.month - 1]; } export function eraForDateTime(dt, length) { return eras(length)[dt.year < 0 ? 0 : 1]; } export function formatRelativeTime(unit, count, numeric = "always", narrow = false) { const units = { years: ["year", "yr."], quarters: ["quarter", "qtr."], months: ["month", "mo."], weeks: ["week", "wk."], days: ["day", "day", "days"], hours: ["hour", "hr."], minutes: ["minute", "min."], seconds: ["second", "sec."], }; const lastable = ["hours", "minutes", "seconds"].indexOf(unit) === -1; if (numeric === "auto" && lastable) { const isDay = unit === "days"; switch (count) { case 1: return isDay ? "tomorrow" : `next ${units[unit][0]}`; case -1: return isDay ? "yesterday" : `last ${units[unit][0]}`; case 0: return isDay ? "today" : `this ${units[unit][0]}`; default: // fall through } } const isInPast = Object.is(count, -0) || count < 0, fmtValue = Math.abs(count), singular = fmtValue === 1, lilUnits = units[unit], fmtUnit = narrow ? singular ? lilUnits[1] : lilUnits[2] || lilUnits[1] : singular ? units[unit][0] : unit; return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`; } export function formatString(knownFormat) { // these all have the offsets removed because we don't have access to them // without all the intl stuff this is backfilling const filtered = pick(knownFormat, [ "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName", "hourCycle", ]), key = stringify(filtered), dateTimeHuge = "EEEE, LLLL d, yyyy, h:mm a"; switch (key) { case stringify(Formats.DATE_SHORT): return "M/d/yyyy"; case stringify(Formats.DATE_MED): return "LLL d, yyyy"; case stringify(Formats.DATE_MED_WITH_WEEKDAY): return "EEE, LLL d, yyyy"; case stringify(Formats.DATE_FULL): return "LLLL d, yyyy"; case stringify(Formats.DATE_HUGE): return "EEEE, LLLL d, yyyy"; case stringify(Formats.TIME_SIMPLE): return "h:mm a"; case stringify(Formats.TIME_WITH_SECONDS): return "h:mm:ss a"; case stringify(Formats.TIME_WITH_SHORT_OFFSET): return "h:mm a"; case stringify(Formats.TIME_WITH_LONG_OFFSET): return "h:mm a"; case stringify(Formats.TIME_24_SIMPLE): return "HH:mm"; case stringify(Formats.TIME_24_WITH_SECONDS): return "HH:mm:ss"; case stringify(Formats.TIME_24_WITH_SHORT_OFFSET): return "HH:mm"; case stringify(Formats.TIME_24_WITH_LONG_OFFSET): return "HH:mm"; case stringify(Formats.DATETIME_SHORT): return "M/d/yyyy, h:mm a"; case stringify(Formats.DATETIME_MED): return "LLL d, yyyy, h:mm a"; case stringify(Formats.DATETIME_FULL): return "LLLL d, yyyy, h:mm a"; case stringify(Formats.DATETIME_HUGE): return dateTimeHuge; case stringify(Formats.DATETIME_SHORT_WITH_SECONDS): return "M/d/yyyy, h:mm:ss a"; case stringify(Formats.DATETIME_MED_WITH_SECONDS): return "LLL d, yyyy, h:mm:ss a"; case stringify(Formats.DATETIME_MED_WITH_WEEKDAY): return "EEE, d LLL yyyy, h:mm a"; case stringify(Formats.DATETIME_FULL_WITH_SECONDS): return "LLLL d, yyyy, h:mm:ss a"; case stringify(Formats.DATETIME_HUGE_WITH_SECONDS): return "EEEE, LLLL d, yyyy, h:mm:ss a"; default: return dateTimeHuge; } } moment-luxon-93c85a3/src/impl/formats.js000066400000000000000000000043111477254173100202700ustar00rootroot00000000000000/** * @private */ const n = "numeric", s = "short", l = "long"; export const DATE_SHORT = { year: n, month: n, day: n, }; export const DATE_MED = { year: n, month: s, day: n, }; export const DATE_MED_WITH_WEEKDAY = { year: n, month: s, day: n, weekday: s, }; export const DATE_FULL = { year: n, month: l, day: n, }; export const DATE_HUGE = { year: n, month: l, day: n, weekday: l, }; export const TIME_SIMPLE = { hour: n, minute: n, }; export const TIME_WITH_SECONDS = { hour: n, minute: n, second: n, }; export const TIME_WITH_SHORT_OFFSET = { hour: n, minute: n, second: n, timeZoneName: s, }; export const TIME_WITH_LONG_OFFSET = { hour: n, minute: n, second: n, timeZoneName: l, }; export const TIME_24_SIMPLE = { hour: n, minute: n, hourCycle: "h23", }; export const TIME_24_WITH_SECONDS = { hour: n, minute: n, second: n, hourCycle: "h23", }; export const TIME_24_WITH_SHORT_OFFSET = { hour: n, minute: n, second: n, hourCycle: "h23", timeZoneName: s, }; export const TIME_24_WITH_LONG_OFFSET = { hour: n, minute: n, second: n, hourCycle: "h23", timeZoneName: l, }; export const DATETIME_SHORT = { year: n, month: n, day: n, hour: n, minute: n, }; export const DATETIME_SHORT_WITH_SECONDS = { year: n, month: n, day: n, hour: n, minute: n, second: n, }; export const DATETIME_MED = { year: n, month: s, day: n, hour: n, minute: n, }; export const DATETIME_MED_WITH_SECONDS = { year: n, month: s, day: n, hour: n, minute: n, second: n, }; export const DATETIME_MED_WITH_WEEKDAY = { year: n, month: s, day: n, weekday: s, hour: n, minute: n, }; export const DATETIME_FULL = { year: n, month: l, day: n, hour: n, minute: n, timeZoneName: s, }; export const DATETIME_FULL_WITH_SECONDS = { year: n, month: l, day: n, hour: n, minute: n, second: n, timeZoneName: s, }; export const DATETIME_HUGE = { year: n, month: l, day: n, weekday: l, hour: n, minute: n, timeZoneName: l, }; export const DATETIME_HUGE_WITH_SECONDS = { year: n, month: l, day: n, weekday: l, hour: n, minute: n, second: n, timeZoneName: l, }; moment-luxon-93c85a3/src/impl/formatter.js000066400000000000000000000306121477254173100206230ustar00rootroot00000000000000import * as English from "./english.js"; import * as Formats from "./formats.js"; import { padStart } from "./util.js"; function stringifyTokens(splits, tokenToString) { let s = ""; for (const token of splits) { if (token.literal) { s += token.val; } else { s += tokenToString(token.val); } } return s; } const macroTokenToFormatOpts = { D: Formats.DATE_SHORT, DD: Formats.DATE_MED, DDD: Formats.DATE_FULL, DDDD: Formats.DATE_HUGE, t: Formats.TIME_SIMPLE, tt: Formats.TIME_WITH_SECONDS, ttt: Formats.TIME_WITH_SHORT_OFFSET, tttt: Formats.TIME_WITH_LONG_OFFSET, T: Formats.TIME_24_SIMPLE, TT: Formats.TIME_24_WITH_SECONDS, TTT: Formats.TIME_24_WITH_SHORT_OFFSET, TTTT: Formats.TIME_24_WITH_LONG_OFFSET, f: Formats.DATETIME_SHORT, ff: Formats.DATETIME_MED, fff: Formats.DATETIME_FULL, ffff: Formats.DATETIME_HUGE, F: Formats.DATETIME_SHORT_WITH_SECONDS, FF: Formats.DATETIME_MED_WITH_SECONDS, FFF: Formats.DATETIME_FULL_WITH_SECONDS, FFFF: Formats.DATETIME_HUGE_WITH_SECONDS, }; /** * @private */ export default class Formatter { static create(locale, opts = {}) { return new Formatter(locale, opts); } static parseFormat(fmt) { // white-space is always considered a literal in user-provided formats // the " " token has a special meaning (see unitForToken) let current = null, currentFull = "", bracketed = false; const splits = []; for (let i = 0; i < fmt.length; i++) { const c = fmt.charAt(i); if (c === "'") { if (currentFull.length > 0) { splits.push({ literal: bracketed || /^\s+$/.test(currentFull), val: currentFull }); } current = null; currentFull = ""; bracketed = !bracketed; } else if (bracketed) { currentFull += c; } else if (c === current) { currentFull += c; } else { if (currentFull.length > 0) { splits.push({ literal: /^\s+$/.test(currentFull), val: currentFull }); } currentFull = c; current = c; } } if (currentFull.length > 0) { splits.push({ literal: bracketed || /^\s+$/.test(currentFull), val: currentFull }); } return splits; } static macroTokenToFormatOpts(token) { return macroTokenToFormatOpts[token]; } constructor(locale, formatOpts) { this.opts = formatOpts; this.loc = locale; this.systemLoc = null; } formatWithSystemDefault(dt, opts) { if (this.systemLoc === null) { this.systemLoc = this.loc.redefaultToSystem(); } const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts }); return df.format(); } dtFormatter(dt, opts = {}) { return this.loc.dtFormatter(dt, { ...this.opts, ...opts }); } formatDateTime(dt, opts) { return this.dtFormatter(dt, opts).format(); } formatDateTimeParts(dt, opts) { return this.dtFormatter(dt, opts).formatToParts(); } formatInterval(interval, opts) { const df = this.dtFormatter(interval.start, opts); return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate()); } resolvedOptions(dt, opts) { return this.dtFormatter(dt, opts).resolvedOptions(); } num(n, p = 0) { // we get some perf out of doing this here, annoyingly if (this.opts.forceSimple) { return padStart(n, p); } const opts = { ...this.opts }; if (p > 0) { opts.padTo = p; } return this.loc.numberFormatter(opts).format(n); } formatDateTimeFromString(dt, fmt) { const knownEnglish = this.loc.listingMode() === "en", useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory", string = (opts, extract) => this.loc.extract(dt, opts, extract), formatOffset = (opts) => { if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) { return "Z"; } return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : ""; }, meridiem = () => knownEnglish ? English.meridiemForDateTime(dt) : string({ hour: "numeric", hourCycle: "h12" }, "dayperiod"), month = (length, standalone) => knownEnglish ? English.monthForDateTime(dt, length) : string(standalone ? { month: length } : { month: length, day: "numeric" }, "month"), weekday = (length, standalone) => knownEnglish ? English.weekdayForDateTime(dt, length) : string( standalone ? { weekday: length } : { weekday: length, month: "long", day: "numeric" }, "weekday" ), maybeMacro = (token) => { const formatOpts = Formatter.macroTokenToFormatOpts(token); if (formatOpts) { return this.formatWithSystemDefault(dt, formatOpts); } else { return token; } }, era = (length) => knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, "era"), tokenToString = (token) => { // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols switch (token) { // ms case "S": return this.num(dt.millisecond); case "u": // falls through case "SSS": return this.num(dt.millisecond, 3); // seconds case "s": return this.num(dt.second); case "ss": return this.num(dt.second, 2); // fractional seconds case "uu": return this.num(Math.floor(dt.millisecond / 10), 2); case "uuu": return this.num(Math.floor(dt.millisecond / 100)); // minutes case "m": return this.num(dt.minute); case "mm": return this.num(dt.minute, 2); // hours case "h": return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12); case "hh": return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2); case "H": return this.num(dt.hour); case "HH": return this.num(dt.hour, 2); // offset case "Z": // like +6 return formatOffset({ format: "narrow", allowZ: this.opts.allowZ }); case "ZZ": // like +06:00 return formatOffset({ format: "short", allowZ: this.opts.allowZ }); case "ZZZ": // like +0600 return formatOffset({ format: "techie", allowZ: this.opts.allowZ }); case "ZZZZ": // like EST return dt.zone.offsetName(dt.ts, { format: "short", locale: this.loc.locale }); case "ZZZZZ": // like Eastern Standard Time return dt.zone.offsetName(dt.ts, { format: "long", locale: this.loc.locale }); // zone case "z": // like America/New_York return dt.zoneName; // meridiems case "a": return meridiem(); // dates case "d": return useDateTimeFormatter ? string({ day: "numeric" }, "day") : this.num(dt.day); case "dd": return useDateTimeFormatter ? string({ day: "2-digit" }, "day") : this.num(dt.day, 2); // weekdays - standalone case "c": // like 1 return this.num(dt.weekday); case "ccc": // like 'Tues' return weekday("short", true); case "cccc": // like 'Tuesday' return weekday("long", true); case "ccccc": // like 'T' return weekday("narrow", true); // weekdays - format case "E": // like 1 return this.num(dt.weekday); case "EEE": // like 'Tues' return weekday("short", false); case "EEEE": // like 'Tuesday' return weekday("long", false); case "EEEEE": // like 'T' return weekday("narrow", false); // months - standalone case "L": // like 1 return useDateTimeFormatter ? string({ month: "numeric", day: "numeric" }, "month") : this.num(dt.month); case "LL": // like 01, doesn't seem to work return useDateTimeFormatter ? string({ month: "2-digit", day: "numeric" }, "month") : this.num(dt.month, 2); case "LLL": // like Jan return month("short", true); case "LLLL": // like January return month("long", true); case "LLLLL": // like J return month("narrow", true); // months - format case "M": // like 1 return useDateTimeFormatter ? string({ month: "numeric" }, "month") : this.num(dt.month); case "MM": // like 01 return useDateTimeFormatter ? string({ month: "2-digit" }, "month") : this.num(dt.month, 2); case "MMM": // like Jan return month("short", false); case "MMMM": // like January return month("long", false); case "MMMMM": // like J return month("narrow", false); // years case "y": // like 2014 return useDateTimeFormatter ? string({ year: "numeric" }, "year") : this.num(dt.year); case "yy": // like 14 return useDateTimeFormatter ? string({ year: "2-digit" }, "year") : this.num(dt.year.toString().slice(-2), 2); case "yyyy": // like 0012 return useDateTimeFormatter ? string({ year: "numeric" }, "year") : this.num(dt.year, 4); case "yyyyyy": // like 000012 return useDateTimeFormatter ? string({ year: "numeric" }, "year") : this.num(dt.year, 6); // eras case "G": // like AD return era("short"); case "GG": // like Anno Domini return era("long"); case "GGGGG": return era("narrow"); case "kk": return this.num(dt.weekYear.toString().slice(-2), 2); case "kkkk": return this.num(dt.weekYear, 4); case "W": return this.num(dt.weekNumber); case "WW": return this.num(dt.weekNumber, 2); case "n": return this.num(dt.localWeekNumber); case "nn": return this.num(dt.localWeekNumber, 2); case "ii": return this.num(dt.localWeekYear.toString().slice(-2), 2); case "iiii": return this.num(dt.localWeekYear, 4); case "o": return this.num(dt.ordinal); case "ooo": return this.num(dt.ordinal, 3); case "q": // like 1 return this.num(dt.quarter); case "qq": // like 01 return this.num(dt.quarter, 2); case "X": return this.num(Math.floor(dt.ts / 1000)); case "x": return this.num(dt.ts); default: return maybeMacro(token); } }; return stringifyTokens(Formatter.parseFormat(fmt), tokenToString); } formatDurationFromString(dur, fmt) { const tokenToField = (token) => { switch (token[0]) { case "S": return "millisecond"; case "s": return "second"; case "m": return "minute"; case "h": return "hour"; case "d": return "day"; case "w": return "week"; case "M": return "month"; case "y": return "year"; default: return null; } }, tokenToString = (lildur) => (token) => { const mapped = tokenToField(token); if (mapped) { return this.num(lildur.get(mapped), token.length); } else { return token; } }, tokens = Formatter.parseFormat(fmt), realTokens = tokens.reduce( (found, { literal, val }) => (literal ? found : found.concat(val)), [] ), collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)); return stringifyTokens(tokens, tokenToString(collapsed)); } } moment-luxon-93c85a3/src/impl/invalid.js000066400000000000000000000004321477254173100202430ustar00rootroot00000000000000export default class Invalid { constructor(reason, explanation) { this.reason = reason; this.explanation = explanation; } toMessage() { if (this.explanation) { return `${this.reason}: ${this.explanation}`; } else { return this.reason; } } } moment-luxon-93c85a3/src/impl/locale.js000066400000000000000000000377251477254173100200730ustar00rootroot00000000000000import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from "./util.js"; import * as English from "./english.js"; import Settings from "../settings.js"; import DateTime from "../datetime.js"; import IANAZone from "../zones/IANAZone.js"; // todo - remap caching let intlLFCache = {}; function getCachedLF(locString, opts = {}) { const key = JSON.stringify([locString, opts]); let dtf = intlLFCache[key]; if (!dtf) { dtf = new Intl.ListFormat(locString, opts); intlLFCache[key] = dtf; } return dtf; } const intlDTCache = new Map(); function getCachedDTF(locString, opts = {}) { const key = JSON.stringify([locString, opts]); let dtf = intlDTCache.get(key); if (dtf === undefined) { dtf = new Intl.DateTimeFormat(locString, opts); intlDTCache.set(key, dtf); } return dtf; } const intlNumCache = new Map(); function getCachedINF(locString, opts = {}) { const key = JSON.stringify([locString, opts]); let inf = intlNumCache.get(key); if (inf === undefined) { inf = new Intl.NumberFormat(locString, opts); intlNumCache.set(key, inf); } return inf; } const intlRelCache = new Map(); function getCachedRTF(locString, opts = {}) { const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options const key = JSON.stringify([locString, cacheKeyOpts]); let inf = intlRelCache.get(key); if (inf === undefined) { inf = new Intl.RelativeTimeFormat(locString, opts); intlRelCache.set(key, inf); } return inf; } let sysLocaleCache = null; function systemLocale() { if (sysLocaleCache) { return sysLocaleCache; } else { sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale; return sysLocaleCache; } } const intlResolvedOptionsCache = new Map(); function getCachedIntResolvedOptions(locString) { let opts = intlResolvedOptionsCache.get(locString); if (opts === undefined) { opts = new Intl.DateTimeFormat(locString).resolvedOptions(); intlResolvedOptionsCache.set(locString, opts); } return opts; } const weekInfoCache = new Map(); function getCachedWeekInfo(locString) { let data = weekInfoCache.get(locString); if (!data) { const locale = new Intl.Locale(locString); // browsers currently implement this as a property, but spec says it should be a getter function data = "getWeekInfo" in locale ? locale.getWeekInfo() : locale.weekInfo; // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86 if (!("minimalDays" in data)) { data = { ...fallbackWeekSettings, ...data }; } weekInfoCache.set(locString, data); } return data; } function parseLocaleString(localeStr) { // I really want to avoid writing a BCP 47 parser // see, e.g. https://github.com/wooorm/bcp-47 // Instead, we'll do this: // a) if the string has no -u extensions, just leave it alone // b) if it does, use Intl to resolve everything // c) if Intl fails, try again without the -u // private subtags and unicode subtags have ordering requirements, // and we're not properly parsing this, so just strip out the // private ones if they exist. const xIndex = localeStr.indexOf("-x-"); if (xIndex !== -1) { localeStr = localeStr.substring(0, xIndex); } const uIndex = localeStr.indexOf("-u-"); if (uIndex === -1) { return [localeStr]; } else { let options; let selectedStr; try { options = getCachedDTF(localeStr).resolvedOptions(); selectedStr = localeStr; } catch (e) { const smaller = localeStr.substring(0, uIndex); options = getCachedDTF(smaller).resolvedOptions(); selectedStr = smaller; } const { numberingSystem, calendar } = options; return [selectedStr, numberingSystem, calendar]; } } function intlConfigString(localeStr, numberingSystem, outputCalendar) { if (outputCalendar || numberingSystem) { if (!localeStr.includes("-u-")) { localeStr += "-u"; } if (outputCalendar) { localeStr += `-ca-${outputCalendar}`; } if (numberingSystem) { localeStr += `-nu-${numberingSystem}`; } return localeStr; } else { return localeStr; } } function mapMonths(f) { const ms = []; for (let i = 1; i <= 12; i++) { const dt = DateTime.utc(2009, i, 1); ms.push(f(dt)); } return ms; } function mapWeekdays(f) { const ms = []; for (let i = 1; i <= 7; i++) { const dt = DateTime.utc(2016, 11, 13 + i); ms.push(f(dt)); } return ms; } function listStuff(loc, length, englishFn, intlFn) { const mode = loc.listingMode(); if (mode === "error") { return null; } else if (mode === "en") { return englishFn(length); } else { return intlFn(length); } } function supportsFastNumbers(loc) { if (loc.numberingSystem && loc.numberingSystem !== "latn") { return false; } else { return ( loc.numberingSystem === "latn" || !loc.locale || loc.locale.startsWith("en") || getCachedIntResolvedOptions(loc.locale).numberingSystem === "latn" ); } } /** * @private */ class PolyNumberFormatter { constructor(intl, forceSimple, opts) { this.padTo = opts.padTo || 0; this.floor = opts.floor || false; const { padTo, floor, ...otherOpts } = opts; if (!forceSimple || Object.keys(otherOpts).length > 0) { const intlOpts = { useGrouping: false, ...opts }; if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo; this.inf = getCachedINF(intl, intlOpts); } } format(i) { if (this.inf) { const fixed = this.floor ? Math.floor(i) : i; return this.inf.format(fixed); } else { // to match the browser's numberformatter defaults const fixed = this.floor ? Math.floor(i) : roundTo(i, 3); return padStart(fixed, this.padTo); } } } /** * @private */ class PolyDateFormatter { constructor(dt, intl, opts) { this.opts = opts; this.originalZone = undefined; let z = undefined; if (this.opts.timeZone) { // Don't apply any workarounds if a timeZone is explicitly provided in opts this.dt = dt; } else if (dt.zone.type === "fixed") { // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like. // That is why fixed-offset TZ is set to that unless it is: // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT. // 2. Unsupported by the browser: // - some do not support Etc/ // - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata const gmtOffset = -1 * (dt.offset / 60); const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`; if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) { z = offsetZ; this.dt = dt; } else { // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so // we manually apply the offset and substitute the zone as needed. z = "UTC"; this.dt = dt.offset === 0 ? dt : dt.setZone("UTC").plus({ minutes: dt.offset }); this.originalZone = dt.zone; } } else if (dt.zone.type === "system") { this.dt = dt; } else if (dt.zone.type === "iana") { this.dt = dt; z = dt.zone.name; } else { // Custom zones can have any offset / offsetName so we just manually // apply the offset and substitute the zone as needed. z = "UTC"; this.dt = dt.setZone("UTC").plus({ minutes: dt.offset }); this.originalZone = dt.zone; } const intlOpts = { ...this.opts }; intlOpts.timeZone = intlOpts.timeZone || z; this.dtf = getCachedDTF(intl, intlOpts); } format() { if (this.originalZone) { // If we have to substitute in the actual zone name, we have to use // formatToParts so that the timezone can be replaced. return this.formatToParts() .map(({ value }) => value) .join(""); } return this.dtf.format(this.dt.toJSDate()); } formatToParts() { const parts = this.dtf.formatToParts(this.dt.toJSDate()); if (this.originalZone) { return parts.map((part) => { if (part.type === "timeZoneName") { const offsetName = this.originalZone.offsetName(this.dt.ts, { locale: this.dt.locale, format: this.opts.timeZoneName, }); return { ...part, value: offsetName, }; } else { return part; } }); } return parts; } resolvedOptions() { return this.dtf.resolvedOptions(); } } /** * @private */ class PolyRelFormatter { constructor(intl, isEnglish, opts) { this.opts = { style: "long", ...opts }; if (!isEnglish && hasRelative()) { this.rtf = getCachedRTF(intl, opts); } } format(count, unit) { if (this.rtf) { return this.rtf.format(count, unit); } else { return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== "long"); } } formatToParts(count, unit) { if (this.rtf) { return this.rtf.formatToParts(count, unit); } else { return []; } } } const fallbackWeekSettings = { firstDay: 1, minimalDays: 4, weekend: [6, 7], }; /** * @private */ export default class Locale { static fromOpts(opts) { return Locale.create( opts.locale, opts.numberingSystem, opts.outputCalendar, opts.weekSettings, opts.defaultToEN ); } static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) { const specifiedLocale = locale || Settings.defaultLocale; // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats const localeR = specifiedLocale || (defaultToEN ? "en-US" : systemLocale()); const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem; const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar; const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings; return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale); } static resetCache() { sysLocaleCache = null; intlDTCache.clear(); intlNumCache.clear(); intlRelCache.clear(); intlResolvedOptionsCache.clear(); weekInfoCache.clear(); } static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) { return Locale.create(locale, numberingSystem, outputCalendar, weekSettings); } constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) { const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale); this.locale = parsedLocale; this.numberingSystem = numbering || parsedNumberingSystem || null; this.outputCalendar = outputCalendar || parsedOutputCalendar || null; this.weekSettings = weekSettings; this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar); this.weekdaysCache = { format: {}, standalone: {} }; this.monthsCache = { format: {}, standalone: {} }; this.meridiemCache = null; this.eraCache = {}; this.specifiedLocale = specifiedLocale; this.fastNumbersCached = null; } get fastNumbers() { if (this.fastNumbersCached == null) { this.fastNumbersCached = supportsFastNumbers(this); } return this.fastNumbersCached; } listingMode() { const isActuallyEn = this.isEnglish(); const hasNoWeirdness = (this.numberingSystem === null || this.numberingSystem === "latn") && (this.outputCalendar === null || this.outputCalendar === "gregory"); return isActuallyEn && hasNoWeirdness ? "en" : "intl"; } clone(alts) { if (!alts || Object.getOwnPropertyNames(alts).length === 0) { return this; } else { return Locale.create( alts.locale || this.specifiedLocale, alts.numberingSystem || this.numberingSystem, alts.outputCalendar || this.outputCalendar, validateWeekSettings(alts.weekSettings) || this.weekSettings, alts.defaultToEN || false ); } } redefaultToEN(alts = {}) { return this.clone({ ...alts, defaultToEN: true }); } redefaultToSystem(alts = {}) { return this.clone({ ...alts, defaultToEN: false }); } months(length, format = false) { return listStuff(this, length, English.months, () => { const intl = format ? { month: length, day: "numeric" } : { month: length }, formatStr = format ? "format" : "standalone"; if (!this.monthsCache[formatStr][length]) { this.monthsCache[formatStr][length] = mapMonths((dt) => this.extract(dt, intl, "month")); } return this.monthsCache[formatStr][length]; }); } weekdays(length, format = false) { return listStuff(this, length, English.weekdays, () => { const intl = format ? { weekday: length, year: "numeric", month: "long", day: "numeric" } : { weekday: length }, formatStr = format ? "format" : "standalone"; if (!this.weekdaysCache[formatStr][length]) { this.weekdaysCache[formatStr][length] = mapWeekdays((dt) => this.extract(dt, intl, "weekday") ); } return this.weekdaysCache[formatStr][length]; }); } meridiems() { return listStuff( this, undefined, () => English.meridiems, () => { // In theory there could be aribitrary day periods. We're gonna assume there are exactly two // for AM and PM. This is probably wrong, but it's makes parsing way easier. if (!this.meridiemCache) { const intl = { hour: "numeric", hourCycle: "h12" }; this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map( (dt) => this.extract(dt, intl, "dayperiod") ); } return this.meridiemCache; } ); } eras(length) { return listStuff(this, length, English.eras, () => { const intl = { era: length }; // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates // to definitely enumerate them. if (!this.eraCache[length]) { this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) => this.extract(dt, intl, "era") ); } return this.eraCache[length]; }); } extract(dt, intlOpts, field) { const df = this.dtFormatter(dt, intlOpts), results = df.formatToParts(), matching = results.find((m) => m.type.toLowerCase() === field); return matching ? matching.value : null; } numberFormatter(opts = {}) { // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave) // (in contrast, the rest of the condition is used heavily) return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts); } dtFormatter(dt, intlOpts = {}) { return new PolyDateFormatter(dt, this.intl, intlOpts); } relFormatter(opts = {}) { return new PolyRelFormatter(this.intl, this.isEnglish(), opts); } listFormatter(opts = {}) { return getCachedLF(this.intl, opts); } isEnglish() { return ( this.locale === "en" || this.locale.toLowerCase() === "en-us" || getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us") ); } getWeekSettings() { if (this.weekSettings) { return this.weekSettings; } else if (!hasLocaleWeekInfo()) { return fallbackWeekSettings; } else { return getCachedWeekInfo(this.locale); } } getStartOfWeek() { return this.getWeekSettings().firstDay; } getMinDaysInFirstWeek() { return this.getWeekSettings().minimalDays; } getWeekendDays() { return this.getWeekSettings().weekend; } equals(other) { return ( this.locale === other.locale && this.numberingSystem === other.numberingSystem && this.outputCalendar === other.outputCalendar ); } toString() { return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`; } } moment-luxon-93c85a3/src/impl/regexParser.js000066400000000000000000000244151477254173100211130ustar00rootroot00000000000000import { untruncateYear, signedOffset, parseInteger, parseMillis, isUndefined, parseFloating, } from "./util.js"; import * as English from "./english.js"; import FixedOffsetZone from "../zones/fixedOffsetZone.js"; import IANAZone from "../zones/IANAZone.js"; /* * This file handles parsing for well-specified formats. Here's how it works: * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match. * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence. * Extractors can take a "cursor" representing the offset in the match to look at. This makes it easy to combine extractors. * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions. * Some extractions are super dumb and simpleParse and fromStrings help DRY them. */ const ianaRegex = /[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/; function combineRegexes(...regexes) { const full = regexes.reduce((f, r) => f + r.source, ""); return RegExp(`^${full}$`); } function combineExtractors(...extractors) { return (m) => extractors .reduce( ([mergedVals, mergedZone, cursor], ex) => { const [val, zone, next] = ex(m, cursor); return [{ ...mergedVals, ...val }, zone || mergedZone, next]; }, [{}, null, 1] ) .slice(0, 2); } function parse(s, ...patterns) { if (s == null) { return [null, null]; } for (const [regex, extractor] of patterns) { const m = regex.exec(s); if (m) { return extractor(m); } } return [null, null]; } function simpleParse(...keys) { return (match, cursor) => { const ret = {}; let i; for (i = 0; i < keys.length; i++) { ret[keys[i]] = parseInteger(match[cursor + i]); } return [ret, null, cursor + i]; }; } // ISO and SQL parsing const offsetRegex = /(?:(Z)|([+-]\d\d)(?::?(\d\d))?)/; const isoExtendedZone = `(?:${offsetRegex.source}?(?:\\[(${ianaRegex.source})\\])?)?`; const isoTimeBaseRegex = /(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/; const isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`); const isoTimeExtensionRegex = RegExp(`(?:T${isoTimeRegex.source})?`); const isoYmdRegex = /([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/; const isoWeekRegex = /(\d{4})-?W(\d\d)(?:-?(\d))?/; const isoOrdinalRegex = /(\d{4})-?(\d{3})/; const extractISOWeekData = simpleParse("weekYear", "weekNumber", "weekDay"); const extractISOOrdinalData = simpleParse("year", "ordinal"); const sqlYmdRegex = /(\d{4})-(\d\d)-(\d\d)/; // dumbed-down version of the ISO one const sqlTimeRegex = RegExp( `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?` ); const sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`); function int(match, pos, fallback) { const m = match[pos]; return isUndefined(m) ? fallback : parseInteger(m); } function extractISOYmd(match, cursor) { const item = { year: int(match, cursor), month: int(match, cursor + 1, 1), day: int(match, cursor + 2, 1), }; return [item, null, cursor + 3]; } function extractISOTime(match, cursor) { const item = { hours: int(match, cursor, 0), minutes: int(match, cursor + 1, 0), seconds: int(match, cursor + 2, 0), milliseconds: parseMillis(match[cursor + 3]), }; return [item, null, cursor + 4]; } function extractISOOffset(match, cursor) { const local = !match[cursor] && !match[cursor + 1], fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]), zone = local ? null : FixedOffsetZone.instance(fullOffset); return [{}, zone, cursor + 3]; } function extractIANAZone(match, cursor) { const zone = match[cursor] ? IANAZone.create(match[cursor]) : null; return [{}, zone, cursor + 1]; } // ISO time parsing const isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`); // ISO duration parsing const isoDuration = /^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/; function extractISODuration(match) { const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] = match; const hasNegativePrefix = s[0] === "-"; const negativeSeconds = secondStr && secondStr[0] === "-"; const maybeNegate = (num, force = false) => num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num; return [ { years: maybeNegate(parseFloating(yearStr)), months: maybeNegate(parseFloating(monthStr)), weeks: maybeNegate(parseFloating(weekStr)), days: maybeNegate(parseFloating(dayStr)), hours: maybeNegate(parseFloating(hourStr)), minutes: maybeNegate(parseFloating(minuteStr)), seconds: maybeNegate(parseFloating(secondStr), secondStr === "-0"), milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds), }, ]; } // These are a little braindead. EDT *should* tell us that we're in, say, America/New_York // and not just that we're in -240 *right now*. But since I don't think these are used that often // I'm just going to ignore that const obsOffsets = { GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60, }; function fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { const result = { year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr), month: English.monthsShort.indexOf(monthStr) + 1, day: parseInteger(dayStr), hour: parseInteger(hourStr), minute: parseInteger(minuteStr), }; if (secondStr) result.second = parseInteger(secondStr); if (weekdayStr) { result.weekday = weekdayStr.length > 3 ? English.weekdaysLong.indexOf(weekdayStr) + 1 : English.weekdaysShort.indexOf(weekdayStr) + 1; } return result; } // RFC 2822/5322 const rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; function extractRFC2822(match) { const [ , weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr, obsOffset, milOffset, offHourStr, offMinuteStr, ] = match, result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); let offset; if (obsOffset) { offset = obsOffsets[obsOffset]; } else if (milOffset) { offset = 0; } else { offset = signedOffset(offHourStr, offMinuteStr); } return [result, new FixedOffsetZone(offset)]; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s .replace(/\([^()]*\)|[\n\t]/g, " ") .replace(/(\s\s+)/g, " ") .trim(); } // http date const rfc1123 = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/, rfc850 = /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/, ascii = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/; function extractRFC1123Or850(match) { const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match, result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); return [result, FixedOffsetZone.utcInstance]; } function extractASCII(match) { const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match, result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr); return [result, FixedOffsetZone.utcInstance]; } const isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex); const isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex); const isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex); const isoTimeCombinedRegex = combineRegexes(isoTimeRegex); const extractISOYmdTimeAndOffset = combineExtractors( extractISOYmd, extractISOTime, extractISOOffset, extractIANAZone ); const extractISOWeekTimeAndOffset = combineExtractors( extractISOWeekData, extractISOTime, extractISOOffset, extractIANAZone ); const extractISOOrdinalDateAndTime = combineExtractors( extractISOOrdinalData, extractISOTime, extractISOOffset, extractIANAZone ); const extractISOTimeAndOffset = combineExtractors( extractISOTime, extractISOOffset, extractIANAZone ); /* * @private */ export function parseISODate(s) { return parse( s, [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset], [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime], [isoTimeCombinedRegex, extractISOTimeAndOffset] ); } export function parseRFC2822Date(s) { return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]); } export function parseHTTPDate(s) { return parse( s, [rfc1123, extractRFC1123Or850], [rfc850, extractRFC1123Or850], [ascii, extractASCII] ); } export function parseISODuration(s) { return parse(s, [isoDuration, extractISODuration]); } const extractISOTimeOnly = combineExtractors(extractISOTime); export function parseISOTimeOnly(s) { return parse(s, [isoTimeOnly, extractISOTimeOnly]); } const sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex); const sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex); const extractISOTimeOffsetAndIANAZone = combineExtractors( extractISOTime, extractISOOffset, extractIANAZone ); export function parseSQL(s) { return parse( s, [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset], [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone] ); } moment-luxon-93c85a3/src/impl/tokenParser.js000066400000000000000000000313111477254173100211120ustar00rootroot00000000000000import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from "./util.js"; import Formatter from "./formatter.js"; import FixedOffsetZone from "../zones/fixedOffsetZone.js"; import IANAZone from "../zones/IANAZone.js"; import DateTime from "../datetime.js"; import { digitRegex, parseDigits } from "./digits.js"; import { ConflictingSpecificationError } from "../errors.js"; const MISSING_FTP = "missing Intl.DateTimeFormat.formatToParts support"; function intUnit(regex, post = (i) => i) { return { regex, deser: ([s]) => post(parseDigits(s)) }; } const NBSP = String.fromCharCode(160); const spaceOrNBSP = `[ ${NBSP}]`; const spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, "g"); function fixListRegex(s) { // make dots optional and also make them literal // make space and non breakable space characters interchangeable return s.replace(/\./g, "\\.?").replace(spaceOrNBSPRegExp, spaceOrNBSP); } function stripInsensitivities(s) { return s .replace(/\./g, "") // ignore dots that were made optional .replace(spaceOrNBSPRegExp, " ") // interchange space and nbsp .toLowerCase(); } function oneOf(strings, startIndex) { if (strings === null) { return null; } else { return { regex: RegExp(strings.map(fixListRegex).join("|")), deser: ([s]) => strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex, }; } } function offset(regex, groups) { return { regex, deser: ([, h, m]) => signedOffset(h, m), groups }; } function simple(regex) { return { regex, deser: ([s]) => s }; } function escapeToken(value) { return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); } /** * @param token * @param {Locale} loc */ function unitForToken(token, loc) { const one = digitRegex(loc), two = digitRegex(loc, "{2}"), three = digitRegex(loc, "{3}"), four = digitRegex(loc, "{4}"), six = digitRegex(loc, "{6}"), oneOrTwo = digitRegex(loc, "{1,2}"), oneToThree = digitRegex(loc, "{1,3}"), oneToSix = digitRegex(loc, "{1,6}"), oneToNine = digitRegex(loc, "{1,9}"), twoToFour = digitRegex(loc, "{2,4}"), fourToSix = digitRegex(loc, "{4,6}"), literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }), unitate = (t) => { if (token.literal) { return literal(t); } switch (t.val) { // era case "G": return oneOf(loc.eras("short"), 0); case "GG": return oneOf(loc.eras("long"), 0); // years case "y": return intUnit(oneToSix); case "yy": return intUnit(twoToFour, untruncateYear); case "yyyy": return intUnit(four); case "yyyyy": return intUnit(fourToSix); case "yyyyyy": return intUnit(six); // months case "M": return intUnit(oneOrTwo); case "MM": return intUnit(two); case "MMM": return oneOf(loc.months("short", true), 1); case "MMMM": return oneOf(loc.months("long", true), 1); case "L": return intUnit(oneOrTwo); case "LL": return intUnit(two); case "LLL": return oneOf(loc.months("short", false), 1); case "LLLL": return oneOf(loc.months("long", false), 1); // dates case "d": return intUnit(oneOrTwo); case "dd": return intUnit(two); // ordinals case "o": return intUnit(oneToThree); case "ooo": return intUnit(three); // time case "HH": return intUnit(two); case "H": return intUnit(oneOrTwo); case "hh": return intUnit(two); case "h": return intUnit(oneOrTwo); case "mm": return intUnit(two); case "m": return intUnit(oneOrTwo); case "q": return intUnit(oneOrTwo); case "qq": return intUnit(two); case "s": return intUnit(oneOrTwo); case "ss": return intUnit(two); case "S": return intUnit(oneToThree); case "SSS": return intUnit(three); case "u": return simple(oneToNine); case "uu": return simple(oneOrTwo); case "uuu": return intUnit(one); // meridiem case "a": return oneOf(loc.meridiems(), 0); // weekYear (k) case "kkkk": return intUnit(four); case "kk": return intUnit(twoToFour, untruncateYear); // weekNumber (W) case "W": return intUnit(oneOrTwo); case "WW": return intUnit(two); // weekdays case "E": case "c": return intUnit(one); case "EEE": return oneOf(loc.weekdays("short", false), 1); case "EEEE": return oneOf(loc.weekdays("long", false), 1); case "ccc": return oneOf(loc.weekdays("short", true), 1); case "cccc": return oneOf(loc.weekdays("long", true), 1); // offset/zone case "Z": case "ZZ": return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2); case "ZZZ": return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2); // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing // because we don't have any way to figure out what they are case "z": return simple(/[a-z_+-/]{1,256}?/i); // this special-case "token" represents a place where a macro-token expanded into a white-space literal // in this case we accept any non-newline white-space case " ": return simple(/[^\S\n\r]/); default: return literal(t); } }; const unit = unitate(token) || { invalidReason: MISSING_FTP, }; unit.token = token; return unit; } const partTypeStyleToTokenVal = { year: { "2-digit": "yy", numeric: "yyyyy", }, month: { numeric: "M", "2-digit": "MM", short: "MMM", long: "MMMM", }, day: { numeric: "d", "2-digit": "dd", }, weekday: { short: "EEE", long: "EEEE", }, dayperiod: "a", dayPeriod: "a", hour12: { numeric: "h", "2-digit": "hh", }, hour24: { numeric: "H", "2-digit": "HH", }, minute: { numeric: "m", "2-digit": "mm", }, second: { numeric: "s", "2-digit": "ss", }, timeZoneName: { long: "ZZZZZ", short: "ZZZ", }, }; function tokenForPart(part, formatOpts, resolvedOpts) { const { type, value } = part; if (type === "literal") { const isSpace = /^\s+$/.test(value); return { literal: !isSpace, val: isSpace ? " " : value, }; } const style = formatOpts[type]; // The user might have explicitly specified hour12 or hourCycle // if so, respect their decision // if not, refer back to the resolvedOpts, which are based on the locale let actualType = type; if (type === "hour") { if (formatOpts.hour12 != null) { actualType = formatOpts.hour12 ? "hour12" : "hour24"; } else if (formatOpts.hourCycle != null) { if (formatOpts.hourCycle === "h11" || formatOpts.hourCycle === "h12") { actualType = "hour12"; } else { actualType = "hour24"; } } else { // tokens only differentiate between 24 hours or not, // so we do not need to check hourCycle here, which is less supported anyways actualType = resolvedOpts.hour12 ? "hour12" : "hour24"; } } let val = partTypeStyleToTokenVal[actualType]; if (typeof val === "object") { val = val[style]; } if (val) { return { literal: false, val, }; } return undefined; } function buildRegex(units) { const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, ""); return [`^${re}$`, units]; } function match(input, regex, handlers) { const matches = input.match(regex); if (matches) { const all = {}; let matchIndex = 1; for (const i in handlers) { if (hasOwnProperty(handlers, i)) { const h = handlers[i], groups = h.groups ? h.groups + 1 : 1; if (!h.literal && h.token) { all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups)); } matchIndex += groups; } } return [matches, all]; } else { return [matches, {}]; } } function dateTimeFromMatches(matches) { const toField = (token) => { switch (token) { case "S": return "millisecond"; case "s": return "second"; case "m": return "minute"; case "h": case "H": return "hour"; case "d": return "day"; case "o": return "ordinal"; case "L": case "M": return "month"; case "y": return "year"; case "E": case "c": return "weekday"; case "W": return "weekNumber"; case "k": return "weekYear"; case "q": return "quarter"; default: return null; } }; let zone = null; let specificOffset; if (!isUndefined(matches.z)) { zone = IANAZone.create(matches.z); } if (!isUndefined(matches.Z)) { if (!zone) { zone = new FixedOffsetZone(matches.Z); } specificOffset = matches.Z; } if (!isUndefined(matches.q)) { matches.M = (matches.q - 1) * 3 + 1; } if (!isUndefined(matches.h)) { if (matches.h < 12 && matches.a === 1) { matches.h += 12; } else if (matches.h === 12 && matches.a === 0) { matches.h = 0; } } if (matches.G === 0 && matches.y) { matches.y = -matches.y; } if (!isUndefined(matches.u)) { matches.S = parseMillis(matches.u); } const vals = Object.keys(matches).reduce((r, k) => { const f = toField(k); if (f) { r[f] = matches[k]; } return r; }, {}); return [vals, zone, specificOffset]; } let dummyDateTimeCache = null; function getDummyDateTime() { if (!dummyDateTimeCache) { dummyDateTimeCache = DateTime.fromMillis(1555555555555); } return dummyDateTimeCache; } function maybeExpandMacroToken(token, locale) { if (token.literal) { return token; } const formatOpts = Formatter.macroTokenToFormatOpts(token.val); const tokens = formatOptsToTokens(formatOpts, locale); if (tokens == null || tokens.includes(undefined)) { return token; } return tokens; } export function expandMacroTokens(tokens, locale) { return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale))); } /** * @private */ export class TokenParser { constructor(locale, format) { this.locale = locale; this.format = format; this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale); this.units = this.tokens.map((t) => unitForToken(t, locale)); this.disqualifyingUnit = this.units.find((t) => t.invalidReason); if (!this.disqualifyingUnit) { const [regexString, handlers] = buildRegex(this.units); this.regex = RegExp(regexString, "i"); this.handlers = handlers; } } explainFromTokens(input) { if (!this.isValid) { return { input, tokens: this.tokens, invalidReason: this.invalidReason }; } else { const [rawMatches, matches] = match(input, this.regex, this.handlers), [result, zone, specificOffset] = matches ? dateTimeFromMatches(matches) : [null, null, undefined]; if (hasOwnProperty(matches, "a") && hasOwnProperty(matches, "H")) { throw new ConflictingSpecificationError( "Can't include meridiem when specifying 24-hour format" ); } return { input, tokens: this.tokens, regex: this.regex, rawMatches, matches, result, zone, specificOffset, }; } } get isValid() { return !this.disqualifyingUnit; } get invalidReason() { return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null; } } export function explainFromTokens(locale, input, format) { const parser = new TokenParser(locale, format); return parser.explainFromTokens(input); } export function parseFromTokens(locale, input, format) { const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format); return [result, zone, specificOffset, invalidReason]; } export function formatOptsToTokens(formatOpts, locale) { if (!formatOpts) { return null; } const formatter = Formatter.create(locale, formatOpts); const df = formatter.dtFormatter(getDummyDateTime()); const parts = df.formatToParts(); const resolvedOpts = df.resolvedOptions(); return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts)); } moment-luxon-93c85a3/src/impl/util.js000066400000000000000000000205341477254173100175770ustar00rootroot00000000000000/* This is just a junk drawer, containing anything used across multiple classes. Because Luxon is small(ish), this should stay small and we won't worry about splitting it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area. */ import { InvalidArgumentError } from "../errors.js"; import Settings from "../settings.js"; import { dayOfWeek, isoWeekdayToLocal } from "./conversions.js"; /** * @private */ // TYPES export function isUndefined(o) { return typeof o === "undefined"; } export function isNumber(o) { return typeof o === "number"; } export function isInteger(o) { return typeof o === "number" && o % 1 === 0; } export function isString(o) { return typeof o === "string"; } export function isDate(o) { return Object.prototype.toString.call(o) === "[object Date]"; } // CAPABILITIES export function hasRelative() { try { return typeof Intl !== "undefined" && !!Intl.RelativeTimeFormat; } catch (e) { return false; } } export function hasLocaleWeekInfo() { try { return ( typeof Intl !== "undefined" && !!Intl.Locale && ("weekInfo" in Intl.Locale.prototype || "getWeekInfo" in Intl.Locale.prototype) ); } catch (e) { return false; } } // OBJECTS AND ARRAYS export function maybeArray(thing) { return Array.isArray(thing) ? thing : [thing]; } export function bestBy(arr, by, compare) { if (arr.length === 0) { return undefined; } return arr.reduce((best, next) => { const pair = [by(next), next]; if (!best) { return pair; } else if (compare(best[0], pair[0]) === best[0]) { return best; } else { return pair; } }, null)[1]; } export function pick(obj, keys) { return keys.reduce((a, k) => { a[k] = obj[k]; return a; }, {}); } export function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } export function validateWeekSettings(settings) { if (settings == null) { return null; } else if (typeof settings !== "object") { throw new InvalidArgumentError("Week settings must be an object"); } else { if ( !integerBetween(settings.firstDay, 1, 7) || !integerBetween(settings.minimalDays, 1, 7) || !Array.isArray(settings.weekend) || settings.weekend.some((v) => !integerBetween(v, 1, 7)) ) { throw new InvalidArgumentError("Invalid week settings"); } return { firstDay: settings.firstDay, minimalDays: settings.minimalDays, weekend: Array.from(settings.weekend), }; } } // NUMBERS AND STRINGS export function integerBetween(thing, bottom, top) { return isInteger(thing) && thing >= bottom && thing <= top; } // x % n but takes the sign of n instead of x export function floorMod(x, n) { return x - n * Math.floor(x / n); } export function padStart(input, n = 2) { const isNeg = input < 0; let padded; if (isNeg) { padded = "-" + ("" + -input).padStart(n, "0"); } else { padded = ("" + input).padStart(n, "0"); } return padded; } export function parseInteger(string) { if (isUndefined(string) || string === null || string === "") { return undefined; } else { return parseInt(string, 10); } } export function parseFloating(string) { if (isUndefined(string) || string === null || string === "") { return undefined; } else { return parseFloat(string); } } export function parseMillis(fraction) { // Return undefined (instead of 0) in these cases, where fraction is not set if (isUndefined(fraction) || fraction === null || fraction === "") { return undefined; } else { const f = parseFloat("0." + fraction) * 1000; return Math.floor(f); } } export function roundTo(number, digits, towardZero = false) { const factor = 10 ** digits, rounder = towardZero ? Math.trunc : Math.round; return rounder(number * factor) / factor; } // DATE BASICS export function isLeapYear(year) { return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); } export function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } export function daysInMonth(year, month) { const modMonth = floorMod(month - 1, 12) + 1, modYear = year + (month - modMonth) / 12; if (modMonth === 2) { return isLeapYear(modYear) ? 29 : 28; } else { return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1]; } } // convert a calendar object to a local timestamp (epoch, but with the offset baked in) export function objToLocalTS(obj) { let d = Date.UTC( obj.year, obj.month - 1, obj.day, obj.hour, obj.minute, obj.second, obj.millisecond ); // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that if (obj.year < 100 && obj.year >= 0) { d = new Date(d); // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not // so if obj.year is in 99, but obj.day makes it roll over into year 100, // the calculations done by Date.UTC are using year 2000 - which is incorrect d.setUTCFullYear(obj.year, obj.month - 1, obj.day); } return +d; } // adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js function firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) { const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek); return -fwdlw + minDaysInFirstWeek - 1; } export function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) { const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek); const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek); return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7; } export function untruncateYear(year) { if (year > 99) { return year; } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year; } // PARSING export function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) { const date = new Date(ts), intlOpts = { hourCycle: "h23", year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", }; if (timeZone) { intlOpts.timeZone = timeZone; } const modified = { timeZoneName: offsetFormat, ...intlOpts }; const parsed = new Intl.DateTimeFormat(locale, modified) .formatToParts(date) .find((m) => m.type.toLowerCase() === "timezonename"); return parsed ? parsed.value : null; } // signedOffset('-5', '30') -> -330 export function signedOffset(offHourStr, offMinuteStr) { let offHour = parseInt(offHourStr, 10); // don't || this because we want to preserve -0 if (Number.isNaN(offHour)) { offHour = 0; } const offMin = parseInt(offMinuteStr, 10) || 0, offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin; return offHour * 60 + offMinSigned; } // COERCION export function asNumber(value) { const numericValue = Number(value); if (typeof value === "boolean" || value === "" || Number.isNaN(numericValue)) throw new InvalidArgumentError(`Invalid unit value ${value}`); return numericValue; } export function normalizeObject(obj, normalizer) { const normalized = {}; for (const u in obj) { if (hasOwnProperty(obj, u)) { const v = obj[u]; if (v === undefined || v === null) continue; normalized[normalizer(u)] = asNumber(v); } } return normalized; } /** * Returns the offset's value as a string * @param {number} ts - Epoch milliseconds for which to get the offset * @param {string} format - What style of offset to return. * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively * @return {string} */ export function formatOffset(offset, format) { const hours = Math.trunc(Math.abs(offset / 60)), minutes = Math.trunc(Math.abs(offset % 60)), sign = offset >= 0 ? "+" : "-"; switch (format) { case "short": return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`; case "narrow": return `${sign}${hours}${minutes > 0 ? `:${minutes}` : ""}`; case "techie": return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`; default: throw new RangeError(`Value format ${format} is out of range for property format`); } } export function timeObject(obj) { return pick(obj, ["hour", "minute", "second", "millisecond"]); } moment-luxon-93c85a3/src/impl/zoneUtil.js000066400000000000000000000023451477254173100204330ustar00rootroot00000000000000/** * @private */ import Zone from "../zone.js"; import IANAZone from "../zones/IANAZone.js"; import FixedOffsetZone from "../zones/fixedOffsetZone.js"; import InvalidZone from "../zones/invalidZone.js"; import { isUndefined, isString, isNumber } from "./util.js"; import SystemZone from "../zones/systemZone.js"; export function normalizeZone(input, defaultZone) { let offset; if (isUndefined(input) || input === null) { return defaultZone; } else if (input instanceof Zone) { return input; } else if (isString(input)) { const lowered = input.toLowerCase(); if (lowered === "default") return defaultZone; else if (lowered === "local" || lowered === "system") return SystemZone.instance; else if (lowered === "utc" || lowered === "gmt") return FixedOffsetZone.utcInstance; else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input); } else if (isNumber(input)) { return FixedOffsetZone.instance(input); } else if (typeof input === "object" && "offset" in input && typeof input.offset === "function") { // This is dumb, but the instanceof check above doesn't seem to really work // so we're duck checking it return input; } else { return new InvalidZone(input); } } moment-luxon-93c85a3/src/info.js000066400000000000000000000220631477254173100166130ustar00rootroot00000000000000import DateTime from "./datetime.js"; import Settings from "./settings.js"; import Locale from "./impl/locale.js"; import IANAZone from "./zones/IANAZone.js"; import { normalizeZone } from "./impl/zoneUtil.js"; import { hasLocaleWeekInfo, hasRelative } from "./impl/util.js"; /** * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment. */ export default class Info { /** * Return whether the specified zone contains a DST. * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone. * @return {boolean} */ static hasDST(zone = Settings.defaultZone) { const proto = DateTime.now().setZone(zone).set({ month: 12 }); return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset; } /** * Return whether the specified zone is a valid IANA specifier. * @param {string} zone - Zone to check * @return {boolean} */ static isValidIANAZone(zone) { return IANAZone.isValidZone(zone); } /** * Converts the input into a {@link Zone} instance. * * * If `input` is already a Zone instance, it is returned unchanged. * * If `input` is a string containing a valid time zone name, a Zone instance * with that name is returned. * * If `input` is a string that doesn't refer to a known time zone, a Zone * instance with {@link Zone#isValid} == false is returned. * * If `input is a number, a Zone instance with the specified fixed offset * in minutes is returned. * * If `input` is `null` or `undefined`, the default zone is returned. * @param {string|Zone|number} [input] - the value to be converted * @return {Zone} */ static normalizeZone(input) { return normalizeZone(input, Settings.defaultZone); } /** * Get the weekday on which the week starts according to the given locale. * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @param {string} [opts.locObj=null] - an existing locale object to use * @returns {number} the start of the week, 1 for Monday through 7 for Sunday */ static getStartOfWeek({ locale = null, locObj = null } = {}) { return (locObj || Locale.create(locale)).getStartOfWeek(); } /** * Get the minimum number of days necessary in a week before it is considered part of the next year according * to the given locale. * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @param {string} [opts.locObj=null] - an existing locale object to use * @returns {number} */ static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) { return (locObj || Locale.create(locale)).getMinDaysInFirstWeek(); } /** * Get the weekdays, which are considered the weekend according to the given locale * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @param {string} [opts.locObj=null] - an existing locale object to use * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday */ static getWeekendWeekdays({ locale = null, locObj = null } = {}) { // copy the array, because we cache it internally return (locObj || Locale.create(locale)).getWeekendDays().slice(); } /** * Return an array of standalone month names. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @param {string} [opts.numberingSystem=null] - the numbering system * @param {string} [opts.locObj=null] - an existing locale object to use * @param {string} [opts.outputCalendar='gregory'] - the calendar * @example Info.months()[0] //=> 'January' * @example Info.months('short')[0] //=> 'Jan' * @example Info.months('numeric')[0] //=> '1' * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.' * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١' * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I' * @return {Array} */ static months( length = "long", { locale = null, numberingSystem = null, locObj = null, outputCalendar = "gregory" } = {} ) { return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length); } /** * Return an array of format month names. * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that * changes the string. * See {@link Info#months} * @param {string} [length='long'] - the length of the month representation, such as "numeric", "2-digit", "narrow", "short", "long" * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @param {string} [opts.numberingSystem=null] - the numbering system * @param {string} [opts.locObj=null] - an existing locale object to use * @param {string} [opts.outputCalendar='gregory'] - the calendar * @return {Array} */ static monthsFormat( length = "long", { locale = null, numberingSystem = null, locObj = null, outputCalendar = "gregory" } = {} ) { return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true); } /** * Return an array of standalone week names. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat * @param {string} [length='long'] - the length of the weekday representation, such as "narrow", "short", "long". * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @param {string} [opts.numberingSystem=null] - the numbering system * @param {string} [opts.locObj=null] - an existing locale object to use * @example Info.weekdays()[0] //=> 'Monday' * @example Info.weekdays('short')[0] //=> 'Mon' * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.' * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين' * @return {Array} */ static weekdays(length = "long", { locale = null, numberingSystem = null, locObj = null } = {}) { return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length); } /** * Return an array of format week names. * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that * changes the string. * See {@link Info#weekdays} * @param {string} [length='long'] - the length of the month representation, such as "narrow", "short", "long". * @param {Object} opts - options * @param {string} [opts.locale=null] - the locale code * @param {string} [opts.numberingSystem=null] - the numbering system * @param {string} [opts.locObj=null] - an existing locale object to use * @return {Array} */ static weekdaysFormat( length = "long", { locale = null, numberingSystem = null, locObj = null } = {} ) { return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true); } /** * Return an array of meridiems. * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @example Info.meridiems() //=> [ 'AM', 'PM' ] * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ] * @return {Array} */ static meridiems({ locale = null } = {}) { return Locale.create(locale).meridiems(); } /** * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian. * @param {string} [length='short'] - the length of the era representation, such as "short" or "long". * @param {Object} opts - options * @param {string} [opts.locale] - the locale code * @example Info.eras() //=> [ 'BC', 'AD' ] * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ] * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ] * @return {Array} */ static eras(length = "short", { locale = null } = {}) { return Locale.create(locale, null, "gregory").eras(length); } /** * Return the set of available features in this environment. * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case. * Keys: * * `relative`: whether this environment supports relative time formatting * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale * @example Info.features() //=> { relative: false, localeWeek: true } * @return {Object} */ static features() { return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() }; } } moment-luxon-93c85a3/src/interval.js000066400000000000000000000545051477254173100175120ustar00rootroot00000000000000import DateTime, { friendlyDateTime } from "./datetime.js"; import Duration from "./duration.js"; import Settings from "./settings.js"; import { InvalidArgumentError, InvalidIntervalError } from "./errors.js"; import Invalid from "./impl/invalid.js"; import Formatter from "./impl/formatter.js"; import * as Formats from "./impl/formats.js"; const INVALID = "Invalid Interval"; // checks if the start is equal to or before the end function validateStartEnd(start, end) { if (!start || !start.isValid) { return Interval.invalid("missing or invalid start"); } else if (!end || !end.isValid) { return Interval.invalid("missing or invalid end"); } else if (end < start) { return Interval.invalid( "end before start", `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}` ); } else { return null; } } /** * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them. * * Here is a brief overview of the most commonly used methods and getters in Interval: * * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}. * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end. * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}. * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}. * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs} * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}. */ export default class Interval { /** * @private */ constructor(config) { /** * @access private */ this.s = config.start; /** * @access private */ this.e = config.end; /** * @access private */ this.invalid = config.invalid || null; /** * @access private */ this.isLuxonInterval = true; } /** * Create an invalid Interval. * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information * @return {Interval} */ static invalid(reason, explanation = null) { if (!reason) { throw new InvalidArgumentError("need to specify a reason the Interval is invalid"); } const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation); if (Settings.throwOnInvalid) { throw new InvalidIntervalError(invalid); } else { return new Interval({ invalid }); } } /** * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end. * @param {DateTime|Date|Object} start * @param {DateTime|Date|Object} end * @return {Interval} */ static fromDateTimes(start, end) { const builtStart = friendlyDateTime(start), builtEnd = friendlyDateTime(end); const validateError = validateStartEnd(builtStart, builtEnd); if (validateError == null) { return new Interval({ start: builtStart, end: builtEnd, }); } else { return validateError; } } /** * Create an Interval from a start DateTime and a Duration to extend to. * @param {DateTime|Date|Object} start * @param {Duration|Object|number} duration - the length of the Interval. * @return {Interval} */ static after(start, duration) { const dur = Duration.fromDurationLike(duration), dt = friendlyDateTime(start); return Interval.fromDateTimes(dt, dt.plus(dur)); } /** * Create an Interval from an end DateTime and a Duration to extend backwards to. * @param {DateTime|Date|Object} end * @param {Duration|Object|number} duration - the length of the Interval. * @return {Interval} */ static before(end, duration) { const dur = Duration.fromDurationLike(duration), dt = friendlyDateTime(end); return Interval.fromDateTimes(dt.minus(dur), dt); } /** * Create an Interval from an ISO 8601 string. * Accepts `/`, `/`, and `/` formats. * @param {string} text - the ISO string to parse * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO} * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals * @return {Interval} */ static fromISO(text, opts) { const [s, e] = (text || "").split("/", 2); if (s && e) { let start, startIsValid; try { start = DateTime.fromISO(s, opts); startIsValid = start.isValid; } catch (e) { startIsValid = false; } let end, endIsValid; try { end = DateTime.fromISO(e, opts); endIsValid = end.isValid; } catch (e) { endIsValid = false; } if (startIsValid && endIsValid) { return Interval.fromDateTimes(start, end); } if (startIsValid) { const dur = Duration.fromISO(e, opts); if (dur.isValid) { return Interval.after(start, dur); } } else if (endIsValid) { const dur = Duration.fromISO(s, opts); if (dur.isValid) { return Interval.before(end, dur); } } } return Interval.invalid("unparsable", `the input "${text}" can't be parsed as ISO 8601`); } /** * Check if an object is an Interval. Works across context boundaries * @param {object} o * @return {boolean} */ static isInterval(o) { return (o && o.isLuxonInterval) || false; } /** * Returns the start of the Interval * @type {DateTime} */ get start() { return this.isValid ? this.s : null; } /** * Returns the end of the Interval * @type {DateTime} */ get end() { return this.isValid ? this.e : null; } /** * Returns the last DateTime included in the interval (since end is not part of the interval) * @type {DateTime} */ get lastDateTime() { return this.isValid ? (this.e ? this.e.minus(1) : null) : null; } /** * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'. * @type {boolean} */ get isValid() { return this.invalidReason === null; } /** * Returns an error code if this Interval is invalid, or null if the Interval is valid * @type {string} */ get invalidReason() { return this.invalid ? this.invalid.reason : null; } /** * Returns an explanation of why this Interval became invalid, or null if the Interval is valid * @type {string} */ get invalidExplanation() { return this.invalid ? this.invalid.explanation : null; } /** * Returns the length of the Interval in the specified unit. * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in. * @return {number} */ length(unit = "milliseconds") { return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN; } /** * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part. * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day' * asks 'what dates are included in this interval?', not 'how many days long is this interval?' * @param {string} [unit='milliseconds'] - the unit of time to count. * @param {Object} opts - options * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime * @return {number} */ count(unit = "milliseconds", opts) { if (!this.isValid) return NaN; const start = this.start.startOf(unit, opts); let end; if (opts?.useLocaleWeeks) { end = this.end.reconfigure({ locale: start.locale }); } else { end = this.end; } end = end.startOf(unit, opts); return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf()); } /** * Returns whether this Interval's start and end are both in the same unit of time * @param {string} unit - the unit of time to check sameness on * @return {boolean} */ hasSame(unit) { return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false; } /** * Return whether this Interval has the same start and end DateTimes. * @return {boolean} */ isEmpty() { return this.s.valueOf() === this.e.valueOf(); } /** * Return whether this Interval's start is after the specified DateTime. * @param {DateTime} dateTime * @return {boolean} */ isAfter(dateTime) { if (!this.isValid) return false; return this.s > dateTime; } /** * Return whether this Interval's end is before the specified DateTime. * @param {DateTime} dateTime * @return {boolean} */ isBefore(dateTime) { if (!this.isValid) return false; return this.e <= dateTime; } /** * Return whether this Interval contains the specified DateTime. * @param {DateTime} dateTime * @return {boolean} */ contains(dateTime) { if (!this.isValid) return false; return this.s <= dateTime && this.e > dateTime; } /** * "Sets" the start and/or end dates. Returns a newly-constructed Interval. * @param {Object} values - the values to set * @param {DateTime} values.start - the starting DateTime * @param {DateTime} values.end - the ending DateTime * @return {Interval} */ set({ start, end } = {}) { if (!this.isValid) return this; return Interval.fromDateTimes(start || this.s, end || this.e); } /** * Split this Interval at each of the specified DateTimes * @param {...DateTime} dateTimes - the unit of time to count. * @return {Array} */ splitAt(...dateTimes) { if (!this.isValid) return []; const sorted = dateTimes .map(friendlyDateTime) .filter((d) => this.contains(d)) .sort((a, b) => a.toMillis() - b.toMillis()), results = []; let { s } = this, i = 0; while (s < this.e) { const added = sorted[i] || this.e, next = +added > +this.e ? this.e : added; results.push(Interval.fromDateTimes(s, next)); s = next; i += 1; } return results; } /** * Split this Interval into smaller Intervals, each of the specified length. * Left over time is grouped into a smaller interval * @param {Duration|Object|number} duration - The length of each resulting interval. * @return {Array} */ splitBy(duration) { const dur = Duration.fromDurationLike(duration); if (!this.isValid || !dur.isValid || dur.as("milliseconds") === 0) { return []; } let { s } = this, idx = 1, next; const results = []; while (s < this.e) { const added = this.start.plus(dur.mapUnits((x) => x * idx)); next = +added > +this.e ? this.e : added; results.push(Interval.fromDateTimes(s, next)); s = next; idx += 1; } return results; } /** * Split this Interval into the specified number of smaller intervals. * @param {number} numberOfParts - The number of Intervals to divide the Interval into. * @return {Array} */ divideEqually(numberOfParts) { if (!this.isValid) return []; return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts); } /** * Return whether this Interval overlaps with the specified Interval * @param {Interval} other * @return {boolean} */ overlaps(other) { return this.e > other.s && this.s < other.e; } /** * Return whether this Interval's end is adjacent to the specified Interval's start. * @param {Interval} other * @return {boolean} */ abutsStart(other) { if (!this.isValid) return false; return +this.e === +other.s; } /** * Return whether this Interval's start is adjacent to the specified Interval's end. * @param {Interval} other * @return {boolean} */ abutsEnd(other) { if (!this.isValid) return false; return +other.e === +this.s; } /** * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise. * @param {Interval} other * @return {boolean} */ engulfs(other) { if (!this.isValid) return false; return this.s <= other.s && this.e >= other.e; } /** * Return whether this Interval has the same start and end as the specified Interval. * @param {Interval} other * @return {boolean} */ equals(other) { if (!this.isValid || !other.isValid) { return false; } return this.s.equals(other.s) && this.e.equals(other.e); } /** * Return an Interval representing the intersection of this Interval and the specified Interval. * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals. * Returns null if the intersection is empty, meaning, the intervals don't intersect. * @param {Interval} other * @return {Interval} */ intersection(other) { if (!this.isValid) return this; const s = this.s > other.s ? this.s : other.s, e = this.e < other.e ? this.e : other.e; if (s >= e) { return null; } else { return Interval.fromDateTimes(s, e); } } /** * Return an Interval representing the union of this Interval and the specified Interval. * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals. * @param {Interval} other * @return {Interval} */ union(other) { if (!this.isValid) return this; const s = this.s < other.s ? this.s : other.s, e = this.e > other.e ? this.e : other.e; return Interval.fromDateTimes(s, e); } /** * Merge an array of Intervals into an equivalent minimal set of Intervals. * Combines overlapping and adjacent Intervals. * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval * and ending with the latest. * * @param {Array} intervals * @return {Array} */ static merge(intervals) { const [found, final] = intervals .sort((a, b) => a.s - b.s) .reduce( ([sofar, current], item) => { if (!current) { return [sofar, item]; } else if (current.overlaps(item) || current.abutsStart(item)) { return [sofar, current.union(item)]; } else { return [sofar.concat([current]), item]; } }, [[], null] ); if (final) { found.push(final); } return found; } /** * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals. * @param {Array} intervals * @return {Array} */ static xor(intervals) { let start = null, currentCount = 0; const results = [], ends = intervals.map((i) => [ { time: i.s, type: "s" }, { time: i.e, type: "e" }, ]), flattened = Array.prototype.concat(...ends), arr = flattened.sort((a, b) => a.time - b.time); for (const i of arr) { currentCount += i.type === "s" ? 1 : -1; if (currentCount === 1) { start = i.time; } else { if (start && +start !== +i.time) { results.push(Interval.fromDateTimes(start, i.time)); } start = null; } } return Interval.merge(results); } /** * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals. * @param {...Interval} intervals * @return {Array} */ difference(...intervals) { return Interval.xor([this].concat(intervals)) .map((i) => this.intersection(i)) .filter((i) => i && !i.isEmpty()); } /** * Returns a string representation of this Interval appropriate for debugging. * @return {string} */ toString() { if (!this.isValid) return INVALID; return `[${this.s.toISO()} – ${this.e.toISO()})`; } /** * Returns a string representation of this Interval appropriate for the REPL. * @return {string} */ [Symbol.for("nodejs.util.inspect.custom")]() { if (this.isValid) { return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`; } else { return `Interval { Invalid, reason: ${this.invalidReason} }`; } } /** * Returns a localized string representing this Interval. Accepts the same options as the * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method * is browser-specific, but in general it will return an appropriate representation of the * Interval in the assigned locale. Defaults to the system's locale if no locale has been * specified. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or * Intl.DateTimeFormat constructor options. * @param {Object} opts - Options to override the configuration of the start DateTime. * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022 * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022 * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022 * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p * @return {string} */ toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) { return this.isValid ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this) : INVALID; } /** * Returns an ISO 8601-compliant string representation of this Interval. * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals * @param {Object} opts - The same options as {@link DateTime#toISO} * @return {string} */ toISO(opts) { if (!this.isValid) return INVALID; return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`; } /** * Returns an ISO 8601-compliant string representation of date of this Interval. * The time components are ignored. * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals * @return {string} */ toISODate() { if (!this.isValid) return INVALID; return `${this.s.toISODate()}/${this.e.toISODate()}`; } /** * Returns an ISO 8601-compliant string representation of time of this Interval. * The date components are ignored. * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals * @param {Object} opts - The same options as {@link DateTime#toISO} * @return {string} */ toISOTime(opts) { if (!this.isValid) return INVALID; return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`; } /** * Returns a string representation of this Interval formatted according to the specified format * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible * formatting tool. * @param {string} dateFormat - The format string. This string formats the start and end time. * See {@link DateTime#toFormat} for details. * @param {Object} opts - Options. * @param {string} [opts.separator = ' – '] - A separator to place between the start and end * representations. * @return {string} */ toFormat(dateFormat, { separator = " – " } = {}) { if (!this.isValid) return INVALID; return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`; } /** * Return a Duration representing the time spanned by this interval. * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration. * @param {Object} opts - options that affect the creation of the Duration * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 } * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 } * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 } * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 } * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 } * @return {Duration} */ toDuration(unit, opts) { if (!this.isValid) { return Duration.invalid(this.invalidReason); } return this.e.diff(this.s, unit, opts); } /** * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes * @param {function} mapFn * @return {Interval} * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC()) * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 })) */ mapEndpoints(mapFn) { return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e)); } } moment-luxon-93c85a3/src/luxon.js000066400000000000000000000011121477254173100170150ustar00rootroot00000000000000import DateTime from "./datetime.js"; import Duration from "./duration.js"; import Interval from "./interval.js"; import Info from "./info.js"; import Zone from "./zone.js"; import FixedOffsetZone from "./zones/fixedOffsetZone.js"; import IANAZone from "./zones/IANAZone.js"; import InvalidZone from "./zones/invalidZone.js"; import SystemZone from "./zones/systemZone.js"; import Settings from "./settings.js"; const VERSION = "3.6.1"; export { VERSION, DateTime, Duration, Interval, Info, Zone, FixedOffsetZone, IANAZone, InvalidZone, SystemZone, Settings, }; moment-luxon-93c85a3/src/package.json000066400000000000000000000000551477254173100176050ustar00rootroot00000000000000{ "type": "module", "version": "3.6.1" } moment-luxon-93c85a3/src/settings.js000066400000000000000000000127111477254173100175170ustar00rootroot00000000000000import SystemZone from "./zones/systemZone.js"; import IANAZone from "./zones/IANAZone.js"; import Locale from "./impl/locale.js"; import DateTime from "./datetime.js"; import { normalizeZone } from "./impl/zoneUtil.js"; import { validateWeekSettings } from "./impl/util.js"; import { resetDigitRegexCache } from "./impl/digits.js"; let now = () => Date.now(), defaultZone = "system", defaultLocale = null, defaultNumberingSystem = null, defaultOutputCalendar = null, twoDigitCutoffYear = 60, throwOnInvalid, defaultWeekSettings = null; /** * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here. */ export default class Settings { /** * Get the callback for returning the current timestamp. * @type {function} */ static get now() { return now; } /** * Set the callback for returning the current timestamp. * The function should return a number, which will be interpreted as an Epoch millisecond count * @type {function} * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time */ static set now(n) { now = n; } /** * Set the default time zone to create DateTimes in. Does not affect existing instances. * Use the value "system" to reset this value to the system's time zone. * @type {string} */ static set defaultZone(zone) { defaultZone = zone; } /** * Get the default time zone object currently used to create DateTimes. Does not affect existing instances. * The default value is the system's time zone (the one set on the machine that runs this code). * @type {Zone} */ static get defaultZone() { return normalizeZone(defaultZone, SystemZone.instance); } /** * Get the default locale to create DateTimes with. Does not affect existing instances. * @type {string} */ static get defaultLocale() { return defaultLocale; } /** * Set the default locale to create DateTimes with. Does not affect existing instances. * @type {string} */ static set defaultLocale(locale) { defaultLocale = locale; } /** * Get the default numbering system to create DateTimes with. Does not affect existing instances. * @type {string} */ static get defaultNumberingSystem() { return defaultNumberingSystem; } /** * Set the default numbering system to create DateTimes with. Does not affect existing instances. * @type {string} */ static set defaultNumberingSystem(numberingSystem) { defaultNumberingSystem = numberingSystem; } /** * Get the default output calendar to create DateTimes with. Does not affect existing instances. * @type {string} */ static get defaultOutputCalendar() { return defaultOutputCalendar; } /** * Set the default output calendar to create DateTimes with. Does not affect existing instances. * @type {string} */ static set defaultOutputCalendar(outputCalendar) { defaultOutputCalendar = outputCalendar; } /** * @typedef {Object} WeekSettings * @property {number} firstDay * @property {number} minimalDays * @property {number[]} weekend */ /** * @return {WeekSettings|null} */ static get defaultWeekSettings() { return defaultWeekSettings; } /** * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and * how many days are required in the first week of a year. * Does not affect existing instances. * * @param {WeekSettings|null} weekSettings */ static set defaultWeekSettings(weekSettings) { defaultWeekSettings = validateWeekSettings(weekSettings); } /** * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. * @type {number} */ static get twoDigitCutoffYear() { return twoDigitCutoffYear; } /** * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx. * @type {number} * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950 * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50 * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50 */ static set twoDigitCutoffYear(cutoffYear) { twoDigitCutoffYear = cutoffYear % 100; } /** * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals * @type {boolean} */ static get throwOnInvalid() { return throwOnInvalid; } /** * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals * @type {boolean} */ static set throwOnInvalid(t) { throwOnInvalid = t; } /** * Reset Luxon's global caches. Should only be necessary in testing scenarios. * @return {void} */ static resetCaches() { Locale.resetCache(); IANAZone.resetCache(); DateTime.resetCache(); resetDigitRegexCache(); } } moment-luxon-93c85a3/src/zone.js000066400000000000000000000043361477254173100166360ustar00rootroot00000000000000import { ZoneIsAbstractError } from "./errors.js"; /** * @interface */ export default class Zone { /** * The type of zone * @abstract * @type {string} */ get type() { throw new ZoneIsAbstractError(); } /** * The name of this zone. * @abstract * @type {string} */ get name() { throw new ZoneIsAbstractError(); } /** * The IANA name of this zone. * Defaults to `name` if not overwritten by a subclass. * @abstract * @type {string} */ get ianaName() { return this.name; } /** * Returns whether the offset is known to be fixed for the whole year. * @abstract * @type {boolean} */ get isUniversal() { throw new ZoneIsAbstractError(); } /** * Returns the offset's common name (such as EST) at the specified timestamp * @abstract * @param {number} ts - Epoch milliseconds for which to get the name * @param {Object} opts - Options to affect the format * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. * @param {string} opts.locale - What locale to return the offset name in. * @return {string} */ offsetName(ts, opts) { throw new ZoneIsAbstractError(); } /** * Returns the offset's value as a string * @abstract * @param {number} ts - Epoch milliseconds for which to get the offset * @param {string} format - What style of offset to return. * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively * @return {string} */ formatOffset(ts, format) { throw new ZoneIsAbstractError(); } /** * Return the offset in minutes for this zone at the specified timestamp. * @abstract * @param {number} ts - Epoch milliseconds for which to compute the offset * @return {number} */ offset(ts) { throw new ZoneIsAbstractError(); } /** * Return whether this Zone is equal to another zone * @abstract * @param {Zone} otherZone - the zone to compare * @return {boolean} */ equals(otherZone) { throw new ZoneIsAbstractError(); } /** * Return whether this Zone is valid. * @abstract * @type {boolean} */ get isValid() { throw new ZoneIsAbstractError(); } } moment-luxon-93c85a3/src/zones/000077500000000000000000000000001477254173100164555ustar00rootroot00000000000000moment-luxon-93c85a3/src/zones/IANAZone.js000066400000000000000000000140421477254173100203600ustar00rootroot00000000000000import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from "../impl/util.js"; import Zone from "../zone.js"; const dtfCache = new Map(); function makeDTF(zoneName) { let dtf = dtfCache.get(zoneName); if (dtf === undefined) { dtf = new Intl.DateTimeFormat("en-US", { hour12: false, timeZone: zoneName, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit", era: "short", }); dtfCache.set(zoneName, dtf); } return dtf; } const typeToPos = { year: 0, month: 1, day: 2, era: 3, hour: 4, minute: 5, second: 6, }; function hackyOffset(dtf, date) { const formatted = dtf.format(date).replace(/\u200E/g, ""), parsed = /(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted), [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed; return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond]; } function partsOffset(dtf, date) { const formatted = dtf.formatToParts(date); const filled = []; for (let i = 0; i < formatted.length; i++) { const { type, value } = formatted[i]; const pos = typeToPos[type]; if (type === "era") { filled[pos] = value; } else if (!isUndefined(pos)) { filled[pos] = parseInt(value, 10); } } return filled; } const ianaZoneCache = new Map(); /** * A zone identified by an IANA identifier, like America/New_York * @implements {Zone} */ export default class IANAZone extends Zone { /** * @param {string} name - Zone name * @return {IANAZone} */ static create(name) { let zone = ianaZoneCache.get(name); if (zone === undefined) { ianaZoneCache.set(name, (zone = new IANAZone(name))); } return zone; } /** * Reset local caches. Should only be necessary in testing scenarios. * @return {void} */ static resetCache() { ianaZoneCache.clear(); dtfCache.clear(); } /** * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that. * @param {string} s - The string to check validity on * @example IANAZone.isValidSpecifier("America/New_York") //=> true * @example IANAZone.isValidSpecifier("Sport~~blorp") //=> false * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead. * @return {boolean} */ static isValidSpecifier(s) { return this.isValidZone(s); } /** * Returns whether the provided string identifies a real zone * @param {string} zone - The string to check * @example IANAZone.isValidZone("America/New_York") //=> true * @example IANAZone.isValidZone("Fantasia/Castle") //=> false * @example IANAZone.isValidZone("Sport~~blorp") //=> false * @return {boolean} */ static isValidZone(zone) { if (!zone) { return false; } try { new Intl.DateTimeFormat("en-US", { timeZone: zone }).format(); return true; } catch (e) { return false; } } constructor(name) { super(); /** @private **/ this.zoneName = name; /** @private **/ this.valid = IANAZone.isValidZone(name); } /** * The type of zone. `iana` for all instances of `IANAZone`. * @override * @type {string} */ get type() { return "iana"; } /** * The name of this zone (i.e. the IANA zone name). * @override * @type {string} */ get name() { return this.zoneName; } /** * Returns whether the offset is known to be fixed for the whole year: * Always returns false for all IANA zones. * @override * @type {boolean} */ get isUniversal() { return false; } /** * Returns the offset's common name (such as EST) at the specified timestamp * @override * @param {number} ts - Epoch milliseconds for which to get the name * @param {Object} opts - Options to affect the format * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'. * @param {string} opts.locale - What locale to return the offset name in. * @return {string} */ offsetName(ts, { format, locale }) { return parseZoneInfo(ts, format, locale, this.name); } /** * Returns the offset's value as a string * @override * @param {number} ts - Epoch milliseconds for which to get the offset * @param {string} format - What style of offset to return. * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively * @return {string} */ formatOffset(ts, format) { return formatOffset(this.offset(ts), format); } /** * Return the offset in minutes for this zone at the specified timestamp. * @override * @param {number} ts - Epoch milliseconds for which to compute the offset * @return {number} */ offset(ts) { if (!this.valid) return NaN; const date = new Date(ts); if (isNaN(date)) return NaN; const dtf = makeDTF(this.name); let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts ? partsOffset(dtf, date) : hackyOffset(dtf, date); if (adOrBc === "BC") { year = -Math.abs(year) + 1; } // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat const adjustedHour = hour === 24 ? 0 : hour; const asUTC = objToLocalTS({ year, month, day, hour: adjustedHour, minute, second, millisecond: 0, }); let asTS = +date; const over = asTS % 1000; asTS -= over >= 0 ? over : 1000 + over; return (asUTC - asTS) / (60 * 1000); } /** * Return whether this Zone is equal to another zone * @override * @param {Zone} otherZone - the zone to compare * @return {boolean} */ equals(otherZone) { return otherZone.type === "iana" && otherZone.name === this.name; } /** * Return whether this Zone is valid. * @override * @type {boolean} */ get isValid() { return this.valid; } } moment-luxon-93c85a3/src/zones/fixedOffsetZone.js000066400000000000000000000070301477254173100221150ustar00rootroot00000000000000import { formatOffset, signedOffset } from "../impl/util.js"; import Zone from "../zone.js"; let singleton = null; /** * A zone with a fixed offset (meaning no DST) * @implements {Zone} */ export default class FixedOffsetZone extends Zone { /** * Get a singleton instance of UTC * @return {FixedOffsetZone} */ static get utcInstance() { if (singleton === null) { singleton = new FixedOffsetZone(0); } return singleton; } /** * Get an instance with a specified offset * @param {number} offset - The offset in minutes * @return {FixedOffsetZone} */ static instance(offset) { return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset); } /** * Get an instance of FixedOffsetZone from a UTC offset string, like "UTC+6" * @param {string} s - The offset string to parse * @example FixedOffsetZone.parseSpecifier("UTC+6") * @example FixedOffsetZone.parseSpecifier("UTC+06") * @example FixedOffsetZone.parseSpecifier("UTC-6:00") * @return {FixedOffsetZone} */ static parseSpecifier(s) { if (s) { const r = s.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i); if (r) { return new FixedOffsetZone(signedOffset(r[1], r[2])); } } return null; } constructor(offset) { super(); /** @private **/ this.fixed = offset; } /** * The type of zone. `fixed` for all instances of `FixedOffsetZone`. * @override * @type {string} */ get type() { return "fixed"; } /** * The name of this zone. * All fixed zones' names always start with "UTC" (plus optional offset) * @override * @type {string} */ get name() { return this.fixed === 0 ? "UTC" : `UTC${formatOffset(this.fixed, "narrow")}`; } /** * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn` * * @override * @type {string} */ get ianaName() { if (this.fixed === 0) { return "Etc/UTC"; } else { return `Etc/GMT${formatOffset(-this.fixed, "narrow")}`; } } /** * Returns the offset's common name at the specified timestamp. * * For fixed offset zones this equals to the zone name. * @override */ offsetName() { return this.name; } /** * Returns the offset's value as a string * @override * @param {number} ts - Epoch milliseconds for which to get the offset * @param {string} format - What style of offset to return. * Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively * @return {string} */ formatOffset(ts, format) { return formatOffset(this.fixed, format); } /** * Returns whether the offset is known to be fixed for the whole year: * Always returns true for all fixed offset zones. * @override * @type {boolean} */ get isUniversal() { return true; } /** * Return the offset in minutes for this zone at the specified timestamp. * * For fixed offset zones, this is constant and does not depend on a timestamp. * @override * @return {number} */ offset() { return this.fixed; } /** * Return whether this Zone is equal to another zone (i.e. also fixed and same offset) * @override * @param {Zone} otherZone - the zone to compare * @return {boolean} */ equals(otherZone) { return otherZone.type === "fixed" && otherZone.fixed === this.fixed; } /** * Return whether this Zone is valid: * All fixed offset zones are valid. * @override * @type {boolean} */ get isValid() { return true; } } moment-luxon-93c85a3/src/zones/invalidZone.js000066400000000000000000000013731477254173100213010ustar00rootroot00000000000000import Zone from "../zone.js"; /** * A zone that failed to parse. You should never need to instantiate this. * @implements {Zone} */ export default class InvalidZone extends Zone { constructor(zoneName) { super(); /** @private */ this.zoneName = zoneName; } /** @override **/ get type() { return "invalid"; } /** @override **/ get name() { return this.zoneName; } /** @override **/ get isUniversal() { return false; } /** @override **/ offsetName() { return null; } /** @override **/ formatOffset() { return ""; } /** @override **/ offset() { return NaN; } /** @override **/ equals() { return false; } /** @override **/ get isValid() { return false; } } moment-luxon-93c85a3/src/zones/systemZone.js000066400000000000000000000021731477254173100211760ustar00rootroot00000000000000import { formatOffset, parseZoneInfo } from "../impl/util.js"; import Zone from "../zone.js"; let singleton = null; /** * Represents the local zone for this JavaScript environment. * @implements {Zone} */ export default class SystemZone extends Zone { /** * Get a singleton instance of the local zone * @return {SystemZone} */ static get instance() { if (singleton === null) { singleton = new SystemZone(); } return singleton; } /** @override **/ get type() { return "system"; } /** @override **/ get name() { return new Intl.DateTimeFormat().resolvedOptions().timeZone; } /** @override **/ get isUniversal() { return false; } /** @override **/ offsetName(ts, { format, locale }) { return parseZoneInfo(ts, format, locale); } /** @override **/ formatOffset(ts, format) { return formatOffset(this.offset(ts), format); } /** @override **/ offset(ts) { return -new Date(ts).getTimezoneOffset(); } /** @override **/ equals(otherZone) { return otherZone.type === "system"; } /** @override **/ get isValid() { return true; } } moment-luxon-93c85a3/tasks/000077500000000000000000000000001477254173100156555ustar00rootroot00000000000000moment-luxon-93c85a3/tasks/build.js000066400000000000000000000074541477254173100173240ustar00rootroot00000000000000const rollup = require("rollup"), { babel } = require("@rollup/plugin-babel"), { terser } = require("rollup-plugin-terser"), { nodeResolve } = require("@rollup/plugin-node-resolve"), rollupCommonJS = require("@rollup/plugin-commonjs"), UglifyJS = require("uglify-js"), fs = require("fs"); // For some reason, the minifier is currently producing total giberrish, at least for the global build. // I've disabled it for now, and will simply uglify externally. const TRUST_MINIFY = false; function rollupInputOpts(opts) { const presetOpts = { modules: false, loose: true, }; if (opts.target) { presetOpts.targets = opts.target; } const inputOpts = { input: opts.src || "./src/luxon.js", onwarn: (warning) => { // I don't care about these for now if (warning.code !== "CIRCULAR_DEPENDENCY") { console.warn(`(!) ${warning.message}`); } }, plugins: [ nodeResolve(), rollupCommonJS({ include: "node_modules/**", }), ], }; if (opts.compile || typeof opts.compile === "undefined") { inputOpts.plugins.push( babel({ babelrc: false, presets: [["@babel/preset-env", presetOpts]], babelHelpers: "bundled", }) ); } if (opts.minify && TRUST_MINIFY) { inputOpts.plugins.push( terser({ comments: false, mangle: { topLevel: !opts.global, }, }) ); } return inputOpts; } function rollupOutputOpts(dest, opts) { const outputOpts = { file: `build/${dest}/${opts.filename || "luxon.js"}`, format: opts.format, sourcemap: true, }; if (opts.name) { outputOpts.name = opts.name; } return outputOpts; } async function babelAndRollup(dest, opts) { const inputOpts = rollupInputOpts(opts), outputOpts = rollupOutputOpts(dest, opts), bundle = await rollup.rollup(inputOpts); await bundle.write(outputOpts); } async function buildLibrary(dest, opts) { console.log("Building", dest); const promises = [babelAndRollup(dest, opts)]; if (opts.minify && TRUST_MINIFY) { promises.push( babelAndRollup(dest, { ...opts, minify: true, filename: "luxon.min.js", }) ); } await Promise.all(promises); if (opts.minify && !TRUST_MINIFY) { const code = fs.readFileSync(`build/${dest}/luxon.js`, "utf8"), ugly = UglifyJS.minify(code, { toplevel: !opts.global, output: { comments: false, }, sourceMap: { filename: `build/${dest}/luxon.js`, }, }); if (ugly.error) { console.error("Error uglifying", ugly.error); } else { fs.writeFileSync(`build/${dest}/luxon.min.js`, ugly.code); fs.writeFileSync(`build/${dest}/luxon.min.js.map`, ugly.map); } } console.log("Built", dest); } const browsersOld = "last 2 major versions"; async function global() { await buildLibrary("global", { format: "iife", global: true, name: "luxon", target: browsersOld, minify: true, }); } async function amd() { await buildLibrary("amd", { format: "amd", name: "luxon", target: browsersOld, minify: true, }); } async function node() { await buildLibrary("node", { format: "cjs", target: "node 12" }); } async function cjsBrowser() { await buildLibrary("cjs-browser", { format: "cjs", target: browsersOld }); } async function es6() { await buildLibrary("es6", { format: "es", minify: true, compile: false, }); } async function globalEs6() { await buildLibrary("global-es6", { format: "iife", name: "luxon", compile: false, global: true, }); } async function buildAll() { await Promise.all([node(), cjsBrowser(), es6(), amd(), global(), globalEs6()]); } module.exports = { buildAll, buildNode: node, buildGlobal: global, }; moment-luxon-93c85a3/tasks/buildAll.js000066400000000000000000000001121477254173100177350ustar00rootroot00000000000000const { buildAll } = require("./build"); buildAll().catch(console.error); moment-luxon-93c85a3/tasks/buildGlobal.js000066400000000000000000000001201477254173100204240ustar00rootroot00000000000000const { buildGlobal } = require("./build"); buildGlobal().catch(console.error); moment-luxon-93c85a3/tasks/buildNode.js000066400000000000000000000001141477254173100201140ustar00rootroot00000000000000const { buildNode } = require("./build"); buildNode().catch(console.error); moment-luxon-93c85a3/test/000077500000000000000000000000001477254173100155075ustar00rootroot00000000000000moment-luxon-93c85a3/test/datetime/000077500000000000000000000000001477254173100173035ustar00rootroot00000000000000moment-luxon-93c85a3/test/datetime/create.test.js000066400000000000000000000715101477254173100220660ustar00rootroot00000000000000/* global test expect */ import { DateTime, Settings } from "../../src/luxon"; import Helpers from "../helpers"; const withDefaultLocale = Helpers.withDefaultLocale, withDefaultNumberingSystem = Helpers.setUnset("defaultNumberingSystem"), withDefaultOutputCalendar = Helpers.setUnset("defaultOutputCalendar"), withthrowOnInvalid = Helpers.setUnset("throwOnInvalid"), withDefaultZone = Helpers.withDefaultZone; //------ // .now() //------ test("DateTime.now has today's date", () => { const date = new Date(), now = DateTime.now(); expect(now.toJSDate().getDate()).toBe(date.getDate()); // The two instants should be a few milliseconds apart expect(Math.abs(now.valueOf() - date.valueOf()) < 1000).toBe(true); }); test("DateTime.now accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.now().locale).toBe("fr")); }); test("DateTime.now accepts the default numbering system", () => { withDefaultNumberingSystem("beng", () => expect(DateTime.now().numberingSystem).toBe("beng")); }); test("DateTime.now accepts the default output calendar", () => { withDefaultOutputCalendar("hebrew", () => expect(DateTime.now().outputCalendar).toBe("hebrew")); }); test("DateTime.now accepts the default time zone", () => { withDefaultZone("Europe/Paris", () => expect(DateTime.now().zoneName).toBe("Europe/Paris")); }); //------ // .local() //------ test("DateTime.local() has today's date", () => { const date = new Date(), now = DateTime.local(); expect(now.toJSDate().getDate()).toBe(date.getDate()); // The two instants should be a few milliseconds apart expect(Math.abs(now.valueOf() - date.valueOf()) < 1000).toBe(true); }); test("DateTime.local(2017) is the beginning of the year", () => { const dt = DateTime.local(2017); expect(dt.year).toBe(2017); expect(dt.month).toBe(1); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.local(2017, 6) is the beginning of the month", () => { const dt = DateTime.local(2017, 6); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.local(2017, 6, 12) is the beginning of 6/12", () => { const dt = DateTime.local(2017, 6, 12); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.local(2017, 6, 12, 5) is the beginning of the hour", () => { const dt = DateTime.local(2017, 6, 12, 5); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.local(2017, 6, 12, 5, 25) is the beginning of the minute", () => { const dt = DateTime.local(2017, 6, 12, 5, 25); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(25); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.local(2017, 6, 12, 5, 25, 16) is the beginning of the second", () => { const dt = DateTime.local(2017, 6, 12, 5, 25, 16); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(25); expect(dt.second).toBe(16); expect(dt.millisecond).toBe(0); }); test("DateTime.local(2017, 6, 12, 5, 25, 16, 255) is right down to the millisecond", () => { const dt = DateTime.local(2017, 6, 12, 5, 25, 16, 255); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(25); expect(dt.second).toBe(16); expect(dt.millisecond).toBe(255); }); test("DateTime.local accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.local().locale).toBe("fr")); }); test("DateTime.local accepts the default numbering system", () => { withDefaultNumberingSystem("beng", () => expect(DateTime.local().numberingSystem).toBe("beng")); }); test("DateTime.local accepts the default output calendar", () => { withDefaultOutputCalendar("hebrew", () => expect(DateTime.local().outputCalendar).toBe("hebrew")); }); test("DateTime.local does not accept non-integer values", () => { const dt = DateTime.local(2017, 6.7, 12); expect(dt.isValid).toBe(false); }); test("DateTime.local accepts the default time zone", () => { withDefaultZone("Europe/Paris", () => expect(DateTime.local().zoneName).toBe("Europe/Paris")); }); test("DateTime.local accepts an options hash in any position", () => { const options = { zone: "Europe/Paris", numberingSystem: "beng", outputCalendar: "islamic", locale: "fr", }; const args = [ DateTime.local(options), DateTime.local(2017, options), DateTime.local(2017, 6, options), DateTime.local(2017, 6, 12, options), DateTime.local(2017, 6, 12, options), DateTime.local(2017, 6, 12, 5, options), DateTime.local(2017, 6, 12, 5, 25, options), DateTime.local(2017, 6, 12, 5, 25, 16, options), DateTime.local(2017, 6, 12, 5, 25, 16, 255, options), ]; for (const i in args) { const dt = args[i]; expect(dt.zoneName).toBe("Europe/Paris"); expect(dt.numberingSystem).toBe("beng"); expect(dt.outputCalendar).toBe("islamic"); expect(dt.locale).toBe("fr"); } }); //------ // .utc() //------- test("DateTime.utc() is in utc", () => { const now = DateTime.utc(); expect(now.offset).toBe(0); }); test("DateTime.utc(2017) is the beginning of the year", () => { const dt = DateTime.utc(2017); expect(dt.year).toBe(2017); expect(dt.month).toBe(1); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.utc(2017, 6) is the beginning of the month", () => { const dt = DateTime.utc(2017, 6); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.utc(2017, 6, 12) is the beginning of 6/12", () => { const dt = DateTime.utc(2017, 6, 12); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.utc(2017, 6, 12, 5) is the beginning of the hour", () => { const dt = DateTime.utc(2017, 6, 12, 5); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.utc(2017, 6, 12, 5, 25) is the beginning of the minute", () => { const dt = DateTime.utc(2017, 6, 12, 5, 25); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(25); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.utc(2017, 6, 12, 5, 25, 16) is the beginning of the second", () => { const dt = DateTime.utc(2017, 6, 12, 5, 25, 16); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(25); expect(dt.second).toBe(16); expect(dt.millisecond).toBe(0); }); test("DateTime.utc(2017, 6, 12, 5, 25, 16, 255) is right down to the millisecond", () => { const dt = DateTime.utc(2017, 6, 12, 5, 25, 16, 255); expect(dt.year).toBe(2017); expect(dt.month).toBe(6); expect(dt.day).toBe(12); expect(dt.hour).toBe(5); expect(dt.minute).toBe(25); expect(dt.second).toBe(16); expect(dt.millisecond).toBe(255); }); test("DateTime.utc accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.utc().locale).toBe("fr")); }); test("DateTime.utc accepts an options hash in any position", () => { const options = { numberingSystem: "beng", outputCalendar: "islamic", locale: "fr", }; const args = [ DateTime.utc(options), DateTime.utc(2017, options), DateTime.utc(2017, 6, options), DateTime.utc(2017, 6, 12, options), DateTime.utc(2017, 6, 12, options), DateTime.utc(2017, 6, 12, 5, options), DateTime.utc(2017, 6, 12, 5, 25, options), DateTime.utc(2017, 6, 12, 5, 25, 16, options), DateTime.utc(2017, 6, 12, 5, 25, 16, 255, options), ]; for (const i in args) { const dt = args[i]; expect(dt.zoneName).toBe("UTC"); expect(dt.numberingSystem).toBe("beng"); expect(dt.outputCalendar).toBe("islamic"); expect(dt.locale).toBe("fr"); } }); //------ // .fromJSDate() //------- test("DateTime.fromJSDate(date) clones the date", () => { const date = new Date(1982, 4, 25), dateTime = DateTime.fromJSDate(date), oldValue = dateTime.valueOf(); date.setDate(14); expect(dateTime.toJSDate().valueOf()).toBe(oldValue); }); test("DateTime.fromJSDate(date) accepts a zone option", () => { const date = new Date(1982, 4, 25), dateTime = DateTime.fromJSDate(date, { zone: "America/Santiago" }); expect(dateTime.toJSDate().valueOf()).toBe(date.valueOf()); expect(dateTime.zoneName).toBe("America/Santiago"); }); test("DateTime.fromJSDate(date) returns invalid for invalid values", () => { expect(DateTime.fromJSDate("").isValid).toBe(false); expect(DateTime.fromJSDate(new Date("")).isValid).toBe(false); expect(DateTime.fromJSDate(new Date().valueOf()).isValid).toBe(false); }); test("DateTime.fromJSDate accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.fromJSDate(new Date()).locale).toBe("fr")); }); test("DateTime.fromJSDate(date) throw errors for invalid values when throwOnInvalid is true", () => { withthrowOnInvalid(true, () => { expect(() => DateTime.fromJSDate("")).toThrow(); expect(() => DateTime.fromJSDate(new Date(""))).toThrow(); expect(() => DateTime.fromJSDate(new Date().valueOf())).toThrow(); expect(() => DateTime.fromJSDate(new Date(), { zone: "America/Blorp" })).toThrow(); expect(() => DateTime.fromJSDate("2019-04-16T11:32:32Z")).toThrow(); }); }); //------ // .fromMillis() //------- test("DateTime.fromMillis(ms) has a value of ms", () => { const bigValue = 391147200000; expect(DateTime.fromMillis(bigValue).valueOf()).toBe(bigValue); expect(DateTime.fromMillis(0).valueOf()).toBe(0); }); test("DateTime.fromMillis(ms) accepts a zone option", () => { const value = 391147200000, dateTime = DateTime.fromMillis(value, { zone: "America/Santiago" }); expect(dateTime.valueOf()).toBe(value); expect(dateTime.zoneName).toBe("America/Santiago"); }); test("DateTime.fromMillis accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.fromMillis(391147200000).locale).toBe("fr")); }); test("DateTime.fromMillis(ms) throws InvalidArgumentError for non-numeric input", () => { expect(() => DateTime.fromMillis("slurp")).toThrow(); }); test("DateTime.fromMillis(ms) does not accept out-of-bounds numbers", () => { expect(DateTime.fromMillis(-8.64e15 - 1).isValid).toBe(false); expect(DateTime.fromMillis(8.64e15 + 1).isValid).toBe(false); }); //------ // .fromSeconds() //------- test("DateTime.fromSeconds(seconds) has a value of 1000 * seconds", () => { const seconds = 391147200; expect(DateTime.fromSeconds(seconds).valueOf()).toBe(1000 * seconds); expect(DateTime.fromSeconds(0).valueOf()).toBe(0); }); test("DateTime.fromSeconds(ms) accepts a zone option", () => { const seconds = 391147200, dateTime = DateTime.fromSeconds(seconds, { zone: "America/Santiago" }); expect(dateTime.valueOf()).toBe(1000 * seconds); expect(dateTime.zoneName).toBe("America/Santiago"); }); test("DateTime.fromSeconds accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.fromSeconds(391147200).locale).toBe("fr")); }); test("DateTime.fromSeconds(seconds) throws InvalidArgumentError for non-numeric input", () => { expect(() => DateTime.fromSeconds("slurp")).toThrow(); }); //------ // .fromObject() //------- const baseObject = { year: 1982, month: 5, day: 25, hour: 9, minute: 23, second: 54, millisecond: 123, }; test("DateTime.fromObject() sets all the fields", () => { const dateTime = DateTime.fromObject(baseObject); expect(dateTime.isOffsetFixed).toBe(false); expect(dateTime.year).toBe(1982); expect(dateTime.month).toBe(5); expect(dateTime.day).toBe(25); expect(dateTime.hour).toBe(9); expect(dateTime.minute).toBe(23); expect(dateTime.second).toBe(54); expect(dateTime.millisecond).toBe(123); }); test('DateTime.fromObject() accepts a zone option of "utc"', () => { const dateTime = DateTime.fromObject(baseObject, { zone: "utc" }); expect(dateTime.isOffsetFixed).toBe(true); expect(dateTime.year).toBe(1982); expect(dateTime.month).toBe(5); expect(dateTime.day).toBe(25); expect(dateTime.hour).toBe(9); expect(dateTime.minute).toBe(23); expect(dateTime.second).toBe(54); expect(dateTime.millisecond).toBe(123); }); test('DateTime.fromObject() accepts "utc-8" as the zone option', () => { const dateTime = DateTime.fromObject(baseObject, { zone: "utc-8" }); expect(dateTime.isOffsetFixed).toBe(true); expect(dateTime.offset).toBe(-8 * 60); expect(dateTime.year).toBe(1982); expect(dateTime.month).toBe(5); expect(dateTime.day).toBe(25); expect(dateTime.hour).toBe(9); expect(dateTime.minute).toBe(23); expect(dateTime.second).toBe(54); expect(dateTime.millisecond).toBe(123); }); test('DateTime.fromObject() accepts "America/Los_Angeles" as the zone option', () => { const dateTime = DateTime.fromObject(baseObject, { zone: "America/Los_Angeles" }); expect(dateTime.isOffsetFixed).toBe(false); expect(dateTime.offset).toBe(-7 * 60); expect(dateTime.year).toBe(1982); expect(dateTime.month).toBe(5); expect(dateTime.day).toBe(25); expect(dateTime.hour).toBe(9); expect(dateTime.minute).toBe(23); expect(dateTime.second).toBe(54); expect(dateTime.millisecond).toBe(123); }); test("DateTime.fromObject() accepts a Zone as the zone option", () => { const daylight = DateTime.fromObject( { ...baseObject, month: 5 }, { zone: "America/Los_Angeles" } ); const standard = DateTime.fromObject( { ...baseObject, month: 12 }, { zone: "America/Los_Angeles" } ); expect(daylight.isOffsetFixed).toBe(false); expect(daylight.offset).toBe(-7 * 60); expect(daylight.year).toBe(1982); expect(daylight.month).toBe(5); expect(daylight.day).toBe(25); expect(daylight.hour).toBe(9); expect(daylight.minute).toBe(23); expect(daylight.second).toBe(54); expect(daylight.millisecond).toBe(123); expect(standard.isOffsetFixed).toBe(false); expect(standard.offset).toBe(-8 * 60); expect(standard.year).toBe(1982); expect(standard.month).toBe(12); expect(standard.day).toBe(25); expect(standard.hour).toBe(9); expect(standard.minute).toBe(23); expect(standard.second).toBe(54); expect(standard.millisecond).toBe(123); }); test("DateTime.fromObject() rejects invalid zones", () => { const dt = DateTime.fromObject({}, { zone: "blorp" }); expect(dt.isValid).toBe(false); expect(dt.invalidReason).toBe("unsupported zone"); }); test("DateTime.fromObject() ignores the case of object keys", () => { const dt = DateTime.fromObject({ Year: 2019, MONTH: 4, daYs: 10 }); expect(dt.isValid).toBe(true); expect(dt.year).toBe(2019); expect(dt.month).toBe(4); expect(dt.day).toBe(10); }); test("DateTime.fromObject() throws with invalid object key", () => { expect(() => DateTime.fromObject({ invalidUnit: 42 })).toThrow(); }); test("DateTime.fromObject() throws with invalid value types", () => { expect(() => DateTime.fromObject({ year: "blorp" })).toThrow(); expect(() => DateTime.fromObject({ year: "" })).toThrow(); expect(() => DateTime.fromObject({ month: NaN })).toThrow(); expect(() => DateTime.fromObject({ day: true })).toThrow(); expect(() => DateTime.fromObject({ day: false })).toThrow(); expect(() => DateTime.fromObject({ hour: {} })).toThrow(); expect(() => DateTime.fromObject({ hour: { unit: 42 } })).toThrow(); }); test("DateTime.fromObject() reject invalid values", () => { expect(DateTime.fromObject({ ordinal: 5000 }).isValid).toBe(false); expect(DateTime.fromObject({ minute: -6 }).isValid).toBe(false); expect(DateTime.fromObject({ millisecond: new Date() }).isValid).toBe(false); }); test("DateTime.fromObject() defaults high-order values to the current date", () => { const dateTime = DateTime.fromObject({}), now = DateTime.now(); expect(dateTime.year).toBe(now.year); expect(dateTime.month).toBe(now.month); expect(dateTime.day).toBe(now.day); }); test("DateTime.fromObject() defaults lower-order values to their minimums if a high-order value is set", () => { const dateTime = DateTime.fromObject({ year: 2017 }); expect(dateTime.year).toBe(2017); expect(dateTime.month).toBe(1); expect(dateTime.day).toBe(1); expect(dateTime.hour).toBe(0); expect(dateTime.minute).toBe(0); expect(dateTime.second).toBe(0); expect(dateTime.millisecond).toBe(0); }); test("DateTime.fromObject() w/weeks handles fully specified dates", () => { const dt = DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3, hour: 9, minute: 23, second: 54, millisecond: 123, }); expect(dt.weekYear).toBe(2016); expect(dt.weekNumber).toBe(2); expect(dt.weekday).toBe(3); expect(dt.year).toBe(2016); expect(dt.month).toBe(1); expect(dt.day).toBe(13); }); test("DateTime.fromObject() w/weekYears handles skew with Gregorian years", () => { let dt = DateTime.fromObject({ weekYear: 2015, weekNumber: 1, weekday: 3 }); expect(dt.weekYear).toBe(2015); expect(dt.weekNumber).toBe(1); expect(dt.weekday).toBe(3); expect(dt.year).toBe(2014); expect(dt.month).toBe(12); expect(dt.day).toBe(31); dt = DateTime.fromObject({ weekYear: 2009, weekNumber: 53, weekday: 5 }); expect(dt.weekYear).toBe(2009); expect(dt.weekNumber).toBe(53); expect(dt.weekday).toBe(5); expect(dt.year).toBe(2010); expect(dt.month).toBe(1); expect(dt.day).toBe(1); }); test("DateTime.fromObject() w/weeks defaults high-order values to the current date", () => { const dt = DateTime.fromObject({ weekday: 2 }), now = DateTime.now(); expect(dt.weekYear).toBe(now.weekYear); expect(dt.weekNumber).toBe(now.weekNumber); expect(dt.weekday).toBe(2); }); test("DateTime.fromObject() w/weeks defaults low-order values to their minimums", () => { const dt = DateTime.fromObject({ weekYear: 2016 }); expect(dt.weekYear).toBe(2016); expect(dt.weekNumber).toBe(1); expect(dt.weekday).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.fromObject() w/locale weeks defaults low-order values to their minimums", () => { const dt = DateTime.fromObject({ localWeekYear: 2016 }, { locale: "en-US" }); expect(dt.localWeekYear).toBe(2016); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekday).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime.fromObject() w/locale weeks defaults high-order values to the current date", () => { const dt = DateTime.fromObject({ localWeekday: 2 }, { locale: "en-US" }), now = DateTime.local({ locale: "en-US" }); expect(dt.localWeekYear).toBe(now.localWeekYear); expect(dt.localWeekNumber).toBe(now.localWeekNumber); expect(dt.localWeekday).toBe(2); }); test("DateTime.fromObject() w/locale weeks handles fully specified dates", () => { const dt = DateTime.fromObject( { localWeekYear: 2022, localWeekNumber: 2, localWeekday: 3, hour: 9, minute: 23, second: 54, millisecond: 123, }, { locale: "en-US" } ); expect(dt.localWeekYear).toBe(2022); expect(dt.localWeekNumber).toBe(2); expect(dt.localWeekday).toBe(3); expect(dt.year).toBe(2022); expect(dt.month).toBe(1); expect(dt.day).toBe(4); }); test("DateTime.fromObject() w/localWeekYears handles skew with Gregorian years", () => { let dt = DateTime.fromObject( { localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: "en-US" } ); expect(dt.localWeekYear).toBe(2022); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekday).toBe(1); expect(dt.year).toBe(2021); expect(dt.month).toBe(12); expect(dt.day).toBe(26); dt = DateTime.fromObject( { localWeekYear: 2009, localWeekNumber: 53, localWeekday: 5 }, { locale: "de-DE" } ); expect(dt.localWeekYear).toBe(2009); expect(dt.localWeekNumber).toBe(53); expect(dt.localWeekday).toBe(5); expect(dt.year).toBe(2010); expect(dt.month).toBe(1); expect(dt.day).toBe(1); }); test("DateTime.fromObject throws when both locale based weeks and ISO-weeks are specified", () => { expect(() => DateTime.fromObject({ localWeekYear: 2022, weekNumber: 12 })).toThrow(); expect(() => DateTime.fromObject({ localWeekYear: 2022, weekday: 2 })).toThrow(); }); test("DateTime.fromObject() w/ordinals handles fully specified dates", () => { const dt = DateTime.fromObject({ year: 2016, ordinal: 200, hour: 9, minute: 23, second: 54, millisecond: 123, }); expect(dt.year).toBe(2016); expect(dt.ordinal).toBe(200); expect(dt.month).toBe(7); expect(dt.day).toBe(18); }); test("DateTime.fromObject() w/ordinal defaults to the current year", () => { const dt = DateTime.fromObject({ ordinal: 200 }), now = DateTime.now(); expect(dt.year).toBe(now.year); expect(dt.ordinal).toBe(200); }); test("DateTime.fromObject() returns invalid for invalid values", () => { expect(DateTime.fromObject({ weekYear: 2017, weekNumber: 54 }).isValid).toBe(false); expect(DateTime.fromObject({ weekYear: 2017, weekNumber: 3.6 }).isValid).toBe(false); expect(DateTime.fromObject({ weekYear: 2017, weekNumber: 15, weekday: 0 }).isValid).toBe(false); }); test("DateTime.fromObject accepts the default locale", () => { withDefaultLocale("fr", () => expect(DateTime.fromObject({}).locale).toBe("fr")); }); test("DateTime.fromObject accepts really low year numbers", () => { const dt = DateTime.fromObject({ year: 5 }); expect(dt.year).toBe(5); expect(dt.month).toBe(1); expect(dt.day).toBe(1); }); test("DateTime.fromObject accepts really low year numbers with IANA zones", () => { const dt = DateTime.fromObject({ year: 5 }, { zone: "America/New_York" }); expect(dt.year).toBe(5); expect(dt.month).toBe(1); expect(dt.day).toBe(1); }); test("DateTime.fromObject accepts plurals and weird capitalization", () => { const dt = DateTime.fromObject({ Year: 2005, months: 12, dAy: 13 }); expect(dt.year).toBe(2005); expect(dt.month).toBe(12); expect(dt.day).toBe(13); }); test("DateTime.fromObject validates weekdays", () => { let dt = DateTime.fromObject({ year: 2005, months: 12, day: 13, weekday: 1 }); expect(dt.isValid).toBe(false); dt = DateTime.fromObject({ year: 2005, months: 12, day: 13, weekday: 2 }); expect(dt.isValid).toBe(true); }); test("DateTime.fromObject accepts a locale", () => { const res = DateTime.fromObject({}, { locale: "be" }); expect(res.locale).toBe("be"); }); test("DateTime.fromObject accepts a locale with calendar and numbering identifiers", () => { const res = DateTime.fromObject({}, { locale: "be-u-ca-coptic-nu-mong" }); expect(res.locale).toBe("be-u-ca-coptic-nu-mong"); expect(res.outputCalendar).toBe("coptic"); expect(res.numberingSystem).toBe("mong"); }); test("DateTime.fromObject accepts a locale string with weird junk in it", () => { withDefaultLocale("en-US", () => { const res = DateTime.fromObject( {}, { locale: "be-u-ca-coptic-ca-islamic", } ); expect(res.locale).toBe("be-u-ca-coptic-ca-islamic"); // "coptic" is right, but some versions of Node 10 give "gregory" expect(res.outputCalendar === "gregory" || res.outputCalendar === "coptic").toBe(true); expect(res.numberingSystem).toBe("latn"); }); }); test("DateTime.fromObject overrides the locale string with explicit settings", () => { const res = DateTime.fromObject( {}, { locale: "be-u-ca-coptic-nu-mong", numberingSystem: "thai", outputCalendar: "islamic", } ); expect(res.locale).toBe("be-u-ca-coptic-nu-mong"); expect(res.outputCalendar).toBe("islamic"); expect(res.numberingSystem).toBe("thai"); }); test("DateTime.fromObject handles null as a language tag", () => { withDefaultLocale("en-GB", () => { const res = DateTime.fromObject( {}, { locale: null, numberingSystem: "thai", outputCalendar: "islamic", } ); expect(res.locale).toBe("en-GB"); expect(res.outputCalendar).toBe("islamic"); expect(res.numberingSystem).toBe("thai"); }); }); test("DateTime.fromRFC2822 parses GMT correctly", () => { const dt = DateTime.fromRFC2822("25 Nov 2016 13:23:12 GMT", { zone: "UTC" }); expect(dt.year).toBe(2016); expect(dt.month).toBe(11); expect(dt.day).toBe(25); expect(dt.hour).toBe(13); expect(dt.minute).toBe(23); expect(dt.second).toBe(12); expect(dt.millisecond).toBe(0); expect(dt.offset).toBe(0); }); test("DateTime.fromRFC2822 parses Zulu correctly", () => { const dt = DateTime.fromRFC2822("25 Nov 2016 13:23 Z", { zone: "UTC" }); expect(dt.year).toBe(2016); expect(dt.month).toBe(11); expect(dt.day).toBe(25); expect(dt.hour).toBe(13); expect(dt.minute).toBe(23); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); expect(dt.offset).toBe(0); }); test("DateTime.fromRFC2822 parses offset correctly", () => { const dt = DateTime.fromRFC2822("Fri, 25 Nov 2016 13:23:12 +0600", { zone: "UTC", }); expect(dt.year).toBe(2016); expect(dt.month).toBe(11); expect(dt.day).toBe(25); expect(dt.hour).toBe(7); expect(dt.minute).toBe(23); expect(dt.second).toBe(12); expect(dt.millisecond).toBe(0); expect(dt.offset).toBe(0); }); test("DateTime.fromRFC2822 is invalid when weekday is not consistent", () => { // Actually a Friday, not a Saturday expect(DateTime.fromRFC2822("Sat, 25 Nov 2016 13:23:12 +0600").isValid).toBe(false); }); test("DateTime.fromHTTP parses rfc1123", () => { const dt = DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT", { zone: "UTC", }); expect(dt.year).toBe(1994); expect(dt.month).toBe(11); expect(dt.day).toBe(6); expect(dt.hour).toBe(8); expect(dt.minute).toBe(49); expect(dt.second).toBe(37); expect(dt.millisecond).toBe(0); expect(dt.offset).toBe(0); }); test("DateTime.fromHTTP parses rfc850", () => { const dt = DateTime.fromHTTP("Sunday, 06-Nov-94 08:49:37 GMT", { zone: "UTC", }); expect(dt.year).toBe(1994); expect(dt.month).toBe(11); expect(dt.day).toBe(6); expect(dt.hour).toBe(8); expect(dt.minute).toBe(49); expect(dt.second).toBe(37); expect(dt.millisecond).toBe(0); expect(dt.offset).toBe(0); }); test("DateTime.fromHTTP parses ascii", () => { const dt = DateTime.fromHTTP("Sun Nov 6 08:49:37 1994", { zone: "UTC" }); expect(dt.year).toBe(1994); expect(dt.month).toBe(11); expect(dt.day).toBe(6); expect(dt.hour).toBe(8); expect(dt.minute).toBe(49); expect(dt.second).toBe(37); expect(dt.millisecond).toBe(0); expect(dt.offset).toBe(0); }); test("DateTime.fromHTTP is invalid when weekday is not consistent", () => { // Actually a Sunday, not a Saturday expect(DateTime.fromRFC2822("Sat, 06 Nov 1994 08:49:37 GMT").isValid).toBe(false); expect(DateTime.fromRFC2822("Saturday, 06-Nov-94 08:49:37 GMT").isValid).toBe(false); expect(DateTime.fromRFC2822("Sat Nov 6 08:49:37 1994").isValid).toBe(false); }); test("DateTime.fromObject takes a undefined to mean {}", () => { const res = DateTime.fromObject(); expect(res.year).toBe(new Date().getFullYear()); }); test("private language subtags don't break unicode subtags", () => { const res = DateTime.fromObject( {}, { locale: "be-u-ca-coptic-nu-mong-x-twain", numberingSystem: "thai", outputCalendar: "islamic", } ); expect(res.locale).toBe("be-u-ca-coptic-nu-mong"); expect(res.outputCalendar).toBe("islamic"); expect(res.numberingSystem).toBe("thai"); }); test("DateTime.local works even after time zone change", () => { // This test catches errors produced when guessOffsetForZone produces wildy wrong guesses // This guards against a regression by broken caching in that method Settings.resetCaches(); withDefaultZone("America/Los_Angeles", () => { expect(DateTime.local(2024).year).toBe(2024); }); withDefaultZone("America/Chicago", () => { const dateTime = DateTime.local(2024, 11, 3, 0, 5, 0); expect(dateTime.zoneName).toBe("America/Chicago"); expect(dateTime.toObject()).toEqual({ year: 2024, month: 11, day: 3, hour: 0, minute: 5, second: 0, millisecond: 0, }); }); }); moment-luxon-93c85a3/test/datetime/degrade.test.js000066400000000000000000000005141477254173100222120ustar00rootroot00000000000000/* global expect */ import { DateTime } from "../../src/luxon"; const Helpers = require("../helpers"); Helpers.withoutRTF("calling toRelative falls back to English", () => { expect( DateTime.fromISO("2014-08-06", { locale: "fr" }).toRelative({ base: DateTime.fromISO("1982-05-25"), }) ).toBe("in 32 years"); }); moment-luxon-93c85a3/test/datetime/diff.test.js000066400000000000000000000255651477254173100215440ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; const Helpers = require("../helpers"); //------ // diff //------- const diffFromObjs = (o1, o2, units) => DateTime.fromObject(o1).diff(DateTime.fromObject(o2), units); const diffObjs = (o1, o2, units) => diffFromObjs(o1, o2, units).toObject(); test("DateTime#diff defaults to milliseconds", () => { expect(diffObjs({ year: 2017, millisecond: 12 }, { year: 2017 })).toEqual({ milliseconds: 12, }); expect(diffFromObjs({ year: 2017 }, { year: 2017 }).milliseconds).toBe(0); }); test("DateTime#diff makes simple diffs", () => { expect(diffObjs({ year: 2017 }, { year: 2017 }, "years")).toEqual({ years: 0 }); expect(diffObjs({ year: 2017 }, { year: 2016 }, "years")).toEqual({ years: 1, }); expect(diffObjs({ year: 2016, month: 4 }, { year: 2016, month: 1 }, "quarters")).toEqual({ quarters: 1, }); expect(diffObjs({ year: 2017, month: 10 }, { year: 2017, month: 4 }, "quarters")).toEqual({ quarters: 2, }); expect( diffObjs({ year: 2016, month: 6, day: 28 }, { year: 2016, month: 5, day: 28 }, "months") ).toEqual({ months: 1 }); expect( diffObjs({ year: 2016, month: 6, day: 28 }, { year: 2016, month: 6, day: 25 }, "days") ).toEqual({ days: 3 }); expect( diffObjs({ year: 2016, month: 6, day: 1 }, { year: 2016, month: 5, day: 28 }, "days") ).toEqual({ days: 4 }); expect( diffObjs({ year: 2016, month: 6, day: 29 }, { year: 2016, month: 6, day: 1 }, "weeks") ).toEqual({ weeks: 4 }); expect( diffObjs({ year: 2016, month: 3, day: 3 }, { year: 2016, month: 2, day: 18 }, "weeks") ).toEqual({ weeks: 2 }); expect( diffObjs( { year: 2016, month: 6, day: 28, hour: 13 }, { year: 2016, month: 6, day: 28, hour: 5 }, "hours" ) ).toEqual({ hours: 8 }); expect( diffObjs( { year: 2016, month: 6, day: 28, hour: 13 }, { year: 2016, month: 6, day: 28, hour: 5 }, "days" ) ).toEqual({ days: 1 / 3 }); expect( diffObjs( { year: 2016, month: 6, day: 28, hour: 13 }, { year: 2016, month: 6, day: 25, hour: 5 }, "hours" ) ).toEqual({ hours: 24 * 3 + 8 }); }); test("DateTime#diff accepts multiple units", () => { expect( diffObjs( { year: 2016, month: 3, day: 28, hour: 13, minute: 46 }, { year: 2016, month: 3, day: 16, hour: 5, second: 18 }, ["days", "hours", "minutes", "seconds"] ) ).toEqual({ days: 12, hours: 8, minutes: 45, seconds: 42 }); expect( diffObjs({ year: 2016, month: 3, day: 25 }, { year: 2016, month: 3, day: 1 }, ["weeks", "days"]) ).toEqual({ weeks: 3, days: 3 }); expect( diffObjs({ year: 2016, month: 3, day: 28 }, { year: 2010, month: 3, day: 16 }, [ "years", "days", ]) ).toEqual({ years: 6, days: 12 }); expect( diffObjs({ year: 2016, month: 3, day: 14 }, { year: 2010, month: 3, day: 16 }, [ "years", "days", ]) ).toEqual({ years: 5, days: 364 }); expect( diffObjs({ year: 2015, month: 3, day: 14 }, { year: 2009, month: 3, day: 16 }, [ "years", "days", ]) ).toEqual({ years: 5, days: 363 }); }); test("DateTime#diff handles unmatched units", () => { expect( diffObjs( { year: 2017, month: 6, day: 7, hour: 21 }, { year: 2017, month: 6, day: 1, hour: 22 }, ["weeks", "days", "hours"] ) ).toEqual({ weeks: 0, days: 5, hours: 23 }); expect( diffObjs( { year: 2017, month: 6, day: 27, hour: 21 }, { year: 2017, month: 6, day: 26, hour: 22 }, ["days", "hours"] ) ).toEqual({ days: 0, hours: 23 }); expect( diffObjs( { year: 2017, month: 6, day: 7, hour: 21 }, { year: 2017, month: 6, day: 1, hour: 22 }, ["weeks", "hours"] ) ).toEqual({ weeks: 0, hours: 23 + 5 * 24 }); }); test("DateTime#diff sets all its units to 0 if the duration is empty", () => { const t = DateTime.fromObject({ year: 2018, month: 11, day: 5, hour: 0 }); expect(t.diff(t).toObject()).toEqual({ milliseconds: 0 }); expect(t.diff(t, "hours").toObject()).toEqual({ hours: 0 }); expect(t.diff(t, "days").toObject()).toEqual({ days: 0 }); }); test("DateTime#diff sets units to 0 if second object is slightly larger", () => { expect( diffObjs( { year: 2017, month: 6, day: 26, hour: 21, minute: 1, second: 2, millisecond: 1 }, { year: 2017, month: 6, day: 26, hour: 21, minute: 1, second: 2, millisecond: 2 }, ["years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"] ) ).toEqual({ years: 0, months: 0, weeks: 0, days: 0, hours: 0, minutes: 0, seconds: 0, milliseconds: -1, }); }); test("DateTime#diff puts fractional parts in the lowest order unit", () => { expect( diffObjs({ year: 2017, month: 7, day: 14 }, { year: 2016, month: 6, day: 16 }, [ "years", "months", ]) ).toEqual({ years: 1, months: 1 - 2 / 30 }); }); test("DateTime#diff returns the fractional parts even when it can't find a whole unit", () => { expect( diffObjs( { year: 2017, month: 7, day: 14, hour: 6 }, { year: 2017, month: 7, day: 14, hour: 2 }, ["days"] ) ).toEqual({ days: 1 / 6 }); }); test("DateTime#diff is calendary for years, months, day", () => { // respecting the leap year expect( diffObjs({ year: 2016, month: 6, day: 14 }, { year: 2010, month: 6, day: 14 }, [ "years", "days", ]) ).toEqual({ years: 6, days: 0 }); expect( diffObjs({ year: 2016, month: 3, day: 14 }, { year: 2010, month: 3, day: 16 }, [ "years", "days", ]) ).toEqual({ years: 5, days: 364 }); // ignores the DST, works in calendar days, not bubbled months expect( diffObjs({ year: 2016, month: 5, day: 14 }, { year: 2016, month: 2, day: 14 }, "days") ).toEqual({ days: 90 }); }); test("DateTime#diff handles fractional years as fractions of those specific years", () => { // the point here is that we're crossing the leap year expect( diffObjs({ year: 2020, month: 3, day: 27 }, { year: 2018, month: 3, day: 28 }, "years") ).toEqual({ years: 1 + 365.0 / 366 }); }); test("DateTime#diff handles fractional months as fractions of those specific months", () => { // The point here is that January has 31 days expect( diffObjs({ year: 2018, month: 2, day: 24 }, { year: 2017, month: 12, day: 25 }, "months") ).toEqual({ months: 1 + 30.0 / 31 }); }); test("DateTime#diff handles fractional weeks as fractions of those specific weeks", () => { // America/New_York has a fall back Nov 4, 2018 at 2:00 expect( diffObjs( { year: 2018, month: 11, day: 16, hour: 0 }, { year: 2018, month: 11, day: 2, hour: 1 }, "weeks" ) ).toEqual({ weeks: 1 + 6.0 / 7 + 23.0 / 24 / 7 }); }); test("DateTime#diff handles fractional days as fractions of those specific days", () => { // America/New_York has a fall back Nov 4, 2018 at 2:00 expect( diffObjs( { year: 2018, month: 11, day: 5, hour: 0 }, { year: 2018, month: 11, day: 3, hour: 1 }, "days" ) ).toEqual({ days: 1 + 24 / 25 }); }); test("DateTime#diff is precise for lower order units", () => { // spring forward skips one hour expect( diffObjs({ year: 2016, month: 5, day: 5 }, { year: 2016, month: 1, day: 1 }, "hours") ).toEqual({ hours: 2999 }); }); test("DateTime#diff passes through options", () => { const dt1 = DateTime.fromObject({ year: 2016, month: 5, day: 5 }), dt2 = DateTime.fromObject({ year: 2016, month: 1, day: 1 }), dur1 = dt1.diff(dt2, "hours", { conversionAccuracy: "longterm" }), dur2 = dt1.diff(dt2, "days", { conversionAccuracy: "longterm" }); expect(dur1.conversionAccuracy).toBe("longterm"); expect(dur2.conversionAccuracy).toBe("longterm"); }); test("DateTime#diff returns invalid Durations if the DateTimes are invalid", () => { const i = DateTime.invalid("because"); expect(i.diff(DateTime.now()).isValid).toBe(false); expect(DateTime.now().diff(i).isValid).toBe(false); }); test("DateTime#diff results in a duration with the same locale", () => { const dt1 = DateTime.fromObject( { year: 2016, month: 5, day: 5, }, { locale: "fr", numberingSystem: "mong", } ), dt2 = DateTime.fromObject( { year: 2016, month: 1, day: 1, }, { locale: "es", numberingSystem: "beng", } ), dur = dt1.diff(dt2); expect(dur.locale).toBe("fr"); expect(dur.numberingSystem).toBe("mong"); }); // see https://github.com/moment/luxon/issues/487 test("DateTime#diff results works when needing to backtrack months", () => { const left = DateTime.fromJSDate(new Date(1554036127038)); // 2019-03-31T12:42:07.038Z const right = DateTime.fromJSDate(new Date(1554122527128)); // 2019-04-01T12:42:07.128Z const diff = right.diff(left, ["months", "days", "hours"]); expect(diff.months).toBe(0); expect(diff.days).toBe(1); }); // see https://github.com/moment/luxon/issues/1301 test("DateTime#diff handles Feb-29 edge case logic for higher order units in a manner consistent with DateTime#plus", () => { const left = DateTime.fromISO("2020-02-29"); const right = DateTime.fromISO("2021-04-01"); const diff = right.diff(left, ["years", "months", "days"]); expect(diff.days).toBe(3); expect(left.plus(diff).equals(right)).toBe(true); }); // see https://github.com/moment/luxon/issues/1165 test("DateTime#diff handles datetimes whose dayDiff is off by 2 days instead of the usual 1 due to zone differences", () => { // Notice how `end` is 5 days away when only looking at calendar days ignoring time zones, // but actually the diff is 3 days and 23 hours (days are off by 2) // because Europe/Madrid here has an offset of +02:00. const start = DateTime.fromISO("2022-05-05T23:00", { zone: "UTC" }); const end = DateTime.fromISO("2022-05-10T00:00", { zone: "Europe/Madrid" }); const diff1 = end.diff(start, ["days", "hours", "minutes"]).toObject(); expect(diff1).toEqual({ days: 3, hours: 23, minutes: 0 }); const diff2 = end.diff(start, ["days"]); expect(diff2.days).toBeCloseTo(3.958333, 6); }); //------ // diffNow //------- Helpers.withNow("DateTime#diffNow defaults to milliseconds", DateTime.local(2017, 5, 15), () => { const dt = DateTime.local(2014, 8, 6), dur = dt.diffNow(); expect(dur.milliseconds).toBe(-87523200000); }); Helpers.withNow("DateTime#diffNow accepts units", DateTime.local(2017, 5, 15), () => { const dt = DateTime.local(2014, 8, 6), dur = dt.diffNow("days"); expect(dur.days).toBe(-1013); }); Helpers.withNow("DateTime#diffNow passes through options", DateTime.local(2017, 5, 15), () => { const dt = DateTime.local(2014, 8, 6), dur = dt.diffNow("days", { conversionAccuracy: "longterm" }); expect(dur.conversionAccuracy).toBe("longterm"); }); test("DateTime#diffNow returns invalid Durations if the DateTime is invalid", () => { const i = DateTime.invalid("because"); expect(i.diffNow().isValid).toBe(false); }); moment-luxon-93c85a3/test/datetime/dst.test.js000066400000000000000000000140131477254173100214100ustar00rootroot00000000000000/* global test expect */ import { DateTime, Settings } from "../../src/luxon"; const dateTimeConstructors = { fromObject: (year, month, day, hour) => DateTime.fromObject({ year, month, day, hour }, { zone: "America/New_York" }), local: (year, month, day, hour) => DateTime.local(year, month, day, hour, { zone: "America/New_York" }), }; for (const [name, local] of Object.entries(dateTimeConstructors)) { describe(`DateTime.${name}`, () => { test("Hole dates are bumped forward", () => { const d = local(2017, 3, 12, 2); expect(d.hour).toBe(3); expect(d.offset).toBe(-4 * 60); }); if (name == "fromObject") { // this is questionable behavior, but I wanted to document it test("Ambiguous dates pick the one with the current offset", () => { const oldSettings = Settings.now; try { Settings.now = () => 1495653314595; // May 24, 2017 let d = local(2017, 11, 5, 1); expect(d.hour).toBe(1); expect(d.offset).toBe(-4 * 60); Settings.now = () => 1484456400000; // Jan 15, 2017 d = local(2017, 11, 5, 1); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); } finally { Settings.now = oldSettings; } }); } else { test("Ambiguous dates pick the one with the cached offset", () => { const oldSettings = Settings.now; try { Settings.resetCaches(); Settings.now = () => 1495653314595; // May 24, 2017 let d = local(2017, 11, 5, 1); expect(d.hour).toBe(1); expect(d.offset).toBe(-4 * 60); Settings.now = () => 1484456400000; // Jan 15, 2017 d = local(2017, 11, 5, 1); expect(d.hour).toBe(1); expect(d.offset).toBe(-4 * 60); Settings.resetCaches(); Settings.now = () => 1484456400000; // Jan 15, 2017 d = local(2017, 11, 5, 1); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); Settings.now = () => 1495653314595; // May 24, 2017 d = local(2017, 11, 5, 1); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); } finally { Settings.now = oldSettings; } }); } test("Adding an hour to land on the Spring Forward springs forward", () => { const d = local(2017, 3, 12, 1).plus({ hour: 1 }); expect(d.hour).toBe(3); expect(d.offset).toBe(-4 * 60); }); test("Subtracting an hour to land on the Spring Forward springs forward", () => { const d = local(2017, 3, 12, 3).minus({ hour: 1 }); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); }); test("Adding an hour to land on the Fall Back falls back", () => { const d = local(2017, 11, 5, 0).plus({ hour: 2 }); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); }); test("Subtracting an hour to land on the Fall Back falls back", () => { let d = local(2017, 11, 5, 3).minus({ hour: 2 }); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); d = d.minus({ hour: 1 }); expect(d.hour).toBe(1); expect(d.offset).toBe(-4 * 60); }); test("Changing a calendar date to land on a hole bumps forward", () => { let d = local(2017, 3, 11, 2).plus({ day: 1 }); expect(d.hour).toBe(3); expect(d.offset).toBe(-4 * 60); d = local(2017, 3, 13, 2).minus({ day: 1 }); expect(d.hour).toBe(3); expect(d.offset).toBe(-4 * 60); }); test("Changing a calendar date to land on an ambiguous time chooses the closest one", () => { let d = local(2017, 11, 4, 1).plus({ day: 1 }); expect(d.hour).toBe(1); expect(d.offset).toBe(-4 * 60); d = local(2017, 11, 6, 1).minus({ day: 1 }); expect(d.hour).toBe(1); expect(d.offset).toBe(-5 * 60); }); test("Start of a 0:00->1:00 DST day is 1:00", () => { const d = DateTime.fromObject( { year: 2017, month: 10, day: 15, }, { zone: "America/Sao_Paulo", } ).startOf("day"); expect(d.day).toBe(15); expect(d.hour).toBe(1); expect(d.minute).toBe(0); expect(d.second).toBe(0); }); test("End of a 0:00->1:00 DST day is 23:59", () => { const d = DateTime.fromObject( { year: 2017, month: 10, day: 15, }, { zone: "America/Sao_Paulo", } ).endOf("day"); expect(d.day).toBe(15); expect(d.hour).toBe(23); expect(d.minute).toBe(59); expect(d.second).toBe(59); }); }); } describe("DateTime.local() with offset caching", () => { const edtTs = 1495653314000; // May 24, 2017 15:15:14 -0400 const estTs = 1484456400000; // Jan 15, 2017 00:00 -0500 const edtDate = [2017, 5, 24, 15, 15, 14, 0]; const estDate = [2017, 1, 15, 0, 0, 0, 0]; const timestamps = { EDT: edtTs, EST: estTs }; const dates = { EDT: edtDate, EST: estDate }; const zoneObj = { zone: "America/New_York" }; for (const [cacheName, cacheTs] of Object.entries(timestamps)) { for (const [nowName, nowTs] of Object.entries(timestamps)) { for (const [dateName, date] of Object.entries(dates)) { test(`cache = ${cacheName}, now = ${nowName}, date = ${dateName}`, () => { const oldSettings = Settings.now; try { Settings.now = () => cacheTs; Settings.resetCaches(); // load cache DateTime.local(2020, 1, 1, 0, zoneObj); Settings.now = () => nowTs; const dt = DateTime.local(...date, zoneObj); expect(dt.toMillis()).toBe(timestamps[dateName]); expect(dt.year).toBe(date[0]); expect(dt.month).toBe(date[1]); expect(dt.day).toBe(date[2]); expect(dt.hour).toBe(date[3]); expect(dt.minute).toBe(date[4]); expect(dt.second).toBe(date[5]); } finally { Settings.now = oldSettings; } }); } } } }); moment-luxon-93c85a3/test/datetime/equality.test.js000066400000000000000000000025331477254173100224570ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; test("equals self", () => { const l = DateTime.now(); expect(l.equals(l)).toBe(true); }); test("equals identically constructed", () => { const l1 = DateTime.local(2017, 5, 15), l2 = DateTime.local(2017, 5, 15); expect(l1.equals(l2)).toBe(true); }); test("does not equal a different zone", () => { const l1 = DateTime.local(2017, 5, 15).setZone("America/New_York"), l2 = DateTime.local(2017, 5, 15).setZone("America/Los_Angeles"); expect(l1.equals(l2)).toBe(false); }); test("does not equal an invalid DateTime", () => { const l1 = DateTime.local(2017, 5, 15), l2 = DateTime.invalid("whatever"); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different locale", () => { const l1 = DateTime.local(2017, 5, 15), l2 = DateTime.local(2017, 5, 15).setLocale("fr"); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different numbering system", () => { const l1 = DateTime.local(2017, 5, 15), l2 = DateTime.local(2017, 5, 15).reconfigure({ numberingSystem: "beng" }); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different output calendar", () => { const l1 = DateTime.local(2017, 5, 15), l2 = DateTime.local(2017, 5, 15).reconfigure({ outputCalendar: "islamic" }); expect(l1.equals(l2)).toBe(false); }); moment-luxon-93c85a3/test/datetime/format.test.js000066400000000000000000000463301477254173100221150ustar00rootroot00000000000000/* global test expect */ import { DateTime, Zone, FixedOffsetZone } from "../../src/luxon"; const dtMaker = () => DateTime.fromObject( { year: 1982, month: 5, day: 25, hour: 9, minute: 23, second: 54, millisecond: 123, }, { zone: "utc", } ), dt = dtMaker(), invalid = DateTime.invalid("because"); class CustomZone extends Zone { constructor(name, offset) { super(); this._name = name; this._offset = offset; } get isUniversal() { return true; } get isValid() { return true; } get name() { return this._name; } get type() { return "custom"; } equals(zone) { return zone instanceof CustomZone && zone._name === this._name && zone._offset === this._offset; } offset(_ms) { return this._offset; } offsetName(_ms, { format }) { if (format === "short") { return this._name.substring(0, 4); } else { return this._name; } } formatOffset(...args) { return FixedOffsetZone.prototype.formatOffset(...args); } } //------ // #toJSON() //------ test("DateTime#toJSON() just does toISO", () => { expect(dt.toJSON()).toBe("1982-05-25T09:23:54.123Z"); }); //------ // #toISO() //------ test("DateTime#toISO() shows 'Z' for UTC", () => { expect(dt.toISO()).toBe("1982-05-25T09:23:54.123Z"); }); test("DateTime#toISO() shows the offset, unless explicitly asked", () => { const offsetted = dt.toUTC(-6 * 60); expect(offsetted.toISO()).toBe("1982-05-25T03:23:54.123-06:00"); expect(offsetted.toISO({ includeOffset: false })).toBe("1982-05-25T03:23:54.123"); }); test("DateTime#toISO() supports the 'basic' format", () => { expect(dt.toISO({ format: "basic" })).toBe("19820525T092354.123Z"); }); test("DateTime#toISO() suppresses [milli]seconds", () => { const noZeroMilliseconds = { suppressMilliseconds: true }; expect(dt.toISO(noZeroMilliseconds)).toBe("1982-05-25T09:23:54.123Z"); expect(dt.set({ millisecond: 0 }).toISO(noZeroMilliseconds)).toBe("1982-05-25T09:23:54Z"); const noZeroSeconds = { suppressSeconds: true, suppressMilliseconds: true }; expect(dt.set({ millisecond: 0 }).toISO(noZeroSeconds)).toBe("1982-05-25T09:23:54Z"); expect(dt.set({ seconds: 0, milliseconds: 0 }).toISO(noZeroSeconds)).toBe("1982-05-25T09:23Z"); const suppressOnlySeconds = { suppressSeconds: true }; expect(dt.set({ seconds: 0 }).toISO(suppressOnlySeconds)).toBe("1982-05-25T09:23:00.123Z"); expect(dt.set({ seconds: 0, milliseconds: 0 }).toISO(suppressOnlySeconds)).toBe( "1982-05-25T09:23Z" ); }); test("DateTime#toISO() returns null for invalid DateTimes", () => { expect(invalid.toISO()).toBe(null); }); // #724, Firefox specific issue, offset prints as '-05:50.60000000000002' test("DateTime#toISO() rounds fractional timezone minute offsets", () => { expect(DateTime.fromMillis(-62090696591000).setZone("America/Chicago").toISO()).toBe( "0002-06-04T10:26:13.000-05:50" ); }); test("DateTime#toISO() handles long gregorian format", () => { const negativeYear = dt.set({ year: 12345 }); expect(negativeYear.toISO()).toBe("+012345-05-25T09:23:54.123Z"); }); test("DateTime#toISO() handles negative years", () => { const negativeYear = dt.set({ year: -12345 }); expect(negativeYear.toISO()).toBe("-012345-05-25T09:23:54.123Z"); }); test("DateTime#toISO() default to Z when timezone is 00:00", () => { const negativeYear = dt.setZone("utc"); expect(negativeYear.toISO()).toBe("1982-05-25T09:23:54.123Z"); }); test("DateTime#toISO() renders 00:00 for non-offset but non utc datetimes", () => { const negativeYear = dt.setZone("Africa/Abidjan"); expect(negativeYear.toISO()).toBe("1982-05-25T09:23:54.123+00:00"); }); test("DateTime#toISO() supports the extendedZone option", () => { let zoned = dt.setZone("America/Chicago"); expect(zoned.toISO({ extendedZone: true })).toBe( "1982-05-25T04:23:54.123-05:00[America/Chicago]" ); expect(zoned.toISO({ includeOffset: false, extendedZone: true })).toBe( "1982-05-25T04:23:54.123[America/Chicago]" ); zoned = dt.setZone("UTC+6"); expect(zoned.toISO({ extendedZone: true })).toBe("1982-05-25T15:23:54.123+06:00[Etc/GMT-6]"); expect(zoned.toISO({ includeOffset: false, extendedZone: true })).toBe( "1982-05-25T15:23:54.123[Etc/GMT-6]" ); zoned = dt.setZone("UTC"); // note no Z expect(zoned.toISO({ extendedZone: true })).toBe("1982-05-25T09:23:54.123+00:00[Etc/UTC]"); expect(zoned.toISO({ includeOffset: false, extendedZone: true })).toBe( "1982-05-25T09:23:54.123[Etc/UTC]" ); }); //------ // #toISODate() //------ test("DateTime#toISODate() returns ISO 8601 date", () => { expect(dt.toISODate()).toBe("1982-05-25"); }); test("DateTime#toISODate() is local to the zone", () => { expect(dt.toUTC(-10 * 60).toISODate()).toBe("1982-05-24"); }); test("DateTime#toISODate() can output the basic format", () => { expect(dt.toISODate({ format: "basic" })).toBe("19820525"); }); test("DateTime#toISODate() returns null for invalid DateTimes", () => { expect(invalid.toISODate()).toBe(null); }); test("DateTime#toISODate() returns ISO 8601 date in format [±YYYYY]", () => { expect( DateTime.fromObject({ year: 118040, month: 5, day: 25 }, { zone: "utc" }).toISODate() ).toBe("+118040-05-25"); expect( DateTime.fromObject({ year: -118040, month: 5, day: 25 }, { zone: "utc" }).toISODate() ).toBe("-118040-05-25"); }); test("DateTime#toISODate() correctly pads negative years", () => { expect(DateTime.fromObject({ year: -1, month: 1, day: 1 }, { zone: "utc" }).toISODate()).toBe( "-000001-01-01" ); expect(DateTime.fromObject({ year: -10, month: 1, day: 1 }, { zone: "utc" }).toISODate()).toBe( "-000010-01-01" ); }); //------ // #toISOWeekDate() //------ test("DateTime#toISOWeekDate() returns ISO 8601 date", () => { expect(dt.toISOWeekDate()).toBe("1982-W21-2"); }); test("DateTime#toISOWeekDate() returns null for invalid DateTimes", () => { expect(invalid.toISOWeekDate()).toBe(null); }); //------ // #toISOTime() //------ test("DateTime#toISOTime() returns an ISO 8601 date", () => { expect(dt.toISOTime()).toBe("09:23:54.123Z"); }); test("DateTime#toISOTime() won't suppress seconds by default", () => { expect(dt.startOf("minute").toISOTime()).toBe("09:23:00.000Z"); }); test("DateTime#toISOTime() won't suppress milliseconds by default", () => { expect(dt.startOf("second").toISOTime()).toBe("09:23:54.000Z"); }); test("DateTime#toISOTime({suppressMilliseconds: true}) won't suppress milliseconds if they're nonzero", () => { expect(dt.toISOTime({ suppressMilliseconds: true })).toBe("09:23:54.123Z"); }); test("DateTime#toISOTime({suppressMilliseconds: true}) will suppress milliseconds if they're zero", () => { expect(dt.set({ millisecond: 0 }).toISOTime({ suppressMilliseconds: true })).toBe("09:23:54Z"); }); test("DateTime#toISOTime({suppressSeconds: true}) won't suppress milliseconds if they're nonzero", () => { expect(dt.toISOTime({ suppressSeconds: true })).toBe("09:23:54.123Z"); }); test("DateTime#toISOTime({suppressSeconds: true}) will suppress milliseconds if they're zero", () => { expect(dt.set({ second: 0, millisecond: 0 }).toISOTime({ suppressSeconds: true })).toBe("09:23Z"); }); test("DateTime#toISOTime() handles other offsets", () => { expect(dt.setZone("America/New_York").toISOTime()).toBe("05:23:54.123-04:00"); }); test("DateTime#toISOTime() can omit the offset", () => { expect(dt.toISOTime({ includeOffset: false })).toBe("09:23:54.123"); }); test("DateTime#toISOTime() can output the basic format", () => { expect(dt.toISOTime({ format: "basic" })).toBe("092354.123Z"); const dt2 = dt.set({ second: 0, millisecond: 0 }); expect(dt2.toISOTime({ format: "basic", suppressMilliseconds: true })).toBe("092300Z"); expect(dt2.toISOTime({ format: "basic", suppressSeconds: true })).toBe("0923Z"); }); test("DateTime#toISOTime can include the prefix", () => { expect(dt.toISOTime({ includePrefix: true })).toBe("T09:23:54.123Z"); expect(dt.toISOTime({ format: "basic", includePrefix: true })).toBe("T092354.123Z"); }); test("DateTime#toISOTime() returns null for invalid DateTimes", () => { expect(invalid.toISOTime()).toBe(null); }); //------ // #toRFC2822() //------ test("DateTime#toRFC2822() returns an RFC 2822 date", () => { expect(dt.toUTC().toRFC2822()).toBe("Tue, 25 May 1982 09:23:54 +0000"); expect(dt.setZone("America/New_York").toRFC2822()).toBe("Tue, 25 May 1982 05:23:54 -0400"); expect(dt.set({ hour: 15 }).toRFC2822()).toBe("Tue, 25 May 1982 15:23:54 +0000"); }); test("DateTime#toRFC2822() returns null for invalid DateTimes", () => { expect(invalid.toRFC2822()).toBe(null); }); //------ // #toHTTP() //------ test("DateTime#toHTTP() returns an RFC 1123 date", () => { expect(dt.toUTC().toHTTP()).toBe("Tue, 25 May 1982 09:23:54 GMT"); expect(dt.setZone("America/New_York").toHTTP()).toBe("Tue, 25 May 1982 09:23:54 GMT"); expect(dt.plus({ hours: 10 }).toHTTP()).toBe("Tue, 25 May 1982 19:23:54 GMT"); }); test("DateTime#toHTTP() returns null for invalid DateTimes", () => { expect(invalid.toHTTP()).toBe(null); }); //------ // #toSQLDate() //------ test("DateTime#toSQLDate() returns SQL date", () => { expect(dt.toUTC().toSQLDate()).toBe("1982-05-25"); expect(dt.setZone("America/New_York").toSQLDate()).toBe("1982-05-25"); }); test("DateTime#toSQLDate() returns null for invalid DateTimes", () => { expect(invalid.toSQLDate()).toBe(null); }); //------ // #toSQLTime() //------ test("DateTime#toSQLTime() returns SQL time", () => { expect(dt.toUTC().toSQLTime()).toBe("09:23:54.123 Z"); expect(dt.setZone("America/New_York").toSQLTime()).toBe("05:23:54.123 -04:00"); }); test("DateTime#toSQLTime() accepts an includeOffset option", () => { expect(dt.toUTC().toSQLTime({ includeOffset: false })).toBe("09:23:54.123"); expect(dt.setZone("America/New_York").toSQLTime({ includeOffset: false })).toBe("05:23:54.123"); }); test("DateTime#toSQLTime() accepts an includeOffsetSpace option", () => { expect(dt.setZone("America/New_York").toSQLTime({ includeOffsetSpace: false })).toBe( "05:23:54.123-04:00" ); }); test("DateTime#toSQLTime() accepts an includeZone option", () => { expect(dt.toUTC().toSQLTime({ includeZone: true })).toBe("09:23:54.123 UTC"); expect(dt.setZone("America/New_York").toSQLTime({ includeZone: true })).toBe( "05:23:54.123 America/New_York" ); }); test("DateTime#toSQLTime() returns null for invalid DateTimes", () => { expect(invalid.toSQLTime()).toBe(null); }); //------ // #toSQL() //------ test("DateTime#toSQL() returns SQL date time", () => { expect(dt.toUTC().toSQL()).toBe("1982-05-25 09:23:54.123 Z"); expect(dt.setZone("America/New_York").toSQL()).toBe("1982-05-25 05:23:54.123 -04:00"); }); test("DateTime#toSQL() accepts space option", () => { expect(dt.setZone("America/New_York").toSQL({ includeOffsetSpace: false })).toBe( "1982-05-25 05:23:54.123-04:00" ); }); test("DateTime#toSQL() accepts an includeOffset option", () => { expect(dt.toUTC().toSQL({ includeOffset: false })).toBe("1982-05-25 09:23:54.123"); expect(dt.setZone("America/New_York").toSQL({ includeOffset: false })).toBe( "1982-05-25 05:23:54.123" ); }); test("DateTime#toSQL() accepts an includeZone option", () => { expect(dt.toUTC().toSQL({ includeZone: true })).toBe("1982-05-25 09:23:54.123 UTC"); expect(dt.setZone("America/New_York").toSQL({ includeZone: true })).toBe( "1982-05-25 05:23:54.123 America/New_York" ); }); test("DateTime#toSQL() returns null for invalid DateTimes", () => { expect(invalid.toSQL()).toBe(null); }); //------ // #toString() //------- test("DateTime#toString() returns the ISO time", () => { expect(dt.toUTC(-6 * 60).toString()).toBe("1982-05-25T03:23:54.123-06:00"); }); test("DateTime#toString() returns something different for invalid DateTimes", () => { expect(invalid.toString()).toBe("Invalid DateTime"); }); //------ // #toLocaleString() //------- test("DateTime#toLocaleString returns a sensible string by default", () => { expect(dt.reconfigure({ locale: "en-US" }).toLocaleString()).toBe("5/25/1982"); }); test("DateTime#toLocaleString lets the locale set the numbering system", () => { expect(dt.reconfigure({ locale: "ja-JP" }).toLocaleString({ hour: "numeric" })).toBe("9時"); }); test("DateTime#toLocaleString accepts locale settings from the dateTime", () => { expect(dt.reconfigure({ locale: "be" }).toLocaleString()).toBe("25.5.1982"); }); test("DateTime#toLocaleString accepts numbering system settings from the dateTime", () => { expect(dt.reconfigure({ numberingSystem: "beng" }).toLocaleString()).toBe("৫/২৫/১৯৮২"); }); test("DateTime#toLocaleString accepts output calendar settings from the dateTime", () => { expect(dt.reconfigure({ outputCalendar: "islamic" }).toLocaleString()).toBe("8/2/1402 AH"); }); test("DateTime#toLocaleString accepts options to the formatter", () => { expect(dt.toLocaleString({ weekday: "short" }).indexOf("Tue") >= 0).toBeTruthy(); }); test("DateTime#toLocaleString can override the dateTime's locale", () => { expect(dt.reconfigure({ locale: "be" }).toLocaleString({}, { locale: "fr" })).toBe("25/05/1982"); }); test("DateTime#toLocaleString can override the dateTime's numbering system", () => { expect( dt.reconfigure({ numberingSystem: "beng" }).toLocaleString({ numberingSystem: "mong" }) ).toBe("᠕/᠒᠕/᠑᠙᠘᠒"); }); test("DateTime#toLocaleString can override the dateTime's output calendar", () => { expect( dt.reconfigure({ outputCalendar: "islamic" }).toLocaleString({}, { outputCalendar: "coptic" }) ).toBe("9/17/1698 ERA1"); }); test("DateTime#toLocaleString() returns something different for invalid DateTimes", () => { expect(invalid.toLocaleString()).toBe("Invalid DateTime"); }); test("DateTime#toLocaleString() shows things in the right IANA zone", () => { expect(dt.setZone("America/New_York").toLocaleString(DateTime.DATETIME_SHORT)).toBe( "5/25/1982, 5:23 AM" ); }); test("DateTime#toLocaleString() shows things in the right fixed-offset zone", () => { expect(dt.setZone("UTC-8").toLocaleString(DateTime.DATETIME_SHORT)).toBe("5/25/1982, 1:23 AM"); }); test("DateTime#toLocaleString() shows things in the right fixed-offset zone when showing the zone", () => { expect(dt.setZone("UTC-8").toLocaleString(DateTime.DATETIME_FULL)).toBe( "May 25, 1982 at 1:23 AM GMT-8" ); }); test("DateTime#toLocaleString() shows things with UTC if fixed-offset zone with 0 offset is used", () => { expect(dt.setZone("UTC").toLocaleString(DateTime.DATETIME_FULL)).toBe( "May 25, 1982 at 9:23 AM UTC" ); }); test("DateTime#toLocaleString() does the best it can with unsupported fixed-offset zone when showing the zone", () => { expect(dt.setZone("UTC+4:30").toLocaleString(DateTime.DATETIME_FULL)).toBe( "May 25, 1982 at 1:53\u202FPM UTC+4:30" ); }); test("DateTime#toLocaleString() does the best it can with unsupported fixed-offset zone with timeStyle full", () => { expect(dt.setZone("UTC+4:30").toLocaleString({ timeStyle: "full" })).toBe( "1:53:54\u202FPM UTC+4:30" ); }); test("DateTime#toLocaleString() shows things in the right custom zone", () => { expect(dt.setZone(new CustomZone("CUSTOM", 30)).toLocaleString(DateTime.DATETIME_SHORT)).toBe( "5/25/1982, 9:53\u202FAM" ); }); test("DateTime#toLocaleString() shows things in the right custom zone when showing the zone", () => { expect(dt.setZone(new CustomZone("CUSTOM", 30)).toLocaleString(DateTime.DATETIME_FULL)).toBe( "May 25, 1982 at 9:53\u202FAM CUST" ); }); test("DateTime#toLocaleString() shows things in the right custom zone with timeStyle full", () => { expect(dt.setZone(new CustomZone("CUSTOM", 30)).toLocaleString({ timeStyle: "full" })).toBe( "9:53:54\u202FAM CUSTOM" ); }); test("DateTime#toLocaleString uses locale-appropriate time formats", () => { expect(dt.reconfigure({ locale: "en-US" }).toLocaleString(DateTime.TIME_SIMPLE)).toBe("9:23 AM"); expect(dt.reconfigure({ locale: "en-US" }).toLocaleString(DateTime.TIME_24_SIMPLE)).toBe("09:23"); // France has 24-hour time by default expect(dt.reconfigure({ locale: "fr" }).toLocaleString(DateTime.TIME_SIMPLE)).toBe("09:23"); expect(dt.reconfigure({ locale: "fr" }).toLocaleString(DateTime.TIME_24_SIMPLE)).toBe("09:23"); // For whatever reason, Spain doesn't prefix with "0" expect(dt.reconfigure({ locale: "es" }).toLocaleString(DateTime.TIME_SIMPLE)).toBe("9:23"); expect(dt.reconfigure({ locale: "es" }).toLocaleString(DateTime.TIME_24_SIMPLE)).toBe("9:23"); }); test("DateTime#toLocaleString() respects language tags", () => { expect(dt.reconfigure({ locale: "en-US-u-hc-h23" }).toLocaleString(DateTime.TIME_SIMPLE)).toBe( "09:23" ); }); test("DateTime#toLocaleString() accepts a zone even when the zone is set", () => { expect( dt.toLocaleString({ hour: "numeric", minute: "numeric", timeZoneName: "short", timeZone: "America/Los_Angeles", }) ).toBe("2:23 AM PDT"); }); //------ // #resolvedLocaleOpts() //------ test("DateTime#resolvedLocaleOpts returns a thing", () => { const res = DateTime.now().resolvedLocaleOptions(); expect(res.outputCalendar).toBeDefined(); expect(res.locale).toBeDefined(); expect(res.numberingSystem).toBeDefined(); }); test("DateTime#resolvedLocaleOpts reflects changes to the locale", () => { const res = DateTime.now() .reconfigure({ locale: "be", numberingSystem: "mong", outputCalendar: "coptic", }) .resolvedLocaleOptions(); expect(res.locale).toBe("be-u-ca-coptic-nu-mong"); expect(res.outputCalendar).toBe("coptic"); expect(res.numberingSystem).toBe("mong"); }); test("DateTime#resolvedLocaleOpts can override with options", () => { const res = DateTime.now().resolvedLocaleOptions({ locale: "be", numberingSystem: "mong", outputCalendar: "coptic", }); expect(res.locale).toBe("be-u-ca-coptic-nu-mong"); expect(res.outputCalendar).toBe("coptic"); expect(res.numberingSystem).toBe("mong"); }); //------ // #toLocaleParts() //------ test("DateTime#toLocaleParts returns a en-US by default", () => { expect(dt.reconfigure({ locale: "en-US" }).toLocaleParts()).toEqual([ { type: "month", value: "5" }, { type: "literal", value: "/" }, { type: "day", value: "25" }, { type: "literal", value: "/" }, { type: "year", value: "1982" }, ]); }); test("DateTime#toLocaleParts accepts locale settings from the dateTime", () => { expect(dt.reconfigure({ locale: "be" }).toLocaleParts()).toEqual([ { type: "day", value: "25" }, { type: "literal", value: "." }, { type: "month", value: "5" }, { type: "literal", value: "." }, { type: "year", value: "1982" }, ]); }); test("DateTime#toLocaleParts can override the dateTime's locale", () => { expect(dt.reconfigure({ locale: "be" }).toLocaleParts({ locale: "fr" })).toEqual([ { type: "day", value: "25" }, { type: "literal", value: "/" }, { type: "month", value: "05" }, { type: "literal", value: "/" }, { type: "year", value: "1982" }, ]); }); test("DateTime#toLocaleParts accepts date formatting options", () => { expect(dt.toLocaleParts(DateTime.TIME_24_SIMPLE)).toEqual([ { type: "hour", value: "09" }, { type: "literal", value: ":" }, { type: "minute", value: "23" }, ]); }); test("DateTime#toLocaleParts returns empty for invalid DateTimes", () => { expect(invalid.toLocaleParts()).toEqual([]); }); moment-luxon-93c85a3/test/datetime/getters.test.js000066400000000000000000000132251477254173100222770ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; import Settings from "../../src/settings"; const dateTime = DateTime.fromJSDate(new Date(1982, 4, 25, 9, 23, 54, 123)), utc = DateTime.fromMillis(Date.UTC(1982, 4, 25, 9, 23, 54, 123)).toUTC(), inv = DateTime.invalid("I said so"); //------ // year/month/day/hour/minute/second/millisecond //------ test("DateTime#year returns the year", () => { expect(dateTime.year).toBe(1982); expect(utc.year).toBe(1982); expect(inv.year).toBeFalsy(); }); test("DateTime#month returns the (1-indexed) month", () => { expect(dateTime.month).toBe(5); expect(utc.month).toBe(5); expect(inv.month).toBeFalsy(); }); test("DateTime#day returns the day", () => { expect(dateTime.day).toBe(25); expect(utc.day).toBe(25); expect(inv.day).toBeFalsy(); }); test("DateTime#hour returns the hour", () => { expect(dateTime.hour).toBe(9); expect(utc.hour).toBe(9); expect(inv.hour).toBeFalsy(); }); test("DateTime#minute returns the minute", () => { expect(dateTime.minute).toBe(23); expect(utc.minute).toBe(23); expect(inv.minute).toBeFalsy(); }); test("DateTime#second returns the second", () => { expect(dateTime.second).toBe(54); expect(utc.second).toBe(54); expect(inv.second).toBeFalsy(); }); test("DateTime#millisecond returns the millisecond", () => { expect(dateTime.millisecond).toBe(123); expect(utc.millisecond).toBe(123); expect(inv.millisecond).toBeFalsy(); }); //------ // weekYear/weekNumber/weekday //------ test("DateTime#weekYear returns the weekYear", () => { expect(dateTime.weekYear).toBe(1982); // test again bc caching expect(dateTime.weekYear).toBe(1982); }); test("DateTime#weekNumber returns the weekNumber", () => { expect(dateTime.weekNumber).toBe(21); // test again bc caching expect(dateTime.weekNumber).toBe(21); }); test("DateTime#weekday returns the weekday", () => { expect(dateTime.weekday).toBe(2); // test again bc caching expect(dateTime.weekday).toBe(2); }); test("DateTime#weekday returns the weekday for older dates", () => { const dt = DateTime.fromObject({ year: 43, month: 4, day: 4 }); expect(dt.weekday).toBe(6); }); //------ // weekdayShort/weekdayLong //------ test("DateTime#weekdayShort returns the short human readable weekday for en-US locale", () => { expect(dateTime.setLocale("en-US").weekdayShort).toBe("Tue"); }); test("DateTime#weekdayLong returns the human readable weekday for en-US locale", () => { expect(dateTime.setLocale("en-US").weekdayLong).toBe("Tuesday"); }); test("DateTime#weekdayShort returns the short human readable weekday for fr locale", () => { expect(dateTime.setLocale("fr").weekdayShort).toBe("mar."); }); test("DateTime#weekdayLong returns the human readable weekday for fr locale", () => { expect(dateTime.setLocale("fr").weekdayLong).toBe("mardi"); }); test("DateTime#weekdayShort returns null for invalid DateTimes", () => { expect(inv.weekdayShort).toBe(null); }); test("DateTime#weekdayLong returns null for invalid DateTimes", () => { expect(inv.weekdayLong).toBe(null); }); //------ // monthShort/monthLong //------ test("DateTime#monthShort returns the short human readable month", () => { expect(dateTime.setLocale("en-US").monthShort).toBe("May"); }); test("DateTime#monthLong returns the human readable month", () => { expect(dateTime.setLocale("en-US").monthLong).toBe("May"); }); test("DateTime#monthShort returns the short human readable month", () => { expect(dateTime.minus({ months: 1 }).setLocale("en-US").monthShort).toBe("Apr"); }); test("DateTime#monthLong returns the human readable month", () => { expect(dateTime.minus({ months: 1 }).setLocale("en-US").monthLong).toBe("April"); }); test("DateTime#monthShort returns the short human readable month for fr locale", () => { expect(dateTime.minus({ months: 1 }).setLocale("fr").monthShort).toBe("avr."); }); test("DateTime#monthLong returns the human readable month for fr locale", () => { expect(dateTime.minus({ months: 1 }).setLocale("fr").monthLong).toBe("avril"); }); test("DateTime#monthLong returns null for invalid DateTimes", () => { expect(inv.monthLong).toBe(null); }); test("DateTime#monthShort returns null for invalid DateTimes", () => { expect(inv.monthShort).toBe(null); }); //------ // ordinal //------ test("DateTime#ordinal returns the ordinal", () => { expect(dateTime.ordinal).toBe(145); }); test("DateTime#ordinal returns NaN for invalid DateTimes", () => { expect(inv.ordinal).toBeFalsy(); }); //------ // get //------ test("DateTime#get can retrieve any unit", () => { expect(dateTime.get("ordinal")).toBe(145); expect(dateTime.get("year")).toBe(1982); expect(dateTime.get("weekNumber")).toBe(21); }); test("DateTime#get returns undefined for invalid units", () => { expect(dateTime.get("plurp")).toBeUndefined(); }); //------ // locale //------ test("DateTime#locale returns the locale", () => { const dt = DateTime.now().reconfigure({ locale: "be" }); expect(dt.locale).toBe("be"); }); //------ // zone/zoneName //------ test("DateTime#zone returns the time zone", () => { expect(dateTime.zone).toBe(Settings.defaultZone); }); test("DateTime#zoneName returns the name of the time zone", () => { expect(dateTime.zoneName).toBe(Settings.defaultZone.name); }); //------ // Misc //------ test("Invalid DateTimes have unhelpful getters", () => { const i = DateTime.invalid("because"); expect(i.year).toBeFalsy(); expect(i.month).toBeFalsy(); expect(i.day).toBeFalsy(); expect(i.hour).toBeFalsy(); expect(i.minute).toBeFalsy(); expect(i.second).toBeFalsy(); expect(i.millisecond).toBeFalsy(); expect(i.weekYear).toBeFalsy(); expect(i.weekNumber).toBeFalsy(); expect(i.weekday).toBeFalsy(); }); moment-luxon-93c85a3/test/datetime/info.test.js000066400000000000000000000015411477254173100215530ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; const dateTime = DateTime.fromJSDate(new Date(1982, 4, 25, 9, 23, 54, 123)); //------ // #toObject //------- test("DateTime#toObject returns the object", () => { expect(dateTime.toObject()).toEqual({ year: 1982, month: 5, day: 25, hour: 9, minute: 23, second: 54, millisecond: 123, }); }); test("DateTime#toObject accepts a flag to return config", () => { expect(dateTime.toObject({ includeConfig: true })).toEqual({ year: 1982, month: 5, day: 25, hour: 9, minute: 23, second: 54, millisecond: 123, locale: "en-US", numberingSystem: null, outputCalendar: null, }); }); test("DateTime#toObject returns an empty object for invalid DateTimes", () => { expect(DateTime.invalid("because").toObject()).toEqual({}); }); moment-luxon-93c85a3/test/datetime/invalid.test.js000066400000000000000000000070241477254173100222500ustar00rootroot00000000000000/* global test expect */ import { DateTime, Settings } from "../../src/luxon"; const organic1 = DateTime.utc(2014, 13, 33), // not an actual Wednesday organic2 = DateTime.fromObject({ weekday: 3, year: 1982, month: 5, day: 25 }, { zone: "UTC" }), organic3 = DateTime.fromObject({ year: 1982, month: 5, day: 25, hour: 27 }), organic4 = DateTime.fromObject( { year: 1982, month: 5, day: 25, hour: 2 }, { zone: "America/Lasers" } ); test("Explicitly invalid dates are invalid", () => { const dt = DateTime.invalid("just because", "seriously, just because"); expect(dt.isValid).toBe(false); expect(dt.invalidReason).toBe("just because"); expect(dt.invalidExplanation).toBe("seriously, just because"); }); test("Invalid creations are invalid", () => { expect(organic1.isValid).toBe(false); expect(organic2.isValid).toBe(false); expect(organic3.isValid).toBe(false); }); test("invalid zones result in invalid dates", () => { expect(DateTime.now().setZone("America/Lasers").isValid).toBe(false); expect(DateTime.now().setZone("America/Lasers").invalidReason).toBe("unsupported zone"); expect(DateTime.local({ zone: "America/Lasers" }).isValid).toBe(false); expect(DateTime.local({ zone: "America/Lasers" }).invalidReason).toBe("unsupported zone"); expect(DateTime.local(1982, { zone: "America/Lasers" }).isValid).toBe(false); expect(DateTime.local(1982, { zone: "America/Lasers" }).invalidReason).toBe("unsupported zone"); expect(DateTime.fromJSDate(new Date(), { zone: "America/Lasers" }).isValid).toBe(false); expect(DateTime.fromJSDate(new Date(), { zone: "America/Lasers" }).invalidReason).toBe( "unsupported zone" ); expect(DateTime.fromMillis(0, { zone: "America/Lasers" }).isValid).toBe(false); expect(DateTime.fromMillis(0, { zone: "America/Lasers" }).invalidReason).toBe("unsupported zone"); }); test("Invalid DateTimes tell you why", () => { expect(organic1.invalidReason).toBe("unit out of range"); expect(organic2.invalidReason).toBe("mismatched weekday"); expect(organic3.invalidReason).toBe("unit out of range"); expect(organic4.invalidReason).toBe("unsupported zone"); }); test("Invalid DateTimes can provide an extended explanation", () => { expect(organic1.invalidExplanation).toBe( "you specified 13 (of type number) as a month, which is invalid" ); expect(organic2.invalidExplanation).toBe( "you can't specify both a weekday of 3 and a date of 1982-05-25T00:00:00.000Z" ); expect(organic3.invalidExplanation).toBe( "you specified 27 (of type number) as a hour, which is invalid" ); }); test("Invalid DateTimes return invalid Dates", () => { expect(organic1.toJSDate().valueOf()).toBe(NaN); }); test("Diffing invalid DateTimes creates invalid Durations", () => { expect(organic1.diff(DateTime.now()).isValid).toBe(false); expect(DateTime.now().diff(organic1).isValid).toBe(false); }); test("throwOnInvalid throws", () => { try { Settings.throwOnInvalid = true; expect(() => DateTime.fromObject({ weekday: 3, year: 1982, month: 5, day: 25, }) ).toThrow(); } finally { Settings.throwOnInvalid = false; } }); test("DateTime.invalid throws if you don't provide a reason", () => { expect(() => DateTime.invalid()).toThrow(); }); test("throwOnInvalid throws if year is too big", () => { try { Settings.throwOnInvalid = true; expect(() => DateTime.fromObject({ year: 9999999, month: 5, day: 25, }) ).toThrow(); } finally { Settings.throwOnInvalid = false; } }); moment-luxon-93c85a3/test/datetime/localeWeek.test.js000066400000000000000000000254501477254173100227000ustar00rootroot00000000000000/* global test expect */ import { DateTime, Info } from "../../src/luxon"; import Helpers from "../helpers"; const withDefaultWeekSettings = Helpers.setUnset("defaultWeekSettings"); //------ // .startOf() with useLocaleWeeks //------ test("startOf(week) with useLocaleWeeks adheres to the locale", () => { const dt = DateTime.fromISO("2023-06-14T13:00:00Z", { setZone: true }); expect( dt.reconfigure({ locale: "de-DE" }).startOf("week", { useLocaleWeeks: true }).toISO() ).toBe("2023-06-12T00:00:00.000Z"); expect( dt.reconfigure({ locale: "en-US" }).startOf("week", { useLocaleWeeks: true }).toISO() ).toBe("2023-06-11T00:00:00.000Z"); }); test("startOf(week) with useLocaleWeeks handles crossing into the previous year", () => { const dt = DateTime.fromISO("2023-01-01T13:00:00Z", { setZone: true }); expect( dt.reconfigure({ locale: "de-DE" }).startOf("week", { useLocaleWeeks: true }).toISO() ).toBe("2022-12-26T00:00:00.000Z"); }); //------ // .endOf() with useLocaleWeeks //------ test("endOf(week) with useLocaleWeeks adheres to the locale", () => { const dt = DateTime.fromISO("2023-06-14T13:00:00Z", { setZone: true }); expect(dt.reconfigure({ locale: "de-DE" }).endOf("week", { useLocaleWeeks: true }).toISO()).toBe( "2023-06-18T23:59:59.999Z" ); expect(dt.reconfigure({ locale: "en-US" }).endOf("week", { useLocaleWeeks: true }).toISO()).toBe( "2023-06-17T23:59:59.999Z" ); }); test("endOf(week) with useLocaleWeeks handles crossing into the next year", () => { const dt = DateTime.fromISO("2022-12-31T13:00:00Z", { setZone: true }); expect(dt.reconfigure({ locale: "de-DE" }).endOf("week", { useLocaleWeeks: true }).toISO()).toBe( "2023-01-01T23:59:59.999Z" ); }); //------ // .hasSame() with useLocaleWeeks //------ test("hasSame(week) with useLocaleWeeks adheres to the locale", () => { const dt1 = DateTime.fromISO("2023-06-11T03:00:00Z", { setZone: true, locale: "en-US" }); const dt2 = DateTime.fromISO("2023-06-14T03:00:00Z", { setZone: true, locale: "en-US" }); expect(dt1.hasSame(dt2, "week", { useLocaleWeeks: true })).toBe(true); const dt3 = DateTime.fromISO("2023-06-14T03:00:00Z", { setZone: true, locale: "en-US" }); const dt4 = DateTime.fromISO("2023-06-18T03:00:00Z", { setZone: true, locale: "en-US" }); expect(dt3.hasSame(dt4, "week", { useLocaleWeeks: true })).toBe(false); }); test("hasSame(week) with useLocaleWeeks ignores the locale of otherDateTime", () => { const dt1 = DateTime.fromISO("2023-06-11T03:00:00Z", { setZone: true, locale: "en-US" }); const dt2 = DateTime.fromISO("2023-06-14T03:00:00Z", { setZone: true, locale: "de-DE" }); expect(dt1.hasSame(dt2, "week", { useLocaleWeeks: true })).toBe(true); expect(dt2.hasSame(dt1, "week", { useLocaleWeeks: true })).toBe(false); }); //------ // .isWeekend //------ const week = [ "2023-07-31T00:00:00Z", // Monday "2023-08-01T00:00:00Z", "2023-08-02T00:00:00Z", "2023-08-03T00:00:00Z", "2023-08-04T00:00:00Z", "2023-08-05T00:00:00Z", "2023-08-06T00:00:00Z", // Sunday ]; test("isWeekend in locale en-US reports Saturday and Sunday as weekend", () => { const dates = week.map( (iso) => DateTime.fromISO(iso, { setZone: true, locale: "en-US" }).isWeekend ); expect(dates).toStrictEqual([false, false, false, false, false, true, true]); }); test("isWeekend in locale he reports Friday and Saturday as weekend", () => { const dates = week.map((iso) => DateTime.fromISO(iso, { setZone: true, locale: "he" }).isWeekend); expect(dates).toStrictEqual([false, false, false, false, true, true, false]); }); //------ // .localWeekNumber / .localWeekYear //------ describe("localWeekNumber in locale de-DE", () => { test("Jan 1 2012 should be week 52, year 2011", () => { const dt = DateTime.fromISO("2012-01-01", { locale: "de-DE" }); expect(dt.localWeekNumber).toBe(52); expect(dt.localWeekYear).toBe(2011); }); test("Jan 2 2012 should be week 1, year 2012", () => { const dt = DateTime.fromISO("2012-01-02", { locale: "de-DE" }); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekYear).toBe(2012); }); test("Jan 8 2012 should be week 1, year 2012", () => { const dt = DateTime.fromISO("2012-01-08", { locale: "de-DE" }); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekYear).toBe(2012); }); test("Jan 9 2012 should be week 2, year 2012", () => { const dt = DateTime.fromISO("2012-01-09", { locale: "de-DE" }); expect(dt.localWeekNumber).toBe(2); expect(dt.localWeekYear).toBe(2012); }); test("Jan 15 2012 should be week 2, year 2012", () => { const dt = DateTime.fromISO("2012-01-15", { locale: "de-DE" }); expect(dt.localWeekNumber).toBe(2); expect(dt.localWeekYear).toBe(2012); }); }); describe("localWeekNumber in locale en-US", () => { test("Jan 1 2012 should be week 1, year 2012", () => { const dt = DateTime.fromISO("2012-01-01", { locale: "en-US" }); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekYear).toBe(2012); }); test("Jan 7 2012 should be week 1, year 2012", () => { const dt = DateTime.fromISO("2012-01-07", { locale: "en-US" }); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekYear).toBe(2012); }); test("Jan 8 2012 should be week 2, year 2012", () => { const dt = DateTime.fromISO("2012-01-08", { locale: "en-US" }); expect(dt.localWeekNumber).toBe(2); expect(dt.localWeekYear).toBe(2012); }); test("Jan 14 2012 should be week 2, year 2012", () => { const dt = DateTime.fromISO("2012-01-14", { locale: "en-US" }); expect(dt.localWeekNumber).toBe(2); expect(dt.localWeekYear).toBe(2012); }); test("Jan 15 2012 should be week 3, year 2012", () => { const dt = DateTime.fromISO("2012-01-15", { locale: "en-US" }); expect(dt.localWeekNumber).toBe(3); expect(dt.localWeekYear).toBe(2012); }); }); //------ // .localWeekday //------ describe("localWeekday in locale en-US", () => { test("Sunday should be reported as the 1st day of the week", () => { const dt = DateTime.fromISO("2023-08-06", { locale: "en-US" }); expect(dt.localWeekday).toBe(1); }); test("Monday should be reported as the 2nd day of the week", () => { const dt = DateTime.fromISO("2023-08-07", { locale: "en-US" }); expect(dt.localWeekday).toBe(2); }); test("Tuesday should be reported as the 3rd day of the week", () => { const dt = DateTime.fromISO("2023-08-08", { locale: "en-US" }); expect(dt.localWeekday).toBe(3); }); test("Wednesday should be reported as the 4th day of the week", () => { const dt = DateTime.fromISO("2023-08-09", { locale: "en-US" }); expect(dt.localWeekday).toBe(4); }); test("Thursday should be reported as the 5th day of the week", () => { const dt = DateTime.fromISO("2023-08-10", { locale: "en-US" }); expect(dt.localWeekday).toBe(5); }); test("Friday should be reported as the 6th day of the week", () => { const dt = DateTime.fromISO("2023-08-11", { locale: "en-US" }); expect(dt.localWeekday).toBe(6); }); test("Saturday should be reported as the 7th day of the week", () => { const dt = DateTime.fromISO("2023-08-12", { locale: "en-US" }); expect(dt.localWeekday).toBe(7); }); }); describe("localWeekday in locale de-DE", () => { test("Monday should be reported as the 1st day of the week", () => { const dt = DateTime.fromISO("2023-08-07", { locale: "de-DE" }); expect(dt.localWeekday).toBe(1); }); test("Tuesday should be reported as the 2nd day of the week", () => { const dt = DateTime.fromISO("2023-08-08", { locale: "de-DE" }); expect(dt.localWeekday).toBe(2); }); test("Wednesday should be reported as the 3rd day of the week", () => { const dt = DateTime.fromISO("2023-08-09", { locale: "de-DE" }); expect(dt.localWeekday).toBe(3); }); test("Thursday should be reported as the 4th day of the week", () => { const dt = DateTime.fromISO("2023-08-10", { locale: "de-DE" }); expect(dt.localWeekday).toBe(4); }); test("Friday should be reported as the 5th day of the week", () => { const dt = DateTime.fromISO("2023-08-11", { locale: "de-DE" }); expect(dt.localWeekday).toBe(5); }); test("Saturday should be reported as the 6th day of the week", () => { const dt = DateTime.fromISO("2023-08-12", { locale: "de-DE" }); expect(dt.localWeekday).toBe(6); }); test("Sunday should be reported as the 7th day of the week", () => { const dt = DateTime.fromISO("2023-08-13", { locale: "de-DE" }); expect(dt.localWeekday).toBe(7); }); }); describe("weeksInLocalWeekYear", () => { test("2018 should have 53 weeks in en-US", () => { expect(DateTime.local(2018, 6, 1, { locale: "en-US" }).weeksInLocalWeekYear).toBe(52); }); test("2022 should have 53 weeks in en-US", () => { expect(DateTime.local(2022, 6, 1, { locale: "en-US" }).weeksInLocalWeekYear).toBe(53); }); test("2022 should have 52 weeks in de-DE", () => { expect(DateTime.local(2022, 6, 1, { locale: "de-DE" }).weeksInLocalWeekYear).toBe(52); }); test("2020 should have 53 weeks in de-DE", () => { expect(DateTime.local(2020, 6, 1, { locale: "de-DE" }).weeksInLocalWeekYear).toBe(53); }); }); describe("Week settings can be overridden", () => { test("Overridden week info should be reported by Info", () => { withDefaultWeekSettings({ firstDay: 3, minimalDays: 5, weekend: [4, 6] }, () => { expect(Info.getStartOfWeek()).toBe(3); expect(Info.getMinimumDaysInFirstWeek()).toBe(5); expect(Info.getWeekendWeekdays()).toEqual([4, 6]); }); }); test("Overridden week info should be reported by DateTime#isWeekend", () => { withDefaultWeekSettings({ firstDay: 7, minimalDays: 1, weekend: [1, 3] }, () => { expect(DateTime.local(2022, 1, 31).isWeekend).toBe(true); expect(DateTime.local(2022, 2, 1).isWeekend).toBe(false); expect(DateTime.local(2022, 2, 2).isWeekend).toBe(true); expect(DateTime.local(2022, 2, 3).isWeekend).toBe(false); expect(DateTime.local(2022, 2, 4).isWeekend).toBe(false); expect(DateTime.local(2022, 2, 5).isWeekend).toBe(false); expect(DateTime.local(2022, 2, 6).isWeekend).toBe(false); }); }); test("Overridden week info should be respected by DateTime accessors", () => { withDefaultWeekSettings({ firstDay: 7, minimalDays: 1, weekend: [6, 7] }, () => { const dt = DateTime.local(2022, 1, 1, { locale: "de-DE" }); expect(dt.localWeekday).toBe(7); expect(dt.localWeekNumber).toBe(1); expect(dt.localWeekYear).toBe(2022); }); }); test("Overridden week info should be respected by DateTime#set", () => { withDefaultWeekSettings({ firstDay: 7, minimalDays: 1, weekend: [6, 7] }, () => { const dt = DateTime.local(2022, 1, 1, { locale: "de-DE" }); const modified = dt.set({ localWeekday: 1 }); expect(modified.year).toBe(2021); expect(modified.month).toBe(12); expect(modified.day).toBe(26); }); }); }); moment-luxon-93c85a3/test/datetime/many.test.js000066400000000000000000000052761477254173100215750ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; //------ // min //------- test("DateTime.min returns the only dateTime if solo", () => { const m = DateTime.min(DateTime.fromJSDate(new Date(1982, 5, 25))); expect(m).toBeTruthy(); expect(m.valueOf()).toBe(DateTime.fromJSDate(new Date(1982, 5, 25)).valueOf()); }); test("DateTime.min returns the min dateTime", () => { const m = DateTime.min( DateTime.fromJSDate(new Date(1982, 4, 25)), DateTime.fromJSDate(new Date(1982, 3, 25)), DateTime.fromJSDate(new Date(1982, 3, 26)) ); expect(m.valueOf()).toBe(DateTime.fromJSDate(new Date(1982, 3, 25)).valueOf()); }); test("DateTime.min returns undefined if no argument", () => { const m = DateTime.min(); expect(m).toBeUndefined(); }); test("DateTime.min is stable", () => { const m = DateTime.min( DateTime.fromJSDate(new Date(1982, 4, 25)), DateTime.fromJSDate(new Date(1982, 3, 25)).reconfigure({ locale: "en-GB" }), DateTime.fromJSDate(new Date(1982, 3, 25)).reconfigure({ locale: "en-US" }) ); expect(m.locale).toBe("en-GB"); }); test("DateTime.min throws if you don't pass it DateTimes", () => { const dt = DateTime.fromJSDate(new Date(1982, 2, 25)); const notADt = "flob"; expect(() => DateTime.min(dt, notADt)).toThrow(); expect(() => DateTime.min(notADt)).toThrow(); expect(() => DateTime.min(notADt, notADt)).toThrow(); }); //------ // max //------- test("DateTime.max returns the only dateTime if solo", () => { const m = DateTime.max(DateTime.fromJSDate(new Date(1982, 5, 25))); expect(m).toBeTruthy(); expect(m.valueOf()).toBe(DateTime.fromJSDate(new Date(1982, 5, 25)).valueOf()); }); test("DateTime.max returns the max dateTime", () => { const m = DateTime.max( DateTime.fromJSDate(new Date(1982, 5, 25)), DateTime.fromJSDate(new Date(1982, 3, 25)), DateTime.fromJSDate(new Date(1982, 3, 26)) ); expect(m.valueOf()).toBe(DateTime.fromJSDate(new Date(1982, 5, 25)).valueOf()); }); test("DateTime.max returns undefined if no argument", () => { const m = DateTime.max(); expect(m).toBeUndefined(); }); test("DateTime.max is stable", () => { const m = DateTime.max( DateTime.fromJSDate(new Date(1982, 2, 25)), DateTime.fromJSDate(new Date(1982, 3, 25)).reconfigure({ locale: "en-GB" }), DateTime.fromJSDate(new Date(1982, 3, 25)).reconfigure({ locale: "en-US" }) ); expect(m.locale).toBe("en-GB"); }); test("DateTime.max throws if you don't pass it DateTimes", () => { const dt = DateTime.fromJSDate(new Date(1982, 2, 25)); const notADt = "flob"; expect(() => DateTime.max(dt, notADt)).toThrow(); expect(() => DateTime.max(notADt)).toThrow(); expect(() => DateTime.max(notADt, notADt)).toThrow(); }); moment-luxon-93c85a3/test/datetime/math.test.js000066400000000000000000000376031477254173100215610ustar00rootroot00000000000000/* global test expect */ import { DateTime, Duration } from "../../src/luxon"; import { casualMatrix } from "../../src/duration"; function createDateTime() { return DateTime.fromObject({ year: 2010, month: 2, day: 3, hour: 4, minute: 5, second: 6, millisecond: 7, }); } //------ // #plus() //------ test("DateTime#plus({ years: 1 }) adds a year", () => { const i = createDateTime().plus({ years: 1 }); expect(i.year).toBe(2011); }); test("DateTime#plus({quarter: 1}) adds a quarter", () => { const i = createDateTime().plus({ quarters: 1 }); expect(i.quarter).toBe(2); expect(i.month).toBe(5); }); test("DateTime#plus({ months: 1 }) at the end of the month", () => { const i = DateTime.fromISO("2018-01-31T10:00"), later = i.plus({ months: 1 }); expect(later.day).toBe(28); expect(later.month).toBe(2); }); test("DateTime#plus({ months: 1 }) at the end of the month in a leap year", () => { const i = DateTime.fromISO("2016-01-31T10:00"), later = i.plus({ months: 1 }); expect(later.day).toBe(29); expect(later.month).toBe(2); }); test("DateTime#plus({ months: 13 }) at the end of the month", () => { const i = DateTime.fromISO("2015-01-31T10:00"), later = i.plus({ months: 13 }); expect(later.day).toBe(29); expect(later.month).toBe(2); expect(later.year).toBe(2016); }); test("DateTime#plus({ days: 1 }) keeps the same time across a DST", () => { const i = DateTime.fromISO("2016-03-12T10:00", { zone: "America/Los_Angeles", }), later = i.plus({ days: 1 }); expect(later.day).toBe(13); expect(later.hour).toBe(10); }); test("DateTime#plus({ hours: 24 }) gains an hour to spring forward", () => { const i = DateTime.fromISO("2016-03-12T10:00", { zone: "America/Los_Angeles", }), later = i.plus({ hours: 24 }); expect(later.day).toBe(13); expect(later.hour).toBe(11); }); // #669 test("DateTime#plus({ days:0, hours: 24 }) gains an hour to spring forward", () => { const i = DateTime.fromISO("2016-03-12T10:00", { zone: "America/Los_Angeles", }), later = i.plus({ days: 0, hours: 24 }); expect(later.day).toBe(13); expect(later.hour).toBe(11); }); test("DateTime#plus(Duration) adds the right amount of time", () => { const i = DateTime.fromISO("2016-03-12T10:13"), later = i.plus(Duration.fromObject({ day: 1, hour: 3, minute: 28 })); expect(later.day).toBe(13); expect(later.hour).toBe(13); expect(later.minute).toBe(41); }); test("DateTime#plus(multiple) adds the right amount of time", () => { const i = DateTime.fromISO("2016-03-12T10:13"), later = i.plus({ days: 1, hours: 3, minutes: 28 }); expect(later.day).toBe(13); expect(later.hour).toBe(13); expect(later.minute).toBe(41); }); test("DateTime#plus maintains invalidity", () => { expect(DateTime.invalid("because").plus({ day: 1 }).isValid).toBe(false); }); test("DateTime#plus works across the 100 barrier", () => { const d = DateTime.fromISO("0099-12-31").plus({ day: 2 }); expect(d.year).toBe(100); expect(d.month).toBe(1); expect(d.day).toBe(2); }); test("DateTime#plus works across the 100 barrier when passing through February", () => { const d = DateTime.fromISO("0099-12-31").plus({ day: 61 }); expect(d.year).toBe(100); expect(d.month).toBe(3); expect(d.day).toBe(2); }); test("DateTime#plus renders invalid when out of max. datetime range using days", () => { const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).plus({ day: 1e8 + 1 }); expect(d.isValid).toBe(false); }); test("DateTime#plus renders invalid when out of max. datetime range using seconds", () => { const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).plus({ second: 1e8 * 24 * 60 * 60 + 1 }); expect(d.isValid).toBe(false); }); test("DateTime#plus renders invalid when out of max. datetime range using IANAZone", () => { const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0) .setZone("America/Los_Angeles") .plus({ second: 1e8 * 24 * 60 * 60 + 1 }); expect(d.isValid).toBe(false); }); test("DateTime#plus handles fractional days", () => { const d = DateTime.fromISO("2016-01-31T10:00"); expect(d.plus({ days: 0.8 })).toEqual(d.plus({ hours: (24 * 4) / 5 })); expect(d.plus({ days: 6.8 })).toEqual(d.plus({ days: 6, hours: (24 * 4) / 5 })); expect(d.plus({ days: 6.8, milliseconds: 17 })).toEqual( d.plus({ days: 6, milliseconds: 0.8 * 24 * 60 * 60 * 1000 + 17 }) ); }); test("DateTime#plus handles fractional large units", () => { const units = ["weeks", "months", "quarters", "years"]; for (const unit of units) { const d = DateTime.fromISO("2016-01-31T10:00"); expect(d.plus({ [unit]: 8.7 })).toEqual( d.plus({ [unit]: 8, milliseconds: Duration.fromObject({ [unit]: 0.7 }).as("milliseconds"), }) ); } }); // #645 test("DateTime#plus supports positive and negative duration units", () => { const d = DateTime.fromISO("2020-01-08T12:34"); expect(d.plus({ months: 1, days: -1 })).toEqual(d.plus({ months: 1 }).plus({ days: -1 })); expect(d.plus({ years: 4, days: -1 })).toEqual(d.plus({ years: 4 }).plus({ days: -1 })); expect(d.plus({ years: 0.5, days: -1.5 })).toEqual(d.plus({ years: 0.5 }).plus({ days: -1.5 })); }); //------ // #minus() //------ test("DateTime#minus({ years: 1 }) subtracts a year", () => { const dt = createDateTime().minus({ years: 1 }); expect(dt.year).toBe(2009); }); test("DateTime#minus({ quarters: 1 }) subtracts a quarter", () => { const dt = createDateTime().minus({ quarters: 1 }); expect(dt.year).toBe(2009); expect(dt.quarter).toBe(4); expect(dt.month).toBe(11); }); test("DateTime#minus({ months: 1 }) at the end of the month", () => { const i = DateTime.fromISO("2018-03-31T10:00"), earlier = i.minus({ months: 1 }); expect(earlier.day).toBe(28); expect(earlier.month).toBe(2); }); test("DateTime#minus({ months: 1 }) at the end of the month in a leap year", () => { const i = DateTime.fromISO("2016-03-31T10:00"), earlier = i.minus({ months: 1 }); expect(earlier.day).toBe(29); expect(earlier.month).toBe(2); }); test("DateTime#minus({ months: 13 }) at the end of the month", () => { const i = DateTime.fromISO("2017-03-31T10:00"), earlier = i.minus({ months: 13 }); expect(earlier.day).toBe(29); expect(earlier.month).toBe(2); expect(earlier.year).toBe(2016); }); test("DateTime#minus maintains invalidity", () => { expect(DateTime.invalid("because").minus({ day: 1 }).isValid).toBe(false); }); test("DateTime#minus works across the 100 barrier", () => { const d = DateTime.fromISO("0100-01-02").minus({ day: 2 }); expect(d.year).toBe(99); expect(d.month).toBe(12); expect(d.day).toBe(31); }); test("DateTime#minus renders invalid when out of max. datetime range using days", () => { const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).minus({ day: 1e8 + 1 }); expect(d.isValid).toBe(false); }); test("DateTime#minus renders invalid when out of max. datetime range using seconds", () => { const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0).minus({ second: 1e8 * 24 * 60 * 60 + 1 }); expect(d.isValid).toBe(false); }); test("DateTime#plus renders invalid when out of max. datetime range using IANAZone", () => { const d = DateTime.utc(1970, 1, 1, 0, 0, 0, 0) .setZone("America/Los_Angeles") .minus({ second: 1e8 * 24 * 60 * 60 + 1 }); expect(d.isValid).toBe(false); }); test("DateTime#minus handles fractional days", () => { const d = DateTime.fromISO("2016-01-31T10:00"); expect(d.minus({ days: 0.8 })).toEqual(d.minus({ hours: (24 * 4) / 5 })); expect(d.minus({ days: 6.8 })).toEqual(d.minus({ days: 6, hours: (24 * 4) / 5 })); expect(d.minus({ days: 6.8, milliseconds: 17 })).toEqual( d.minus({ days: 6, milliseconds: 0.8 * 24 * 60 * 60 * 1000 + 17 }) ); }); test("DateTime#minus handles fractional large units", () => { const units = ["weeks", "months", "quarters", "years"]; for (const unit of units) { const d = DateTime.fromISO("2016-01-31T10:00"); expect(d.minus({ [unit]: 8.7 })).toEqual( d.minus({ [unit]: 8, milliseconds: Duration.fromObject({ [unit]: 0.7 }).as("milliseconds"), }) ); } }); // #645 test("DateTime#minus supports positive and negative duration units", () => { const d = DateTime.fromISO("2020-01-08T12:34"); expect(d.minus({ months: 1, days: -1 })).toEqual(d.minus({ months: 1 }).minus({ days: -1 })); expect(d.minus({ years: 4, days: -1 })).toEqual(d.minus({ years: 4 }).minus({ days: -1 })); expect(d.minus({ years: 0.5, days: -1.5 })).toEqual( d.minus({ years: 0.5 }).minus({ days: -1.5 }) ); }); //------ // #startOf() //------ test("DateTime#startOf('year') goes to the start of the year", () => { const dt = createDateTime().startOf("year"); expect(dt.year).toBe(2010); expect(dt.month).toBe(1); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf('quarter') goes to the start of the quarter", () => { const monthToQuarterStart = (month, quarterStart) => { const dt = DateTime.fromObject({ year: 2017, month, day: 10, hour: 4, minute: 5, second: 6, millisecond: 7, }).startOf("quarter"); expect(dt.year).toBe(2017); expect(dt.month).toBe(quarterStart); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }; monthToQuarterStart(1, 1); monthToQuarterStart(2, 1); monthToQuarterStart(3, 1); monthToQuarterStart(4, 4); monthToQuarterStart(5, 4); monthToQuarterStart(6, 4); monthToQuarterStart(7, 7); monthToQuarterStart(8, 7); monthToQuarterStart(9, 7); monthToQuarterStart(10, 10); monthToQuarterStart(11, 10); monthToQuarterStart(12, 10); }); test("DateTime#startOf('month') goes to the start of the month", () => { const dt = createDateTime().startOf("month"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(1); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf('day') goes to the start of the day", () => { const dt = createDateTime().startOf("day"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf('hour') goes to the start of the hour", () => { const dt = createDateTime().startOf("hour"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(4); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf('minute') goes to the start of the minute", () => { const dt = createDateTime().startOf("minute"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(4); expect(dt.minute).toBe(5); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf('second') goes to the start of the second", () => { const dt = createDateTime().startOf("second"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(4); expect(dt.minute).toBe(5); expect(dt.second).toBe(6); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf('week') goes to the start of the week", () => { // using a different day so that it doesn't end up as the first of the month const dt = DateTime.fromISO("2016-03-12T10:00").startOf("week"); expect(dt.year).toBe(2016); expect(dt.month).toBe(3); expect(dt.day).toBe(7); expect(dt.hour).toBe(0); expect(dt.minute).toBe(0); expect(dt.second).toBe(0); expect(dt.millisecond).toBe(0); }); test("DateTime#startOf maintains invalidity", () => { expect(DateTime.invalid("because").startOf("day").isValid).toBe(false); }); test("DateTime#startOf throws on invalid units", () => { expect(() => DateTime.fromISO("2016-03-12T10:00").startOf("splork")).toThrow(); expect(() => DateTime.fromISO("2016-03-12T10:00").startOf("")).toThrow(); }); //------ // #endOf() //------ test("DateTime#endOf('year') goes to the start of the year", () => { const dt = createDateTime().endOf("year"); expect(dt.year).toBe(2010); expect(dt.month).toBe(12); expect(dt.day).toBe(31); expect(dt.hour).toBe(23); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('quarter') goes to the end of the quarter", () => { const dt = createDateTime().endOf("quarter"); expect(dt.year).toBe(2010); expect(dt.month).toBe(3); expect(dt.day).toBe(31); expect(dt.hour).toBe(23); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('quarter') goes to the end of the quarter in December", () => { const monthToQuarterEnd = (month, endMonth) => { const dt = DateTime.fromObject({ year: 2017, month, day: 10, hour: 4, minute: 5, second: 6, millisecond: 7, }).endOf("quarter"); expect(dt.year).toBe(2017); expect(dt.month).toBe(endMonth); expect(dt.day).toBe(dt.endOf("month").day); expect(dt.hour).toBe(23); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }; monthToQuarterEnd(1, 3); monthToQuarterEnd(2, 3); monthToQuarterEnd(3, 3); monthToQuarterEnd(4, 6); monthToQuarterEnd(5, 6); monthToQuarterEnd(6, 6); monthToQuarterEnd(7, 9); monthToQuarterEnd(8, 9); monthToQuarterEnd(9, 9); monthToQuarterEnd(10, 12); monthToQuarterEnd(11, 12); monthToQuarterEnd(12, 12); }); test("DateTime#endOf('month') goes to the start of the month", () => { const dt = createDateTime().endOf("month"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(28); expect(dt.hour).toBe(23); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('day') goes to the start of the day", () => { const dt = createDateTime().endOf("day"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(23); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('hour') goes to the start of the hour", () => { const dt = createDateTime().endOf("hour"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(4); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('minute') goes to the start of the minute", () => { const dt = createDateTime().endOf("minute"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(4); expect(dt.minute).toBe(5); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('second') goes to the start of the second", () => { const dt = createDateTime().endOf("second"); expect(dt.year).toBe(2010); expect(dt.month).toBe(2); expect(dt.day).toBe(3); expect(dt.hour).toBe(4); expect(dt.minute).toBe(5); expect(dt.second).toBe(6); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf('week') goes to the end of the week", () => { // using a different day so that it doesn't end up as the first of the month const dt = DateTime.fromISO("2016-03-12T10:00").endOf("week"); expect(dt.year).toBe(2016); expect(dt.month).toBe(3); expect(dt.day).toBe(13); expect(dt.hour).toBe(23); expect(dt.minute).toBe(59); expect(dt.second).toBe(59); expect(dt.millisecond).toBe(999); }); test("DateTime#endOf maintains invalidity", () => { expect(DateTime.invalid("because").endOf("day").isValid).toBe(false); }); test("DateTime#endOf throws on invalid units", () => { expect(() => DateTime.fromISO("2016-03-12T10:00").endOf("splork")).toThrow(); }); moment-luxon-93c85a3/test/datetime/misc.test.js000066400000000000000000000104541477254173100215560ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; // you hate to see a class like this, but here we are //------ // #hasSame() //------ test("DateTime#hasSame() can use milliseconds for exact comparisons", () => { const dt = DateTime.now(); expect(dt.hasSame(dt, "millisecond")).toBe(true); expect(dt.hasSame(dt.reconfigure({ locale: "fr" }), "millisecond")).toBe(true); expect(dt.hasSame(dt.plus({ milliseconds: 1 }), "millisecond")).toBe(false); }); test("DateTime#hasSame() checks the unit", () => { const dt = DateTime.now(); expect(dt.hasSame(dt, "day")).toBe(true); expect(dt.hasSame(dt.startOf("day"), "day")).toBe(true); expect(dt.hasSame(dt.plus({ days: 1 }), "days")).toBe(false); }); test("DateTime#hasSame() checks high-order units", () => { const dt1 = DateTime.fromISO("2001-02-03"); const dt2 = DateTime.fromISO("2001-05-03"); expect(dt1.hasSame(dt2, "year")).toBe(true); expect(dt1.hasSame(dt2, "month")).toBe(false); // Even when days are equal, return false when a higher-order unit differs. expect(dt1.hasSame(dt2, "day")).toBe(false); }); // #584 test("DateTime#hasSame() ignores time offsets and is symmetric", () => { const d1 = DateTime.fromISO("2019-10-02T01:02:03.045+03:00", { zone: "Europe/Helsinki", }); const d2 = DateTime.fromISO("2019-10-02T01:02:03.045-05:00", { zone: "America/Chicago", }); expect(d1.hasSame(d2, "day")).toBe(true); expect(d2.hasSame(d1, "day")).toBe(true); expect(d1.hasSame(d2, "hour")).toBe(true); expect(d2.hasSame(d1, "hour")).toBe(true); expect(d1.hasSame(d2, "second")).toBe(true); expect(d2.hasSame(d1, "second")).toBe(true); expect(d1.hasSame(d2, "millisecond")).toBe(true); expect(d2.hasSame(d1, "millisecond")).toBe(true); }); test("DateTime#hasSame() returns false for invalid DateTimes", () => { const dt = DateTime.now(), invalid = DateTime.invalid("because"); expect(dt.hasSame(invalid, "day")).toBe(false); expect(invalid.hasSame(invalid, "day")).toBe(false); expect(invalid.hasSame(dt, "day")).toBe(false); }); //------ // #until() //------ test("DateTime#until() creates an Interval", () => { const dt = DateTime.now(), other = dt.plus({ days: 1 }), i = dt.until(other); expect(i.start).toBe(dt); expect(i.end).toBe(other); }); test("DateTime#until() creates an invalid Interval out of an invalid DateTime", () => { const dt = DateTime.now(), invalid = DateTime.invalid("because"); expect(invalid.until(invalid).isValid).toBe(false); expect(invalid.until(dt).isValid).toBe(false); expect(dt.until(invalid).isValid).toBe(false); }); //------ // #isInLeapYear //------ test("DateTime#isInLeapYear returns the whether the DateTime's year is in a leap year", () => { expect(DateTime.local(2017, 5, 25).isInLeapYear).toBe(false); expect(DateTime.local(2020, 5, 25).isInLeapYear).toBe(true); }); test("DateTime#isInLeapYear returns false for invalid DateTimes", () => { expect(DateTime.invalid("because").isInLeapYear).toBe(false); }); //------ // #daysInYear //------ test("DateTime#daysInYear returns the number of days in the DateTime's year", () => { expect(DateTime.local(2017, 5, 25).daysInYear).toBe(365); expect(DateTime.local(2020, 5, 25).daysInYear).toBe(366); }); test("DateTime#daysInYear returns NaN for invalid DateTimes", () => { expect(DateTime.invalid("because").daysInYear).toBeFalsy(); }); //------ // #daysInMonth //------ test("DateTime#daysInMonth returns the number of days in the DateTime's month", () => { expect(DateTime.local(2017, 3, 10).daysInMonth).toBe(31); expect(DateTime.local(2017, 6, 10).daysInMonth).toBe(30); expect(DateTime.local(2017, 2, 10).daysInMonth).toBe(28); expect(DateTime.local(2020, 2, 10).daysInMonth).toBe(29); }); test("DateTime#daysInMonth returns NaN for invalid DateTimes", () => { expect(DateTime.invalid("because").daysInMonth).toBeFalsy(); }); //------ // #weeksInWeekYear //------ test("DateTime#weeksInWeekYear returns the number of days in the DateTime's year", () => { expect(DateTime.local(2004, 5, 25).weeksInWeekYear).toBe(53); expect(DateTime.local(2017, 5, 25).weeksInWeekYear).toBe(52); expect(DateTime.local(2020, 5, 25).weeksInWeekYear).toBe(53); }); test("DateTime#weeksInWeekYear returns NaN for invalid DateTimes", () => { expect(DateTime.invalid("because").weeksInWeekYear).toBeFalsy(); }); moment-luxon-93c85a3/test/datetime/proto.test.js000066400000000000000000000005141477254173100217620ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; test("DateTime prototype properties should not throw when accessed", () => { const d = DateTime.now(); expect(() => Object.getOwnPropertyNames(Object.getPrototypeOf(d)).forEach( (name) => Object.getPrototypeOf(d)[name] ) ).not.toThrow(); }); moment-luxon-93c85a3/test/datetime/reconfigure.test.js000066400000000000000000000023051477254173100231270ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; const dt = DateTime.fromObject( {}, { locale: "fr", numberingSystem: "beng", outputCalendar: "coptic", } ); //------ // #reconfigure() //------ test("DateTime#reconfigure() sets the locale", () => { const recon = dt.reconfigure({ locale: "it" }); expect(recon.locale).toBe("it"); expect(recon.numberingSystem).toBe("beng"); expect(recon.outputCalendar).toBe("coptic"); }); test("DateTime#reconfigure() sets the outputCalendar", () => { const recon = dt.reconfigure({ outputCalendar: "ethioaa" }); expect(recon.locale).toBe("fr"); expect(recon.numberingSystem).toBe("beng"); expect(recon.outputCalendar).toBe("ethioaa"); }); test("DateTime#reconfigure() sets the numberingSystem", () => { const recon = dt.reconfigure({ numberingSystem: "thai" }); expect(recon.locale).toBe("fr"); expect(recon.numberingSystem).toBe("thai"); expect(recon.outputCalendar).toBe("coptic"); }); test("DateTime#reconfigure() with no arguments no opts", () => { const recon = dt.reconfigure(); expect(recon.locale).toBe("fr"); expect(recon.numberingSystem).toBe("beng"); expect(recon.outputCalendar).toBe("coptic"); }); moment-luxon-93c85a3/test/datetime/regexParse.test.js000066400000000000000000000537151477254173100227370ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; import { withNow } from "../helpers"; //------ // .fromISO //------- test("DateTime.fromISO() parses as local by default", () => { const dt = DateTime.fromISO("2016-05-25T09:08:34.123"); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 9, minute: 8, second: 34, millisecond: 123, }); }); test("DateTime.fromISO() uses the offset provided, but keeps the dateTime as local", () => { const dt = DateTime.fromISO("2016-05-25T09:08:34.123+06:00"); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 3, minute: 8, second: 34, millisecond: 123, }); }); test("DateTime.fromISO() uses the Z if provided, but keeps the dateTime as local", () => { const dt = DateTime.fromISO("2016-05-25T09:08:34.123Z"); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 9, minute: 8, second: 34, millisecond: 123, }); }); test("DateTime.fromISO() optionally adopts the UTC offset provided", () => { let dt = DateTime.fromISO("2016-05-25T09:08:34.123+06:00", { setZone: true }); expect(dt.zone.name).toBe("UTC+6"); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 9, minute: 8, second: 34, millisecond: 123, }); dt = DateTime.fromISO("1983-10-14T13:30Z", { setZone: true }); expect(dt.zone.name).toBe("UTC"); expect(dt.offset).toBe(0); expect(dt.toObject()).toEqual({ year: 1983, month: 10, day: 14, hour: 13, minute: 30, second: 0, millisecond: 0, }); // #580 dt = DateTime.fromISO("2016-05-25T09:08:34.123-00:30", { setZone: true }); expect(dt.zone.name).toBe("UTC-0:30"); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 9, minute: 8, second: 34, millisecond: 123, }); }); test("DateTime.fromISO() can optionally specify a zone", () => { let dt = DateTime.fromISO("2016-05-25T09:08:34.123", { zone: "utc" }); expect(dt.offset).toEqual(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 9, minute: 8, second: 34, millisecond: 123, }); dt = DateTime.fromISO("2016-05-25T09:08:34.123+06:00", { zone: "utc" }); expect(dt.offset).toEqual(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 25, hour: 3, minute: 8, second: 34, millisecond: 123, }); }); const isSame = (s, expected) => expect(DateTime.fromISO(s).toObject()).toEqual(expected); test("DateTime.fromISO() accepts just the year", () => { isSame("2016", { year: 2016, month: 1, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-month", () => { isSame("2016-05", { year: 2016, month: 5, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts yearmonth", () => { isSame("201605", { year: 2016, month: 5, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-month-day", () => { isSame("2016-05-25", { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts yearmonthday", () => { isSame("20160525", { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts extend years", () => { isSame("+002016-05-25", { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); isSame("-002016-05-25", { year: -2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-month-dayThour", () => { isSame("2016-05-25T09", { year: 2016, month: 5, day: 25, hour: 9, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-month-dayThour:minute", () => { isSame("2016-05-25T09:24", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 0, millisecond: 0, }); isSame("2016-05-25T0924", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-month-dayThour:minute:second", () => { isSame("2016-05-25T09:24:15", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 0, }); isSame("2016-05-25T092415", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-month-dayThour:minute:second.millisecond", () => { isSame("2016-05-25T09:24:15.123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-05-25T092415.123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-05-25T09:24:15,123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-05-25T09:24:15.1239999", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-05-25T09:24:15.023", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 23, }); // we round down always isSame("2016-05-25T09:24:15.3456", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 345, }); isSame("2016-05-25T09:24:15.999999", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 999, }); // Support up to 20 digits isSame("2016-05-25T09:24:15.12345678901234567890123456789", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-05-25T09:24:15.1", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 100, }); }); test("DateTime.fromISO() accepts year-week", () => { isSame("2016-W21", { year: 2016, month: 5, day: 23, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-week-day", () => { isSame("2016-W21-3", { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); isSame("2016W213", { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-week-dayTtime", () => { isSame("2016-W21-3T09:24:15.123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016W213T09:24:15.123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); }); test("DateTime.fromISO() accepts year-ordinal", () => { isSame("2016-200", { year: 2016, month: 7, day: 18, hour: 0, minute: 0, second: 0, millisecond: 0, }); isSame("2016200", { year: 2016, month: 7, day: 18, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts year-ordinalTtime", () => { isSame("2016-200T09:24:15.123", { year: 2016, month: 7, day: 18, hour: 9, minute: 24, second: 15, millisecond: 123, }); }); test("DateTime.fromISO() accepts year-ordinalTtime+offset", () => { const dt = DateTime.fromISO("2016-200T09:24:15.123+0600", { setZone: true }); expect(dt.zone.name).toBe("UTC+6"); expect(dt.toObject()).toEqual({ year: 2016, month: 7, day: 18, hour: 9, minute: 24, second: 15, millisecond: 123, }); }); test("DateTime.fromISO() accepts hour:minute:second.millisecond", () => { const { year, month, day } = DateTime.now(); isSame("09:24:15.123", { year, month, day, hour: 9, minute: 24, second: 15, millisecond: 123, }); }); test("DateTime.fromISO() accepts hour:minute:second,millisecond", () => { const { year, month, day } = DateTime.now(); isSame("09:24:15,123", { year, month, day, hour: 9, minute: 24, second: 15, millisecond: 123, }); }); test("DateTime.fromISO() accepts hour:minute:second", () => { const { year, month, day } = DateTime.now(); isSame("09:24:15", { year, month, day, hour: 9, minute: 24, second: 15, millisecond: 0, }); }); test("DateTime.fromISO() accepts hour:minute", () => { const { year, month, day } = DateTime.now(); isSame("09:24", { year, month, day, hour: 9, minute: 24, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts hour:minute", () => { const { year, month, day } = DateTime.now(); isSame("09:24", { year, month, day, hour: 9, minute: 24, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() accepts 24:00", () => { isSame("2018-01-04T24:00", { year: 2018, month: 1, day: 5, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() doesn't accept 24:23", () => { expect(DateTime.fromISO("2018-05-25T24:23").isValid).toBe(false); }); test("DateTime.fromISO() accepts extended zones", () => { let dt = DateTime.fromISO("2016-05-14T10:23:54[Europe/Paris]", { setZone: true, }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Europe/Paris"); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); dt = DateTime.fromISO("2016-05-14T10:23:54[UTC]", { setZone: true }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("UTC"); expect(dt.offset).toBe(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); dt = DateTime.fromISO("2016-05-14T10:23:54[Etc/UTC]", { setZone: true }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Etc/UTC"); expect(dt.offset).toBe(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); }); test("DateTime.fromISO() accepts extended zones and offsets", () => { let dt = DateTime.fromISO("2016-05-14T10:23:54+01:00[Europe/Paris]", { setZone: true, }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Europe/Paris"); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); dt = DateTime.fromISO("2016-05-14T10:23:54+00:00[Etc/UTC]", { setZone: true }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Etc/UTC"); expect(dt.offset).toBe(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); }); test("DateTime.fromISO() accepts extended zones on bare times", () => { const { year, month, day } = DateTime.now().setZone("Europe/Paris"); let dt = DateTime.fromISO("10:23:54[Europe/Paris]", { setZone: true, }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Europe/Paris"); expect(dt.toObject()).toEqual({ year, month, day, hour: 10, minute: 23, second: 54, millisecond: 0, }); }); withNow( "DateTime.fromISO() accepts extended zones on bare times when UTC and zone are in different days", DateTime.fromISO("2023-11-20T23:30:00.000Z"), () => { const { year, month, day } = DateTime.now().setZone("Europe/Paris"); let dt = DateTime.fromISO("10:23:54[Europe/Paris]", { setZone: true, }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Europe/Paris"); expect(dt.toObject()).toEqual({ year, month, day, hour: 10, minute: 23, second: 54, millisecond: 0, }); } ); test("DateTime.fromISO() accepts some technically incorrect stuff", () => { // these are formats that aren't technically valid but we parse anyway. // Testing them more to document them than anything else isSame("2016-05-25T0924:15.123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-05-25T09:2415.123", { year: 2016, month: 5, day: 25, hour: 9, minute: 24, second: 15, millisecond: 123, }); isSame("2016-W213", { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromISO() rejects poop", () => { const rejects = (s) => expect(DateTime.fromISO(s).isValid).toBeFalsy(); rejects(null); rejects(""); rejects(" "); rejects("2016-1"); rejects("2016-1-15"); rejects("2016-01-5"); rejects("2016-01-00"); rejects("2016-00-01"); rejects("2016-05-25 08:34:34"); rejects("2016-05-25Q08:34:34"); rejects("2016-05-25T8:04:34"); rejects("2016-05-25T08:4:34"); rejects("2016-05-25T08:04:4"); rejects("2016-05-25T:03:4"); rejects("2016-05-25T08::4"); rejects("2016-W32-02"); }); //------ // .fromRFC2822 //------- test("DateTime.fromRFC2822() accepts full format", () => { const dt = DateTime.fromRFC2822("Tue, 01 Nov 2016 13:23:12 +0630"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 11, day: 1, hour: 6, minute: 53, second: 12, millisecond: 0, }); }); test("DateTime.fromRFC2822 parses a range of dates", () => { const testCases = { "Sun, 12 Apr 2015 05:06:07 GMT": [2015, 4, 12, 5, 6, 7], "Tue, 01 Nov 2016 01:23:45 +0000": [2016, 11, 1, 1, 23, 45], "Tue, 01 Nov 16 04:23:45 Z": [2016, 11, 1, 4, 23, 45], "01 Nov 2016 05:23:45 z": [2016, 11, 1, 5, 23, 45], "Mon, 02 Jan 2017 06:00:00 -0800": [2017, 1, 2, 6 + 8, 0, 0], "Mon, 02 Jan 2017 06:00:00 +0800": [2017, 1, 1, 22, 0, 0], "Mon, 02 Jan 2017 06:00:00 +0330": [2017, 1, 2, 2, 30, 0], "Mon, 02 Jan 2017 06:00:00 -0330": [2017, 1, 2, 9, 30, 0], "Mon, 02 Jan 2017 06:00:00 PST": [2017, 1, 2, 6 + 8, 0, 0], "Mon, 02 Jan 2017 06:00:00 PDT": [2017, 1, 2, 6 + 7, 0, 0], }; for (const testString in testCases) { if (Object.prototype.hasOwnProperty.call(testCases, testString)) { const expected = testCases[testString], r = DateTime.fromRFC2822(testString).toUTC(), actual = [r.year, r.month, r.day, r.hour, r.minute, r.second]; expect(expected).toEqual(actual); } } }); test("DateTime.fromRFC2822() rejects incorrect days of the week", () => { const dt = DateTime.fromRFC2822("Wed, 01 Nov 2016 13:23:12 +0600"); expect(dt.isValid).toBe(false); }); test("DateTime.fromRFC2822() can elide the day of the week", () => { const dt = DateTime.fromRFC2822("01 Nov 2016 13:23:12 +0600"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 11, day: 1, hour: 7, minute: 23, second: 12, millisecond: 0, }); }); test("DateTime.fromRFC2822() can elide seconds", () => { const dt = DateTime.fromRFC2822("01 Nov 2016 13:23 +0600"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 11, day: 1, hour: 7, minute: 23, second: 0, millisecond: 0, }); }); test("DateTime.fromRFC2822() can use Z", () => { const dt = DateTime.fromRFC2822("01 Nov 2016 13:23:12 Z"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 11, day: 1, hour: 13, minute: 23, second: 12, millisecond: 0, }); }); test("DateTime.fromRFC2822() can use a weird subset of offset abbreviations", () => { const dt = DateTime.fromRFC2822("01 Nov 2016 13:23:12 EST"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 11, day: 1, hour: 18, minute: 23, second: 12, millisecond: 0, }); }); //------ // .fromHTTP //------- test("DateTime.fromHTTP() can parse RFC 1123", () => { const dt = DateTime.fromHTTP("Sun, 06 Nov 1994 08:49:37 GMT"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 1994, month: 11, day: 6, hour: 8, minute: 49, second: 37, millisecond: 0, }); }); test("DateTime.fromHTTP() can parse RFC 850", () => { const dt = DateTime.fromHTTP("Sunday, 06-Nov-94 08:49:37 GMT"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 1994, month: 11, day: 6, hour: 8, minute: 49, second: 37, millisecond: 0, }); }); test("DateTime.fromHTTP() can parse RFC 850 on Wednesday", () => { const dt = DateTime.fromHTTP("Wednesday, 29-Jun-22 08:49:37 GMT"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2022, month: 6, day: 29, hour: 8, minute: 49, second: 37, millisecond: 0, }); }); test("DateTime.fromHTTP() can parse ASCII dates with one date digit", () => { const dt = DateTime.fromHTTP("Sun Nov 6 08:49:37 1994"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 1994, month: 11, day: 6, hour: 8, minute: 49, second: 37, millisecond: 0, }); }); test("DateTime.fromHTTP() can parse ASCII dates with two date digits", () => { const dt = DateTime.fromHTTP("Wed Nov 16 08:49:37 1994"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 1994, month: 11, day: 16, hour: 8, minute: 49, second: 37, millisecond: 0, }); }); //------ // .fromSQL //------- test("DateTime.fromSQL() can parse SQL dates", () => { const dt = DateTime.fromSQL("2016-05-14"); expect(dt.isValid).toBe(true); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 0, minute: 0, second: 0, millisecond: 0, }); }); test("DateTime.fromSQL() can parse SQL times", () => { const dt = DateTime.fromSQL("04:12:00.123"); expect(dt.isValid).toBe(true); const now = new Date(); expect(dt.toObject()).toEqual({ year: now.getFullYear(), month: now.getMonth() + 1, day: now.getDate(), hour: 4, minute: 12, second: 0, millisecond: 123, }); }); test("DateTime.fromSQL() handles times without fractional seconds", () => { const dt = DateTime.fromSQL("04:12:00"); expect(dt.isValid).toBe(true); const now = new Date(); expect(dt.toObject()).toEqual({ year: now.getFullYear(), month: now.getMonth() + 1, day: now.getDate(), hour: 4, minute: 12, second: 0, millisecond: 0, }); }); test("DateTime.fromSQL() can parse SQL datetimes with sub-millisecond precision", () => { let dt = DateTime.fromSQL("2016-05-14 10:23:54.2346"); expect(dt.isValid).toBe(true); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 234, }); dt = DateTime.fromSQL("2016-05-14 10:23:54.2341"); expect(dt.isValid).toBe(true); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 234, }); }); test("DateTime.fromSQL() handles deciseconds in SQL datetimes", () => { const dt = DateTime.fromSQL("2016-05-14 10:23:54.1"); expect(dt.isValid).toBe(true); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 100, }); }); test("DateTime.fromSQL() handles datetimes without fractional seconds", () => { const dt = DateTime.fromSQL("2016-05-14 10:23:54"); expect(dt.isValid).toBe(true); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); }); test("DateTime.fromSQL() accepts a zone to default to", () => { const dt = DateTime.fromSQL("2016-05-14 10:23:54.023", { zone: "utc" }); expect(dt.isValid).toBe(true); expect(dt.offset).toBe(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 23, }); }); test("DateTime.fromSQL() can parse an optional offset", () => { let dt = DateTime.fromSQL("2016-05-14 10:23:54.023 +06:00"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 4, minute: 23, second: 54, millisecond: 23, }); // no space before the zone dt = DateTime.fromSQL("2016-05-14 10:23:54.023+06:00"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 4, minute: 23, second: 54, millisecond: 23, }); // no milliseconds dt = DateTime.fromSQL("2016-05-14 10:23:54 +06:00"); expect(dt.isValid).toBe(true); expect(dt.toUTC().toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 4, minute: 23, second: 54, millisecond: 0, }); }); test("DateTime.fromSQL() can parse an optional zone", () => { let dt = DateTime.fromSQL("2016-05-14 10:23:54 Europe/Paris", { setZone: true, }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Europe/Paris"); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); dt = DateTime.fromSQL("2016-05-14 10:23:54 UTC", { setZone: true }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("UTC"); expect(dt.offset).toBe(0); expect(dt.toObject()).toEqual({ year: 2016, month: 5, day: 14, hour: 10, minute: 23, second: 54, millisecond: 0, }); }); moment-luxon-93c85a3/test/datetime/relative.test.js000066400000000000000000000233341477254173100224370ustar00rootroot00000000000000import DateTime from "../../src/datetime"; const Helpers = require("../helpers"); /* global expect test */ //------ // #toRelative() //------- test("DateTime#toRelative works down through the units", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14 }); expect(base.plus({ minutes: 1 }).toRelative({ base })).toBe("in 1 minute"); expect(base.plus({ minutes: 5 }).toRelative({ base })).toBe("in 5 minutes"); expect(base.plus({ minutes: 65 }).toRelative({ base })).toBe("in 1 hour"); expect(base.plus({ minutes: 165 }).toRelative({ base })).toBe("in 2 hours"); expect(base.plus({ hours: 24 }).toRelative({ base })).toBe("in 1 day"); expect(base.plus({ days: 3 }).toRelative({ base })).toBe("in 3 days"); expect(base.plus({ months: 5 }).toRelative({ base })).toBe("in 5 months"); expect(base.plus({ months: 15 }).toRelative({ base })).toBe("in 1 year"); expect(base.minus({ minutes: 1 }).toRelative({ base })).toBe("1 minute ago"); expect(base.minus({ minutes: 5 }).toRelative({ base })).toBe("5 minutes ago"); expect(base.minus({ minutes: 65 }).toRelative({ base })).toBe("1 hour ago"); expect(base.minus({ minutes: 165 }).toRelative({ base })).toBe("2 hours ago"); expect(base.minus({ hours: 24 }).toRelative({ base })).toBe("1 day ago"); expect(base.minus({ days: 3 }).toRelative({ base })).toBe("3 days ago"); expect(base.minus({ months: 5 }).toRelative({ base })).toBe("5 months ago"); expect(base.minus({ months: 15 }).toRelative({ base })).toBe("1 year ago"); }); test("DateTime#toRelative allows padding", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14 }); expect(base.endOf("day").toRelative({ base, padding: 10 })).toBe("in 1 day"); expect(base.minus({ days: 1, milliseconds: -1 }).toRelative({ base, padding: 10 })).toBe( "1 day ago" ); }); test("DateTime#toRelative takes a round argument", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14 }); expect(base.plus({ months: 15 }).toRelative({ base, round: false })).toBe("in 1.25 years"); expect(base.minus({ months: 15 }).toRelative({ base, round: false })).toBe("1.25 years ago"); }); test("DateTime#toRelative takes a unit argument", () => { const base = DateTime.fromObject({ year: 2018, month: 10, day: 14 }, { zone: "UTC" }); expect(base.plus({ months: 15 }).toRelative({ base, unit: "months" })).toBe("in 15 months"); expect(base.minus({ months: 15 }).toRelative({ base, unit: "months" })).toBe("15 months ago"); expect(base.plus({ months: 3 }).toRelative({ base, unit: "years", round: false })).toBe( "in 0.25 years" ); expect(base.minus({ months: 3 }).toRelative({ base, unit: "years", round: false })).toBe( "0.25 years ago" ); expect(base.minus({ seconds: 30 }).toRelative({ base, unit: ["days", "hours", "minutes"] })).toBe( "0 minutes ago" ); expect(base.minus({ seconds: 1 }).toRelative({ base, unit: "minutes" })).toBe("0 minutes ago"); expect(base.plus({ seconds: 1 }).toRelative({ base, unit: "minutes" })).toBe("in 0 minutes"); expect( base.plus({ seconds: 30 }).toRelative({ base, unit: ["days", "hours", "minutes"], }) ).toBe("in 0 minutes"); expect( base.plus({ years: 2 }).toRelative({ base, unit: ["days", "hours", "minutes"], }) ).toBe("in 731 days"); }); test("DateTime#toRelative always rounds toward 0", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14 }); expect(base.endOf("day").toRelative({ base })).toBe("in 23 hours"); expect(base.minus({ days: 1, milliseconds: -1 }).toRelative({ base })).toBe("23 hours ago"); }); test("DateTime#toRelative uses the absolute time", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14, hour: 23, minute: 59 }); const end = DateTime.fromObject({ year: 1983, month: 10, day: 15, hour: 0, minute: 3 }); expect(end.toRelative({ base })).toBe("in 4 minutes"); expect(base.toRelative({ base: end })).toBe("4 minutes ago"); }); Helpers.withoutRTF("DateTime#toRelative works without RTF", () => { const base = DateTime.fromObject({ year: 2019, month: 12, day: 25 }); expect(base.plus({ months: 1 }).toRelative({ base })).toBe("in 1 month"); expect(base.plus({ months: 1 }).toRelative({ base, style: "narrow" })).toBe("in 1 mo."); expect(base.plus({ months: 1 }).toRelative({ base, unit: "days" })).toBe("in 31 days"); expect(base.plus({ months: 1 }).toRelative({ base, style: "short", unit: "days" })).toBe( "in 31 days" ); expect(base.plus({ months: 1, days: 2 }).toRelative({ base, round: false })).toBe( "in 1.06 months" ); }); Helpers.withoutRTF("DateTime#toRelative falls back to English", () => { const base = DateTime.fromObject({ year: 2019, month: 12, day: 25 }); expect(base.setLocale("fr").plus({ months: 1 }).toRelative({ base })).toBe("in 1 month"); }); test("DateTime#toRelative returns null when used on an invalid date", () => { expect(DateTime.invalid("not valid").toRelative()).toBe(null); }); //------ // #toRelativeCalendar() //------- test("DateTime#toRelativeCalendar uses the calendar", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14, hour: 23, minute: 59 }); const end = DateTime.fromObject({ year: 1983, month: 10, day: 15, hour: 0, minute: 3 }); expect(end.toRelativeCalendar({ base })).toBe("tomorrow"); }); Helpers.withNow( "DateTime#toRelativeCalendar picks the correct unit with no options", DateTime.fromObject({ year: 1983, month: 10, day: 14 }), () => { const now = DateTime.now(); expect(now.plus({ days: 1 }).toRelativeCalendar()).toBe("tomorrow"); } ); Helpers.withNow( "DateTime#toRelativeCalendar picks the correct unit with no options at last day of month", DateTime.fromObject({ year: 1983, month: 10, day: 31 }), () => { const now = DateTime.now(); expect(now.plus({ days: 1 }).toRelativeCalendar()).toBe("next month"); } ); Helpers.withNow( "DateTime#toRelativeCalendar picks the correct unit with no options at least day of year", DateTime.fromObject({ year: 1983, month: 12, day: 31 }), () => { const now = DateTime.now(); expect(now.plus({ days: 1 }).toRelativeCalendar()).toBe("next year"); } ); test("DateTime#toRelativeCalendar returns null when used on an invalid date", () => { expect(DateTime.invalid("not valid").toRelativeCalendar()).toBe(null); }); test("DateTime#toRelativeCalendar works down through the units", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14, hour: 12 }); expect(base.plus({ minutes: 1 }).toRelativeCalendar({ base })).toBe("today"); expect(base.plus({ minutes: 5 }).toRelativeCalendar({ base })).toBe("today"); expect(base.plus({ minutes: 65 }).toRelativeCalendar({ base })).toBe("today"); expect(base.plus({ hours: 13 }).toRelativeCalendar({ base })).toBe("tomorrow"); expect(base.plus({ days: 3 }).toRelativeCalendar({ base })).toBe("in 3 days"); expect(base.plus({ months: 1 }).toRelativeCalendar({ base })).toBe("next month"); expect(base.plus({ months: 5 }).toRelativeCalendar({ base })).toBe("next year"); expect(base.plus({ months: 15 }).toRelativeCalendar({ base })).toBe("in 2 years"); expect(base.minus({ minutes: 1 }).toRelativeCalendar({ base })).toBe("today"); expect(base.minus({ minutes: 5 }).toRelativeCalendar({ base })).toBe("today"); expect(base.minus({ minutes: 65 }).toRelativeCalendar({ base })).toBe("today"); expect(base.minus({ hours: 24 }).toRelativeCalendar({ base })).toBe("yesterday"); expect(base.minus({ days: 3 }).toRelativeCalendar({ base })).toBe("3 days ago"); expect(base.minus({ months: 1 }).toRelativeCalendar({ base })).toBe("last month"); expect(base.minus({ months: 5 }).toRelativeCalendar({ base })).toBe("5 months ago"); expect(base.minus({ months: 15 }).toRelativeCalendar({ base })).toBe("last year"); }); test("DateTime#toRelativeCalendar takes a unit argument", () => { const base = DateTime.fromObject({ year: 1983, month: 10, day: 14, hour: 12 }), target = base.plus({ months: 3 }); expect(target.toRelativeCalendar({ base, unit: "months" })).toBe("in 3 months"); }); Helpers.withoutRTF("DateTime#toRelativeCalendar works without RTF", () => { const base = DateTime.fromObject({ year: 2019, month: 10, day: 25 }); expect(base.plus({ months: 1 }).toRelativeCalendar({ base })).toBe("next month"); }); Helpers.withoutRTF("DateTime#toRelativeCalendar falls back to English", () => { const base = DateTime.fromObject({ year: 2019, month: 12, day: 25 }); expect(base.setLocale("fr").plus({ months: 1 }).toRelativeCalendar({ base })).toBe("next year"); }); test("DateTime#toRelativeCalendar works down through the units for different zone than local", () => { const target = DateTime.now().setZone(`UTC+3`), target1 = target.plus({ days: 1 }), target2 = target1.plus({ days: 1 }), target3 = target2.plus({ days: 1 }), options = { unit: "days" }; expect(target.toRelativeCalendar(options)).toBe("today"); expect(target1.toRelativeCalendar(options)).toBe("tomorrow"); expect(target2.toRelativeCalendar(options)).toBe("in 2 days"); expect(target3.toRelativeCalendar(options)).toBe("in 3 days"); }); test("DateTime#toRelative works down through the units for different zone than local", () => { const base = DateTime.now().setZone(`UTC+3`); expect(base.plus({ minutes: 65 }).toRelative()).toBe("in 1 hour"); expect(base.plus({ minutes: 165 }).toRelative()).toBe("in 2 hours"); expect(base.plus({ hours: 25 }).toRelative()).toBe("in 1 day"); expect(base.plus({ months: 15 }).toRelative()).toBe("in 1 year"); expect(base.minus({ minutes: 65 }).toRelative()).toBe("1 hour ago"); expect(base.minus({ minutes: 165 }).toRelative()).toBe("2 hours ago"); expect(base.minus({ hours: 25 }).toRelative()).toBe("1 day ago"); expect(base.minus({ months: 15 }).toRelative()).toBe("1 year ago"); }); moment-luxon-93c85a3/test/datetime/set.test.js000066400000000000000000000222731477254173100214200ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; const dt = DateTime.fromJSDate(new Date(1982, 4, 25, 9, 23, 54, 123)); //------ // year/month/day/hour/minute/second/millisecond //------- test("DateTime#set() sets Gregorian fields", () => { expect(dt.set({ year: 2012 }).year).toBe(2012); expect(dt.set({ month: 2 }).month).toBe(2); expect(dt.set({ month: 2 }).hour).toBe(9); // this will cross a DST for many people expect(dt.set({ day: 5 }).day).toBe(5); expect(dt.set({ hour: 4 }).hour).toBe(4); expect(dt.set({ minute: 16 }).minute).toBe(16); expect(dt.set({ second: 45 }).second).toBe(45); expect(dt.set({ millisecond: 86 }).millisecond).toBe(86); }); test("DateTime#set({ month }) doesn't go to the wrong month", () => { const end = DateTime.fromJSDate(new Date(1983, 4, 31)), moved = end.set({ month: 4 }); expect(moved.month).toBe(4); expect(moved.day).toBe(30); }); test("DateTime#set({ year }) doesn't wrap leap years", () => { const end = DateTime.fromJSDate(new Date(2012, 1, 29)), moved = end.set({ year: 2013 }); expect(moved.month).toBe(2); expect(moved.day).toBe(28); }); //------ // weekYear/weekNumber/weekday //------ test("DateTime#set({ weekYear }) sets the date to the same weekNumber/weekday of the target weekYear", () => { const modified = dt.set({ weekYear: 2017 }); expect(modified.weekday).toBe(2); // still tuesday expect(modified.weekNumber).toBe(21); expect(modified.year).toBe(2017); expect(modified.month).toBe(5); expect(modified.day).toBe(23); // 2017-W21-2 is the 23 expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ weekNumber }) sets the date to the same weekday of the target weekNumber", () => { const modified = dt.set({ weekNumber: 2 }); expect(modified.weekday).toBe(2); // still tuesday expect(modified.year).toBe(1982); expect(modified.month).toBe(1); expect(modified.day).toBe(12); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ weekday }) sets the weekday to this week's matching day", () => { const modified = dt.set({ weekday: 1 }); expect(modified.weekday).toBe(1); expect(modified.year).toBe(1982); expect(modified.month).toBe(5); expect(modified.day).toBe(24); // monday is the previous day expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ weekday }) handles week year edge cases", () => { const endOfWeekIs = (startISO, expectedISO) => { const start = DateTime.fromISO(startISO); const expected = DateTime.fromISO(expectedISO); expect(start.set({ weekday: 7 })).toEqual(expected); }; endOfWeekIs("2016-01-02", "2016-01-03"); endOfWeekIs("2016-12-29", "2017-01-01"); endOfWeekIs("2021-01-01", "2021-01-03"); endOfWeekIs("2028-01-01", "2028-01-02"); }); //------ // locale-based week units //------ test("DateTime#set({ localWeekday }) sets the weekday to this week's matching day based on the locale (en-US)", () => { const modified = dt.reconfigure({ locale: "en-US" }).set({ localWeekday: 1 }); expect(modified.localWeekday).toBe(1); expect(modified.weekday).toBe(7); expect(modified.year).toBe(1982); expect(modified.month).toBe(5); expect(modified.day).toBe(23); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekday }) sets the weekday to this week's matching day based on the locale (de-DE)", () => { const modified = dt.reconfigure({ locale: "de-DE" }).set({ localWeekday: 1 }); expect(modified.localWeekday).toBe(1); expect(modified.weekday).toBe(1); expect(modified.year).toBe(1982); expect(modified.month).toBe(5); expect(modified.day).toBe(24); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekday }) handles crossing over into the previous year", () => { const modified = DateTime.local(2022, 1, 1, 9, 23, 54, 123, { locale: "en-US" }).set({ localWeekday: 2, }); expect(modified.localWeekday).toBe(2); expect(modified.weekday).toBe(1); expect(modified.year).toBe(2021); expect(modified.month).toBe(12); expect(modified.day).toBe(27); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekday }) handles crossing over into the previous year", () => { const modified = DateTime.local(2022, 1, 1, 9, 23, 54, 123, { locale: "en-US" }).set({ localWeekday: 2, }); expect(modified.localWeekday).toBe(2); expect(modified.weekday).toBe(1); expect(modified.year).toBe(2021); expect(modified.month).toBe(12); expect(modified.day).toBe(27); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekNumber }) sets the date to the same weekday of the target weekNumber (en-US)", () => { const modified = dt.reconfigure({ locale: "en-US" }).set({ localWeekNumber: 2 }); expect(modified.weekday).toBe(2); // still tuesday expect(modified.localWeekNumber).toBe(2); expect(modified.year).toBe(1982); expect(modified.month).toBe(1); expect(modified.day).toBe(5); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekNumber }) sets the date to the same weekday of the target weekNumber (de-DE)", () => { const modified = dt.reconfigure({ locale: "de-DE" }).set({ localWeekNumber: 2 }); expect(modified.weekday).toBe(2); // still tuesday expect(modified.localWeekNumber).toBe(2); expect(modified.year).toBe(1982); expect(modified.month).toBe(1); expect(modified.day).toBe(12); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekYear }) sets the date to the same weekNumber/weekday of the target weekYear (en-US)", () => { const modified = dt.reconfigure({ locale: "en-US" }).set({ localWeekYear: 2017 }); expect(modified.localWeekday).toBe(3); // still tuesday expect(modified.localWeekNumber).toBe(22); // still week 22 expect(modified.localWeekYear).toBe(2017); expect(modified.year).toBe(2017); expect(modified.month).toBe(5); expect(modified.day).toBe(30); // 2017-W22-3 is the 30 expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); test("DateTime#set({ localWeekYear }) sets the date to the same weekNumber/weekday of the target weekYear (de-DE)", () => { const modified = dt.reconfigure({ locale: "de-DE" }).set({ localWeekYear: 2017 }); expect(modified.localWeekday).toBe(2); // still tuesday expect(modified.localWeekNumber).toBe(21); // still week 21 expect(modified.localWeekYear).toBe(2017); expect(modified.year).toBe(2017); expect(modified.month).toBe(5); expect(modified.day).toBe(23); // 2017-W21-2 is the 30 expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); //------ // year/ordinal //------ test("DateTime#set({ ordinal }) sets the date to the ordinal within the current year", () => { const modified = dt.set({ ordinal: 200 }); expect(modified.year).toBe(1982); expect(modified.month).toBe(7); expect(modified.day).toBe(19); expect(modified.hour).toBe(9); expect(modified.minute).toBe(23); expect(modified.second).toBe(54); expect(modified.millisecond).toBe(123); }); //------ // set multiple things //------ test("DateTime.set does units in increasing size", () => { const modified = dt.set({ day: 31, month: 3 }); expect(modified.month).toBe(3); expect(modified.day).toBe(31); }); //------ // set invalid things //------ test("DateTime#set throws for invalid units", () => { expect(() => dt.set({ glorb: 200 })).toThrow(); }); test("DateTime#set throws for metadata", () => { expect(() => dt.set({ zone: "UTC" })).toThrow(); expect(() => dt.set({ locale: "be" })).toThrow(); expect(() => dt.set({ invalid: true })).toThrow(); }); test("DateTime#set throws for mixing incompatible units", () => { expect(() => dt.set({ year: 2020, weekNumber: 22 })).toThrow(); expect(() => dt.set({ ordinal: 200, weekNumber: 22 })).toThrow(); expect(() => dt.set({ ordinal: 200, month: 8 })).toThrow(); expect(() => dt.set({ year: 2020, localWeekNumber: 22 })).toThrow(); expect(() => dt.set({ ordinal: 200, localWeekNumber: 22 })).toThrow(); expect(() => dt.set({ weekday: 2, localWeekNumber: 22 })).toThrow(); expect(() => dt.set({ weekday: 2, localWeekYear: 2022 })).toThrow(); }); test("DateTime#set maintains invalidity", () => { expect(DateTime.invalid("because").set({ ordinal: 200 }).isValid).toBe(false); }); moment-luxon-93c85a3/test/datetime/toFormat.test.js000066400000000000000000000576271477254173100224330ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; const dt = DateTime.fromObject( { year: 1982, month: 5, day: 25, hour: 9, minute: 23, second: 54, millisecond: 123, }, { zone: "utc", } ); const ny = dt.setZone("America/New_York", { keepLocalTime: true }); //------ // #toFormat() //------ test("DateTime#toFormat accepts the locale from the DateTime or the options", () => { expect(dt.setLocale("fr").toFormat("LLLL")).toBe("mai"); expect(dt.toFormat("LLLL", { locale: "fr" })).toBe("mai"); expect(dt.setLocale("pt").toFormat("LLLL", { locale: "fr" })).toBe("mai"); }); test("DateTime#toFormat('u') returns fractional seconds", () => { expect(dt.toFormat("u")).toBe("123"); expect(dt.set({ millisecond: 82 }).toFormat("u")).toBe("082"); expect(dt.set({ millisecond: 2 }).toFormat("u")).toBe("002"); expect(dt.set({ millisecond: 80 }).toFormat("u")).toBe("080"); // I think this is OK }); test("DateTime#toFormat('uu') returns fractional seconds as two digits", () => { expect(dt.toFormat("uu")).toBe("12"); expect(dt.set({ millisecond: 82 }).toFormat("uu")).toBe("08"); expect(dt.set({ millisecond: 789 }).toFormat("uu")).toBe("78"); }); test("DateTime#toFormat('uuu') returns fractional seconds as one digit", () => { expect(dt.toFormat("uuu")).toBe("1"); expect(dt.set({ millisecond: 82 }).toFormat("uuu")).toBe("0"); expect(dt.set({ millisecond: 789 }).toFormat("uuu")).toBe("7"); }); test("DateTime#toFormat('S') returns the millisecond", () => { expect(dt.toFormat("S")).toBe("123"); expect(dt.reconfigure({ locale: "bn" }).toFormat("S")).toBe("১২৩"); expect(dt.toFormat("S")).toBe("123"); expect(dt.set({ millisecond: 82 }).toFormat("S")).toBe("82"); }); test("DateTime#toFormat('SSS') returns padded the millisecond", () => { expect(dt.toFormat("SSS")).toBe("123"); expect(dt.reconfigure({ locale: "bn" }).toFormat("SSS")).toBe("১২৩"); expect(dt.set({ millisecond: 82 }).toFormat("SSS")).toBe("082"); }); test("DateTime#toFormat('s') returns the second", () => { expect(dt.toFormat("s")).toBe("54"); expect(dt.reconfigure({ locale: "bn" }).toFormat("s")).toBe("৫৪"); expect(dt.set({ second: 6 }).toFormat("s")).toBe("6"); }); test("DateTime#toFormat('ss') returns the padded second", () => { expect(dt.toFormat("ss")).toBe("54"); expect(dt.reconfigure({ locale: "bn" }).toFormat("ss")).toBe("৫৪"); expect(dt.set({ second: 6 }).toFormat("ss")).toBe("06"); }); test("DateTime#toFormat('m') returns the minute", () => { expect(dt.toFormat("m")).toBe("23"); expect(dt.reconfigure({ locale: "bn" }).toFormat("m")).toBe("২৩"); expect(dt.set({ minute: 6 }).toFormat("m")).toBe("6"); }); test("DateTime#toFormat('mm') returns the padded minute", () => { expect(dt.toFormat("mm")).toBe("23"); expect(dt.reconfigure({ locale: "bn" }).toFormat("mm")).toBe("২৩"); expect(dt.set({ minute: 6 }).toFormat("mm")).toBe("06"); }); test("DateTime#toFormat('h') returns the hours", () => { expect(dt.toFormat("h")).toBe("9"); expect(dt.reconfigure({ locale: "bn" }).toFormat("h")).toBe("৯"); expect(dt.set({ hour: 0 }).toFormat("h")).toBe("12"); expect(dt.set({ hour: 24 }).toFormat("h")).toBe("12"); expect(dt.set({ hour: 12 }).toFormat("h")).toBe("12"); expect(dt.set({ hour: 13 }).toFormat("h")).toBe("1"); }); test("DateTime#toFormat('hh') returns the padded hour (12-hour time)", () => { expect(dt.toFormat("hh")).toBe("09"); expect(dt.reconfigure({ locale: "bn" }).toFormat("hh")).toBe("০৯"); expect(dt.set({ hour: 0 }).toFormat("h")).toBe("12"); expect(dt.set({ hour: 24 }).toFormat("h")).toBe("12"); expect(dt.set({ hour: 12 }).toFormat("hh")).toBe("12"); expect(dt.set({ hour: 13 }).toFormat("hh")).toBe("01"); }); test("DateTime#toFormat('H') returns the hour (24-hour time)", () => { expect(dt.toFormat("H")).toBe("9"); expect(dt.reconfigure({ locale: "bn" }).toFormat("H")).toBe("৯"); expect(dt.set({ hour: 12 }).toFormat("H")).toBe("12"); expect(dt.set({ hour: 13 }).toFormat("H")).toBe("13"); }); test("DateTime#toFormat('HH') returns the padded hour (24-hour time)", () => { expect(dt.toFormat("HH")).toBe("09"); expect(dt.reconfigure({ locale: "bn" }).toFormat("HH")).toBe("০৯"); expect(dt.set({ hour: 12 }).toFormat("HH")).toBe("12"); expect(dt.set({ hour: 13 }).toFormat("HH")).toBe("13"); }); test("DateTime#toFormat('Z') returns the narrow offset", () => { expect(dt.toUTC(360).toFormat("Z")).toBe("+6"); expect(dt.toUTC(390).toFormat("Z")).toBe("+6:30"); expect(dt.toUTC(-360).toFormat("Z")).toBe("-6"); expect(dt.toUTC(-390).toFormat("Z")).toBe("-6:30"); expect(dt.toUTC().toFormat("Z")).toBe("+0"); }); test("DateTime#toFormat('ZZ') returns the padded offset", () => { expect(dt.toUTC(360).toFormat("ZZ")).toBe("+06:00"); expect(dt.toUTC(390).toFormat("ZZ")).toBe("+06:30"); expect(dt.toUTC(-360).toFormat("ZZ")).toBe("-06:00"); expect(dt.toUTC(-390).toFormat("ZZ")).toBe("-06:30"); expect(dt.toUTC().toFormat("ZZ")).toBe("+00:00"); }); test("DateTime#toFormat('ZZZ') returns a numerical offset", () => { expect(dt.toUTC(360).toFormat("ZZZ")).toBe("+0600"); expect(dt.toUTC(390).toFormat("ZZZ")).toBe("+0630"); expect(dt.toUTC(-360).toFormat("ZZZ")).toBe("-0600"); expect(dt.toUTC(-390).toFormat("ZZZ")).toBe("-0630"); expect(dt.toUTC().toFormat("ZZZ")).toBe("+0000"); }); test("DateTime#toFormat('ZZZZ') returns the short offset name", () => { const zoned = dt.setZone("America/Los_Angeles"); expect(zoned.toFormat("ZZZZ")).toBe("PDT"); expect(dt.toUTC().toFormat("ZZZZ")).toBe("UTC"); }); test("DateTime#toFormat('ZZZZZ') returns the full offset name", () => { const zoned = dt.setZone("America/Los_Angeles"); expect(zoned.toFormat("ZZZZZ")).toBe("Pacific Daylight Time"); expect(dt.toUTC().toFormat("ZZZZZ")).toBe("UTC"); }); test("DateTime#toFormat('z') returns the zone name", () => { const zoned = dt.setZone("America/Los_Angeles"); expect(zoned.toFormat("z")).toBe("America/Los_Angeles"); const utc = dt.toUTC(); expect(utc.toFormat("z")).toBe("UTC"); }); test("DateTime#toFormat('a') returns the meridiem", () => { expect(dt.toFormat("a")).toBe("AM"); expect(dt.reconfigure({ locale: "my" }).toFormat("a")).toBe("နံနက်"); expect(dt.set({ hour: 13 }).toFormat("a")).toBe("PM"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "my" }).toFormat("a")).toBe("ညနေ"); }); test("DateTime#toFormat('d') returns the day", () => { expect(dt.toFormat("d")).toBe("25"); expect(dt.set({ day: 1 }).toFormat("d")).toBe("1"); }); test("DateTime#toFormat('dd') returns the padded day", () => { expect(dt.toFormat("dd")).toBe("25"); expect(dt.set({ day: 1 }).toFormat("dd")).toBe("01"); }); test("DateTime#toFormat('E' || 'c') returns weekday number", () => { expect(dt.toFormat("E")).toBe("2"); expect(dt.toFormat("c")).toBe("2"); }); test("DateTime#toFormat('EEE') returns short format weekday name", () => { expect(dt.toFormat("EEE")).toBe("Tue"); expect(dt.reconfigure({ locale: "de" }).toFormat("EEE")).toBe("Di."); }); test("DateTime#toFormat('ccc') returns short standalone weekday name", () => { expect(dt.toFormat("ccc")).toBe("Tue"); expect(dt.reconfigure({ locale: "de" }).toFormat("ccc")).toBe("Di"); }); test("DateTime#toFormat('EEEE') returns the full format weekday name", () => { expect(dt.toFormat("EEEE")).toBe("Tuesday"); }); test("DateTime#toFormat('cccc') returns the full standalone weekday name", () => { expect(dt.toFormat("cccc")).toBe("Tuesday"); }); test("DateTime#toFormat('EEEEE' || 'ccccc') returns narrow weekday name", () => { expect(dt.toFormat("EEEEE")).toBe("T"); expect(dt.toFormat("ccccc")).toBe("T"); }); test("DateTime#toFormat('M' || 'L') return the month number", () => { expect(dt.toFormat("M")).toBe("5"); expect(dt.toFormat("L")).toBe("5"); }); test("DateTime#toFormat('MM' || 'LL') return the padded month number", () => { expect(dt.toFormat("MM")).toBe("05"); }); test("DateTime#toFormat('MMM') returns the short format month name", () => { expect(dt.toFormat("MMM")).toBe("May"); expect(dt.reconfigure({ locale: "de" }).toFormat("MMM")).toBe("Mai"); expect(dt.set({ month: 8 }).toFormat("MMM")).toBe("Aug"); }); test("DateTime#toFormat('LLL') returns the short standalone month name", () => { expect(dt.toFormat("LLL")).toBe("May"); expect(dt.reconfigure({ locale: "de" }).toFormat("LLL")).toBe("Mai"); expect(dt.set({ month: 8 }).toFormat("LLL")).toBe("Aug"); }); test("DateTime#toFormat('MMMM') returns the full format month name", () => { expect(dt.toFormat("MMMM")).toBe("May"); expect(dt.set({ month: 8 }).toFormat("MMMM")).toBe("August"); expect(dt.set({ month: 8 }).reconfigure({ locale: "ru" }).toFormat("MMMM")).toBe("августа"); }); test("DateTime#toFormat('LLLL') returns the full standalone month name", () => { expect(dt.toFormat("LLLL")).toBe("May"); expect(dt.set({ month: 8 }).toFormat("LLLL")).toBe("August"); }); test("DateTime#toFormat('MMMMM' || 'LLLLL') returns the narrow month name", () => { expect(dt.toFormat("MMMMM")).toBe("M"); expect(dt.toFormat("LLLLL")).toBe("M"); }); test("DateTime#toFormat('y') returns the full year", () => { expect(dt.toFormat("y")).toBe("1982"); expect(dt.reconfigure({ locale: "bn" }).toFormat("y")).toBe("১৯৮২"); expect(dt.set({ year: 3 }).toFormat("y")).toBe("3"); }); test("DateTime#toFormat('yy') returns the two-digit year", () => { expect(dt.toFormat("yy")).toBe("82"); expect(dt.reconfigure({ locale: "bn" }).toFormat("yy")).toBe("৮২"); expect(dt.set({ year: 3 }).toFormat("yy")).toBe("03"); }); test("DateTime#toFormat('yyyy') returns the padded full year", () => { expect(dt.toFormat("yyyy")).toBe("1982"); expect(dt.reconfigure({ locale: "bn" }).toFormat("yyyy")).toBe("১৯৮২"); expect(dt.set({ year: 3 }).toFormat("yyyy")).toBe("0003"); expect(dt.set({ year: 3 }).reconfigure({ locale: "bn" }).toFormat("yyyy")).toBe("০০০৩"); }); test("DateTime#toFormat('yyyy') returns the padded full year", () => { const bigDt = DateTime.fromObject({ year: 36000 }); expect(bigDt.toFormat("yyyy")).toBe("36000"); const lilDt = DateTime.fromObject({ year: 17 }); expect(lilDt.toFormat("yyyy")).toBe("0017"); }); test("DateTime#toFormat('yyyyyy') returns the padded extended year", () => { const hugeDt = DateTime.fromObject({ year: 136000 }); expect(hugeDt.toFormat("yyyyyy")).toBe("136000"); const bigDt = DateTime.fromObject({ year: 36000 }); expect(bigDt.toFormat("yyyyyy")).toBe("036000"); expect(dt.toFormat("yyyyyy")).toBe("001982"); const lilDt = DateTime.fromObject({ year: 17 }); expect(lilDt.toFormat("yyyyyy")).toBe("000017"); }); test("DateTime#toFormat('G') returns the short era", () => { expect(dt.toFormat("G")).toBe("AD"); expect(dt.reconfigure({ locale: "de" }).toFormat("G")).toBe("n. Chr."); expect(dt.set({ year: -21 }).toFormat("G")).toBe("BC"); expect(dt.set({ year: -21 }).reconfigure({ locale: "de" }).toFormat("G")).toBe("v. Chr."); }); test("DateTime#toFormat('GG') returns the full era", () => { expect(dt.toFormat("GG")).toBe("Anno Domini"); expect(dt.set({ year: -21 }).toFormat("GG")).toBe("Before Christ"); }); test("DateTime#toFormat('GGGGG') returns the narrow era", () => { expect(dt.toFormat("GGGGG")).toBe("A"); expect(dt.set({ year: -21 }).toFormat("GGGGG")).toBe("B"); }); test("DateTime#toFormat('W') returns the week number", () => { expect(dt.toFormat("W")).toBe("21"); expect(dt.set({ weekNumber: 5 }).toFormat("W")).toBe("5"); }); test("DateTime#toFormat('WW') returns the padded week number", () => { expect(dt.toFormat("WW")).toBe("21"); expect(dt.set({ weekNumber: 5 }).toFormat("WW")).toBe("05"); }); test("DateTime#toFormat('kk') returns the abbreviated week year", () => { expect(dt.toFormat("kk")).toBe("82"); }); test("DateTime#toFormat('kkkk') returns the full week year", () => { expect(dt.toFormat("kkkk")).toBe("1982"); }); test("DateTime#toFormat('o') returns an unpadded ordinal", () => { expect(dt.toFormat("o")).toBe("145"); expect(dt.set({ month: 1, day: 13 }).toFormat("o")).toBe("13"); expect(dt.set({ month: 1, day: 8 }).toFormat("o")).toBe("8"); }); test("DateTime#toFormat('ooo') returns an unpadded ordinal", () => { expect(dt.toFormat("ooo")).toBe("145"); expect(dt.set({ month: 1, day: 13 }).toFormat("ooo")).toBe("013"); expect(dt.set({ month: 1, day: 8 }).toFormat("ooo")).toBe("008"); }); test("DateTime#toFormat('q') returns an unpadded quarter", () => { expect(dt.toFormat("q")).toBe("2"); expect(dt.set({ month: 2 }).toFormat("q")).toBe("1"); }); test("DateTime#toFormat('qq') returns a padded quarter", () => { expect(dt.toFormat("qq")).toBe("02"); expect(dt.set({ month: 2 }).toFormat("qq")).toBe("01"); }); test("DateTime#toFormat('D') returns a short date representation", () => { expect(dt.toFormat("D")).toBe("5/25/1982"); expect(dt.reconfigure({ locale: "fr" }).toFormat("D")).toBe("25/05/1982"); }); test("DateTime#toFormat('DD') returns a medium date representation", () => { expect(dt.toFormat("DD")).toBe("May 25, 1982"); expect(dt.set({ month: 8 }).toFormat("DD")).toBe("Aug 25, 1982"); expect(dt.reconfigure({ locale: "fr" }).toFormat("DD")).toBe("25 mai 1982"); expect(dt.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("DD")).toBe("25 févr. 1982"); }); test("DateTime#toFormat('DDD') returns a long date representation", () => { expect(dt.toFormat("DDD")).toBe("May 25, 1982"); expect(dt.set({ month: 8 }).toFormat("DDD")).toBe("August 25, 1982"); expect(dt.reconfigure({ locale: "fr" }).toFormat("DDD")).toBe("25 mai 1982"); expect(dt.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("DDD")).toBe( "25 février 1982" ); }); test("DateTime#toFormat('DDDD') returns a long date representation", () => { expect(dt.toFormat("DDDD")).toBe("Tuesday, May 25, 1982"); expect(dt.set({ month: 8 }).toFormat("DDDD")).toBe("Wednesday, August 25, 1982"); expect(dt.reconfigure({ locale: "fr" }).toFormat("DDDD")).toBe("mardi 25 mai 1982"); expect(dt.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("DDDD")).toBe( "jeudi 25 février 1982" ); }); test("DateTime#toFormat('t') returns a short time representation", () => { expect(dt.toFormat("t")).toBe("9:23 AM"); expect(dt.set({ hour: 13 }).toFormat("t")).toBe("1:23 PM"); expect(dt.reconfigure({ locale: "fr" }).toFormat("t")).toBe("09:23"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("t")).toBe("13:23"); }); test("DateTime#toFormat('T') returns a short 24-hour time representation", () => { expect(dt.toFormat("T")).toBe("09:23"); expect(dt.set({ hour: 13 }).toFormat("T")).toBe("13:23"); expect(dt.reconfigure({ locale: "fr" }).toFormat("T")).toBe("09:23"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("T")).toBe("13:23"); }); test("DateTime#toFormat('tt') returns a medium time representation", () => { expect(dt.toFormat("tt")).toBe("9:23:54 AM"); expect(dt.set({ hour: 13 }).toFormat("tt")).toBe("1:23:54 PM"); expect(dt.reconfigure({ locale: "fr" }).toFormat("tt")).toBe("09:23:54"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("tt")).toBe("13:23:54"); }); test("DateTime#toFormat('TT') returns a medium 24-hour time representation", () => { expect(dt.toFormat("TT")).toBe("09:23:54"); expect(dt.set({ hour: 13 }).toFormat("TT")).toBe("13:23:54"); expect(dt.reconfigure({ locale: "fr" }).toFormat("TT")).toBe("09:23:54"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("TT")).toBe("13:23:54"); }); test("DateTime#toFormat('ttt') returns a medium time representation", () => { // these seem to fail on Travis // expect(dt.toFormat('ttt')).toBe('9:23:54 AM GMT'); // expect(dt.set({ hour: 13 }).toFormat('ttt')).toBe('1:23:54 PM GMT'); // expect(dt.reconfigure({ locale: 'fr' }).toFormat('ttt')).toBe('09:23:54 UTC'); // expect(dt.set({ hour: 13 }).reconfigure({ locale: 'fr' }).toFormat('ttt')).toBe('13:23:54 UTC'); }); test("DateTime#toFormat('TTT') returns a medium time representation", () => { // these seem to fail on Travis // expect(dt.toFormat('TTT')).toBe('09:23:54 GMT'); // expect(dt.set({ hour: 13 }).toFormat('TTT')).toBe('13:23:54 GMT'); // expect(dt.reconfigure({locale: 'fr' }).toFormat('TTT')).toBe('09:23:54 UTC'); // expect(dt.set({hour: 13 }).reconfigure({ locale: 'fr' }).toFormat('TTT')).toBe('13:23:54 UTC'); }); test("DateTime#toFormat('f') returns a short date/time representation without seconds", () => { expect(dt.toFormat("f").replace(/\s+/g, " ")).toBe("5/25/1982, 9:23 AM"); expect(dt.set({ hour: 13 }).toFormat("f").replace(/\s+/g, " ")).toBe("5/25/1982, 1:23 PM"); expect(dt.reconfigure({ locale: "fr" }).toFormat("f")).toBe("25/05/1982 09:23"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("f")).toBe("25/05/1982 13:23"); }); test("DateTime#toFormat('ff') returns a medium date/time representation without seconds", () => { expect(dt.toFormat("ff").replace(/\s+/g, " ")).toBe("May 25, 1982, 9:23 AM"); expect(dt.set({ hour: 13 }).toFormat("ff").replace(/\s+/g, " ")).toBe("May 25, 1982, 1:23 PM"); expect(dt.set({ month: 8 }).toFormat("ff").replace(/\s+/g, " ")).toBe("Aug 25, 1982, 9:23 AM"); expect(dt.reconfigure({ locale: "fr" }).toFormat("ff")).toBe("25 mai 1982, 09:23"); expect(dt.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("ff")).toBe( "25 févr. 1982, 09:23" ); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("ff")).toBe( "25 mai 1982, 13:23" ); }); test("DateTime#toFormat('fff') returns a medium date/time representation without seconds", () => { expect(ny.toFormat("fff")).toBe("May 25, 1982 at 9:23 AM EDT"); expect(ny.set({ hour: 13 }).toFormat("fff")).toBe("May 25, 1982 at 1:23 PM EDT"); expect(ny.set({ month: 8 }).toFormat("fff")).toBe("August 25, 1982 at 9:23 AM EDT"); expect(ny.reconfigure({ locale: "fr" }).toFormat("fff")).toBe("25 mai 1982 à 09:23 UTC−4"); expect(ny.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("fff")).toBe( "25 février 1982 à 09:23 UTC−5" ); expect(ny.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("fff")).toBe( "25 mai 1982 à 13:23 UTC−4" ); }); test("DateTime#toFormat('ffff') returns a long date/time representation without seconds", () => { expect(ny.toFormat("ffff")).toBe("Tuesday, May 25, 1982 at 9:23 AM Eastern Daylight Time"); expect(ny.set({ hour: 13 }).toFormat("ffff")).toBe( "Tuesday, May 25, 1982 at 1:23 PM Eastern Daylight Time" ); expect(ny.set({ month: 2 }).toFormat("ffff")).toBe( "Thursday, February 25, 1982 at 9:23 AM Eastern Standard Time" ); expect(ny.reconfigure({ locale: "fr" }).toFormat("ffff")).toBe( "mardi 25 mai 1982 à 09:23 heure d’été de l’Est nord-américain" ); expect(ny.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("ffff")).toBe( "jeudi 25 février 1982 à 09:23 heure normale de l’Est nord-américain" ); expect(ny.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("ffff")).toBe( "mardi 25 mai 1982 à 13:23 heure d’été de l’Est nord-américain" ); }); test("DateTime#toFormat('F') returns a short date/time representation with seconds", () => { expect(dt.toFormat("F").replace(/\s+/g, " ")).toBe("5/25/1982, 9:23:54 AM"); expect(dt.set({ hour: 13 }).toFormat("F").replace(/\s+/g, " ")).toBe("5/25/1982, 1:23:54 PM"); expect(dt.reconfigure({ locale: "fr" }).toFormat("F")).toBe("25/05/1982 09:23:54"); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("F")).toBe( "25/05/1982 13:23:54" ); }); test("DateTime#toFormat('FF') returns a medium date/time representation with seconds", () => { expect(dt.toFormat("FF").replace(/\s+/g, " ")).toBe("May 25, 1982, 9:23:54 AM"); expect(dt.set({ hour: 13 }).toFormat("FF").replace(/\s+/g, " ")).toBe("May 25, 1982, 1:23:54 PM"); expect(dt.set({ month: 8 }).toFormat("FF").replace(/\s+/g, " ")).toBe("Aug 25, 1982, 9:23:54 AM"); expect(dt.reconfigure({ locale: "fr" }).toFormat("FF")).toBe("25 mai 1982, 09:23:54"); expect(dt.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("FF")).toBe( "25 févr. 1982, 09:23:54" ); expect(dt.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("FF")).toBe( "25 mai 1982, 13:23:54" ); }); test("DateTime#toFormat('FFF') returns a medium date/time representation without seconds", () => { expect(ny.toFormat("FFF")).toBe("May 25, 1982 at 9:23:54 AM EDT"); expect(ny.set({ hour: 13 }).toFormat("FFF")).toBe("May 25, 1982 at 1:23:54 PM EDT"); expect(ny.set({ month: 8 }).toFormat("FFF")).toBe("August 25, 1982 at 9:23:54 AM EDT"); expect(ny.reconfigure({ locale: "fr" }).toFormat("FFF")).toBe("25 mai 1982 à 9:23:54 UTC−4"); expect(ny.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("FFF")).toBe( "25 février 1982 à 9:23:54 UTC−5" ); expect(ny.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("FFF")).toBe( "25 mai 1982 à 13:23:54 UTC−4" ); }); test("DateTime#toFormat('FFFF') returns a long date/time representation without seconds", () => { expect(ny.toFormat("FFFF")).toBe("Tuesday, May 25, 1982 at 9:23:54 AM Eastern Daylight Time"); expect(ny.set({ hour: 13 }).toFormat("FFFF")).toBe( "Tuesday, May 25, 1982 at 1:23:54 PM Eastern Daylight Time" ); expect(ny.set({ month: 2 }).toFormat("FFFF")).toBe( "Thursday, February 25, 1982 at 9:23:54 AM Eastern Standard Time" ); expect(ny.reconfigure({ locale: "fr" }).toFormat("FFFF")).toBe( "mardi 25 mai 1982 à 9:23:54 heure d’été de l’Est nord-américain" ); expect(ny.set({ month: 2 }).reconfigure({ locale: "fr" }).toFormat("FFFF")).toBe( "jeudi 25 février 1982 à 9:23:54 heure normale de l’Est nord-américain" ); expect(ny.set({ hour: 13 }).reconfigure({ locale: "fr" }).toFormat("FFFF")).toBe( "mardi 25 mai 1982 à 13:23:54 heure d’été de l’Est nord-américain" ); }); test("DateTime#toFormat returns a full formatted string", () => { expect(dt.toFormat("MM/yyyy GG")).toBe("05/1982 Anno Domini"); }); test("DateTime#toFormat() accepts literals in single quotes", () => { expect(dt.toFormat("dd/MM/yyyy 'at' hh:mm")).toBe("25/05/1982 at 09:23"); expect(dt.toFormat("MMdd'T'hh")).toBe("0525T09"); }); test("DateTime#toFormat() uses the numbering system", () => { expect(dt.reconfigure({ numberingSystem: "beng" }).toFormat("S")).toBe("১২৩"); expect(dt.toFormat("S", { numberingSystem: "beng" })).toBe("১২৩"); }); test("DateTime#toFormat() uses the output calendar", () => { expect(dt.reconfigure({ outputCalendar: "islamic" }).toFormat("MMMM yyyy")).toBe("Shaʻban 1402"); expect(dt.toFormat("MMMM yyyy", { outputCalendar: "islamic" })).toBe("Shaʻban 1402"); }); test("DateTime#toFormat() returns something different for invalid DateTimes", () => { expect(DateTime.invalid("because").toFormat("dd MM yyyy")).toBe("Invalid DateTime"); }); test("DateTime#toFormat('X') returns a Unix timestamp in seconds", () => { expect(dt.toFormat("X")).toBe("391166634"); }); test("DateTime#toFormat('X') rounds down", () => { expect(dt.plus(500).toFormat("X")).toBe("391166634"); }); test("DateTime#toFormat('x') returns a Unix timestamp in milliseconds", () => { expect(dt.toFormat("x")).toBe("391166634123"); }); test("DateTime#toFormat('n')", () => { expect(DateTime.fromISO("2012-01-01", { locale: "de-DE" }).toFormat("n")).toBe("52"); expect(DateTime.fromISO("2012-01-01", { locale: "en-US" }).toFormat("n")).toBe("1"); }); test("DateTime#toFormat('nn')", () => { expect(DateTime.fromISO("2012-01-01", { locale: "de-DE" }).toFormat("nn")).toBe("52"); expect(DateTime.fromISO("2012-01-01", { locale: "en-US" }).toFormat("nn")).toBe("01"); }); test("DateTime#toFormat('ii')", () => { expect(DateTime.fromISO("2012-01-01", { locale: "de-DE" }).toFormat("ii")).toBe("11"); expect(DateTime.fromISO("2012-01-01", { locale: "en-US" }).toFormat("ii")).toBe("12"); }); test("DateTime#toFormat('iiii')", () => { expect(DateTime.fromISO("2012-01-01", { locale: "de-DE" }).toFormat("iiii")).toBe("2011"); expect(DateTime.fromISO("2012-01-01", { locale: "en-US" }).toFormat("iiii")).toBe("2012"); }); moment-luxon-93c85a3/test/datetime/tokenParse.test.js000066400000000000000000001223721477254173100227410ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; import Helpers, { cldrMajorVersion } from "../helpers"; import Settings from "../../src/settings"; import { ConflictingSpecificationError } from "../../src/errors"; //------ // .fromFormat //------- test("DateTime.fromFormat() parses basic times", () => { const i = DateTime.fromFormat("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); expect(i.hour).toBe(9); expect(i.minute).toBe(10); expect(i.second).toBe(11); expect(i.millisecond).toBe(445); }); test("DateTime.fromFormat() yields Invalid reason 'unparseable' for incompatible formats", () => { const i = DateTime.fromFormat("Mar 3, 2020", "MMM dd, yyyy"); expect(i.invalid).not.toBeNull; expect(i.invalid.reason).toEqual("unparsable"); }); test("DateTime.fromFormat() parses with variable-length input", () => { let i = DateTime.fromFormat("1982/05/03 09:07:05.004", "y/M/d H:m:s.S"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(3); expect(i.hour).toBe(9); expect(i.minute).toBe(7); expect(i.second).toBe(5); expect(i.millisecond).toBe(4); i = DateTime.fromFormat("82/5/3 9:7:5.4", "yy/M/d H:m:s.S"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(3); expect(i.hour).toBe(9); expect(i.minute).toBe(7); expect(i.second).toBe(5); expect(i.millisecond).toBe(4); }); test("DateTime.fromFormat() parses meridiems", () => { let i = DateTime.fromFormat("1982/05/25 9 PM", "yyyy/MM/dd h a"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); expect(i.hour).toBe(21); i = DateTime.fromFormat("1982/05/25 9 AM", "yyyy/MM/dd h a"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); expect(i.hour).toBe(9); i = DateTime.fromFormat("1982/05/25 12 AM", "yyyy/MM/dd h a"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); expect(i.hour).toBe(0); i = DateTime.fromFormat("1982/05/25 12 PM", "yyyy/MM/dd h a"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); expect(i.hour).toBe(12); }); test("DateTime.fromFormat() throws if you specify meridiem with 24-hour time", () => { expect(() => DateTime.fromFormat("930PM", "Hmma")).toThrow(ConflictingSpecificationError); }); // #714 test("DateTime.fromFormat() makes dots optional and handles non breakable spaces", () => { function parseMeridiem(input, isAM) { const d = DateTime.fromFormat(input, "hh:mm a"); expect(d.hour).toBe(isAM ? 10 : 22); expect(d.minute).toBe(45); expect(d.second).toBe(0); } // Meridiem for this locale is "a. m." or "p. m.", with a non breakable space Helpers.withDefaultLocale("es-ES", () => { parseMeridiem("10:45 a. m.", true); parseMeridiem("10:45 a. m", true); parseMeridiem("10:45 a m.", true); parseMeridiem("10:45 a m", true); parseMeridiem("10:45 p. m.", false); parseMeridiem("10:45 p. m", false); parseMeridiem("10:45 p m.", false); parseMeridiem("10:45 p m", false); const nbsp = String.fromCharCode(160); parseMeridiem(`10:45 a.${nbsp}m.`, true); parseMeridiem(`10:45 a.${nbsp}m`, true); parseMeridiem(`10:45 a${nbsp}m.`, true); parseMeridiem(`10:45 a${nbsp}m`, true); parseMeridiem(`10:45 p.${nbsp}m.`, false); parseMeridiem(`10:45 p.${nbsp}m`, false); parseMeridiem(`10:45 p${nbsp}m.`, false); parseMeridiem(`10:45 p${nbsp}m`, false); }); }); test("DateTime.fromFormat() parses variable-digit years", () => { expect(DateTime.fromFormat("", "y").isValid).toBe(false); expect(DateTime.fromFormat("2", "y").year).toBe(2); expect(DateTime.fromFormat("22", "y").year).toBe(22); expect(DateTime.fromFormat("222", "y").year).toBe(222); expect(DateTime.fromFormat("2222", "y").year).toBe(2222); expect(DateTime.fromFormat("22222", "y").year).toBe(22222); expect(DateTime.fromFormat("222222", "y").year).toBe(222222); expect(DateTime.fromFormat("2222222", "y").isValid).toBe(false); }); test("DateTime.fromFormat() with yyyyy optionally parses extended years", () => { expect(DateTime.fromFormat("222", "yyyyy").isValid).toBe(false); expect(DateTime.fromFormat("2222", "yyyyy").year).toBe(2222); expect(DateTime.fromFormat("22222", "yyyyy").year).toBe(22222); expect(DateTime.fromFormat("222222", "yyyyy").year).toBe(222222); expect(DateTime.fromFormat("2222222", "yyyyy").isValid).toBe(false); }); test("DateTime.fromFormat() with yyyyyy strictly parses extended years", () => { expect(DateTime.fromFormat("2222", "yyyyyy").isValid).toBe(false); expect(DateTime.fromFormat("222222", "yyyyyy").year).toBe(222222); expect(DateTime.fromFormat("022222", "yyyyyy").year).toBe(22222); expect(DateTime.fromFormat("2222222", "yyyyyy").isValid).toBe(false); }); test("DateTime.fromFormat() defaults yy to the right century", () => { expect(DateTime.fromFormat("60", "yy").year).toBe(2060); expect(DateTime.fromFormat("61", "yy").year).toBe(1961); expect(DateTime.fromFormat("1960", "yy").year).toBe(1960); }); test("DateTime.fromFormat() respects Settings.twoDigitCutoffYear when parsing yy to the right century", () => { const oldTwoDigitCutoffYear = Settings.twoDigitCutoffYear; try { Settings.twoDigitCutoffYear = 50; expect(DateTime.fromFormat("50", "yy").year).toBe(2050); expect(DateTime.fromFormat("51", "yy").year).toBe(1951); expect(DateTime.fromFormat("1950", "yy").year).toBe(1950); } finally { Settings.twoDigitCutoffYear = oldTwoDigitCutoffYear; } }); test("DateTime.fromFormat() parses hours", () => { expect(DateTime.fromFormat("5", "h").hour).toBe(5); expect(DateTime.fromFormat("12", "h").hour).toBe(12); expect(DateTime.fromFormat("05", "hh").hour).toBe(5); expect(DateTime.fromFormat("12", "hh").hour).toBe(12); expect(DateTime.fromFormat("5", "H").hour).toBe(5); expect(DateTime.fromFormat("13", "H").hour).toBe(13); expect(DateTime.fromFormat("05", "HH").hour).toBe(5); expect(DateTime.fromFormat("13", "HH").hour).toBe(13); }); test("DateTime.fromFormat() parses milliseconds", () => { expect(DateTime.fromFormat("1", "S").millisecond).toBe(1); expect(DateTime.fromFormat("12", "S").millisecond).toBe(12); expect(DateTime.fromFormat("123", "S").millisecond).toBe(123); expect(DateTime.fromFormat("1234", "S").isValid).toBe(false); expect(DateTime.fromFormat("1", "S").millisecond).toBe(1); expect(DateTime.fromFormat("12", "S").millisecond).toBe(12); expect(DateTime.fromFormat("123", "S").millisecond).toBe(123); expect(DateTime.fromFormat("1", "SSS").isValid).toBe(false); expect(DateTime.fromFormat("12", "SSS").isValid).toBe(false); expect(DateTime.fromFormat("123", "SSS").millisecond).toBe(123); expect(DateTime.fromFormat("023", "SSS").millisecond).toBe(23); expect(DateTime.fromFormat("1234", "SSS").isValid).toBe(false); }); test("DateTime.fromFormat() parses fractional seconds", () => { expect(DateTime.fromFormat("1", "u").millisecond).toBe(100); expect(DateTime.fromFormat("12", "u").millisecond).toBe(120); expect(DateTime.fromFormat("123", "u").millisecond).toBe(123); expect(DateTime.fromFormat("023", "u").millisecond).toBe(23); expect(DateTime.fromFormat("003", "u").millisecond).toBe(3); expect(DateTime.fromFormat("1234", "u").millisecond).toBe(123); expect(DateTime.fromFormat("1235", "u").millisecond).toBe(123); expect(DateTime.fromFormat("1", "uu").millisecond).toBe(100); expect(DateTime.fromFormat("12", "uu").millisecond).toBe(120); expect(DateTime.fromFormat("02", "uu").millisecond).toBe(20); expect(DateTime.fromFormat("-33", "uu").isValid).toBe(false); expect(DateTime.fromFormat("1", "uuu").millisecond).toBe(100); expect(DateTime.fromFormat("-2", "uuu").isValid).toBe(false); }); test("DateTime.fromFormat() parses weekdays", () => { expect(DateTime.fromFormat("5", "E").weekday).toBe(5); expect(DateTime.fromFormat("5", "c").weekday).toBe(5); expect(DateTime.fromFormat("Fri", "EEE").weekday).toBe(5); expect(DateTime.fromFormat("Fri", "ccc").weekday).toBe(5); expect(DateTime.fromFormat("Friday", "EEEE").weekday).toBe(5); expect(DateTime.fromFormat("Friday", "cccc").weekday).toBe(5); }); test("DateTime.fromFormat() parses eras", () => { let dt = DateTime.fromFormat("0206 AD", "yyyy G"); expect(dt.year).toEqual(206); dt = DateTime.fromFormat("0206 BC", "yyyy G"); expect(dt.year).toEqual(-206); dt = DateTime.fromFormat("0206 Before Christ", "yyyy GG"); expect(dt.year).toEqual(-206); }); test("DateTime.fromFormat() parses variable-length days", () => { let i = DateTime.fromFormat("Mar 3, 2020", "MMM d, yyyy"); expect(i.day).toBe(3); i = DateTime.fromFormat("Mar 13, 2020", "MMM d, yyyy"); expect(i.day).toBe(13); }); test("DateTime.fromFormat() parses fixed-length days", () => { let i = DateTime.fromFormat("Mar 03, 2020", "MMM dd, yyyy"); expect(i.day).toBe(3); i = DateTime.fromFormat("Mar 13, 2020", "MMM dd, yyyy"); expect(i.day).toBe(13); }); test("DateTime.fromFormat() parses standalone month names", () => { let i = DateTime.fromFormat("May 25 1982", "LLLL dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("Sep 25 1982", "LLL dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(9); expect(i.day).toBe(25); i = DateTime.fromFormat("5 25 1982", "L dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("05 25 1982", "LL dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("mai 25 1982", "LLLL dd yyyy", { locale: "fr" }); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("janv. 25 1982", "LLL dd yyyy", { locale: "fr" }); expect(i.year).toBe(1982); expect(i.month).toBe(1); expect(i.day).toBe(25); }); test("DateTime.fromFormat() parses format month names", () => { let i = DateTime.fromFormat("May 25 1982", "MMMM dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("Sep 25 1982", "MMM dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(9); expect(i.day).toBe(25); i = DateTime.fromFormat("5 25 1982", "M dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("05 25 1982", "MM dd yyyy"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("mai 25 1982", "MMMM dd yyyy", { locale: "fr" }); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); i = DateTime.fromFormat("janv. 25 1982", "MMM dd yyyy", { locale: "fr" }); expect(i.year).toBe(1982); expect(i.month).toBe(1); expect(i.day).toBe(25); }); test("DateTime.fromFormat() parses quarters", () => { const i = DateTime.fromFormat("1982Q2", "yyyy'Q'q"); expect(i.year).toBe(1982); expect(i.month).toBe(4); expect(i.quarter).toBe(2); expect(DateTime.fromFormat("2019Q1", "yyyy'Q'q").month).toBe(1); expect(DateTime.fromFormat("2019Q2", "yyyy'Q'q").month).toBe(4); expect(DateTime.fromFormat("2019Q3", "yyyy'Q'q").month).toBe(7); expect(DateTime.fromFormat("2019Q4", "yyyy'Q'q").month).toBe(10); expect(DateTime.fromFormat("2019Q01", "yyyy'Q'qq").month).toBe(1); expect(DateTime.fromFormat("2019Q02", "yyyy'Q'qq").month).toBe(4); expect(DateTime.fromFormat("2019Q03", "yyyy'Q'qq").month).toBe(7); expect(DateTime.fromFormat("2019Q04", "yyyy'Q'qq").month).toBe(10); }); test("DateTime.fromFormat() makes trailing periods in month names optional", () => { const i = DateTime.fromFormat("janv 25 1982", "LLL dd yyyy", { locale: "fr", }); expect(i.year).toBe(1982); expect(i.month).toBe(1); expect(i.day).toBe(25); }); test("DateTime.fromFormat() does not match arbitrary stuff with those periods", () => { const i = DateTime.fromFormat("janvQ 25 1982", "LLL dd yyyy", { locale: "fr", }); expect(i.isValid).toBe(false); }); test("DateTime.fromFormat() uses case-insensitive matching", () => { const i = DateTime.fromFormat("Janv. 25 1982", "LLL dd yyyy", { locale: "fr", }); expect(i.year).toBe(1982); expect(i.month).toBe(1); expect(i.day).toBe(25); }); test("DateTime.fromFormat() parses offsets", () => {}); test("DateTime.fromFormat() validates weekday numbers", () => { let d = DateTime.fromFormat("2, 05/25/1982", "E, LL/dd/yyyy"); expect(d.year).toBe(1982); expect(d.month).toBe(5); expect(d.day).toBe(25); d = DateTime.fromFormat("1, 05/25/1982", "E, LL/dd/yyyy"); expect(d.isValid).toBeFalsy(); }); test("DateTime.fromFormat() validates weekday names", () => { let d = DateTime.fromFormat("Tuesday, 05/25/1982", "EEEE, LL/dd/yyyy"); expect(d.isValid).toBe(true); expect(d.year).toBe(1982); expect(d.month).toBe(5); expect(d.day).toBe(25); d = DateTime.fromFormat("Monday, 05/25/1982", "EEEE, LL/dd/yyyy"); expect(d.isValid).toBeFalsy(); d = DateTime.fromFormat("mardi, 05/25/1982", "EEEE, LL/dd/yyyy", { locale: "fr", }); expect(d.isValid).toBe(true); expect(d.year).toBe(1982); expect(d.month).toBe(5); expect(d.day).toBe(25); }); test("DateTime.fromFormat() defaults weekday to this week", () => { const d = DateTime.fromFormat("Monday", "EEEE"), now = DateTime.now(); expect(d.weekYear).toBe(now.weekYear); expect(d.weekNumber).toBe(now.weekNumber); expect(d.weekday).toBe(1); const d2 = DateTime.fromFormat("3", "E"); expect(d2.weekYear).toBe(now.weekYear); expect(d2.weekNumber).toBe(now.weekNumber); expect(d2.weekday).toBe(3); }); test("DateTime.fromFormat() parses ordinals", () => { let d = DateTime.fromFormat("2016 200", "yyyy ooo"); expect(d.year).toBe(2016); expect(d.ordinal).toBe(200); d = DateTime.fromFormat("2016 200", "yyyy ooo"); expect(d.year).toBe(2016); expect(d.ordinal).toBe(200); d = DateTime.fromFormat("2016 016", "yyyy ooo"); expect(d.year).toBe(2016); expect(d.ordinal).toBe(16); d = DateTime.fromFormat("2016 200", "yyyy o"); expect(d.year).toBe(2016); expect(d.ordinal).toBe(200); d = DateTime.fromFormat("2016 16", "yyyy o"); expect(d.year).toBe(2016); expect(d.ordinal).toBe(16); }); test("DateTime.fromFormat() throws on mixed units", () => { expect(() => { DateTime.fromFormat("2017 34", "yyyy WW"); }).toThrow(); expect(() => { DateTime.fromFormat("2017 05 340", "yyyy MM ooo"); }).toThrow(); }); test("DateTime.fromFormat() accepts weekYear by itself", () => { let d = DateTime.fromFormat("2004", "kkkk"); expect(d.weekYear).toBe(2004); expect(d.weekNumber).toBe(1); expect(d.weekday).toBe(1); d = DateTime.fromFormat("04", "kk"); expect(d.weekYear).toBe(2004); expect(d.weekNumber).toBe(1); expect(d.weekday).toBe(1); }); test("DateTime.fromFormat() defaults kk to the right century", () => { expect(DateTime.fromFormat("60", "kk").weekYear).toBe(2060); expect(DateTime.fromFormat("61", "kk").weekYear).toBe(1961); expect(DateTime.fromFormat("1960", "kk").weekYear).toBe(1960); }); test("DateTime.fromFormat() respects Settings.twoDigitCutoffYear when parsing two digit weekYear to the right century", () => { const oldTwoDigitCutoffYear = Settings.twoDigitCutoffYear; try { Settings.twoDigitCutoffYear = 50; expect(DateTime.fromFormat("50", "kk").weekYear).toBe(2050); expect(DateTime.fromFormat("51", "kk").weekYear).toBe(1951); expect(DateTime.fromFormat("1950", "kk").weekYear).toBe(1950); } finally { Settings.twoDigitCutoffYear = oldTwoDigitCutoffYear; } }); test("DateTime.fromFormat() accepts weekNumber by itself", () => { const now = DateTime.now(); let d = DateTime.fromFormat("17", "WW"); expect(d.weekYear).toBe(now.weekYear); expect(d.weekNumber).toBe(17); expect(d.weekday).toBe(1); d = DateTime.fromFormat("17", "W"); expect(d.weekYear).toBe(now.weekYear); expect(d.weekNumber).toBe(17); expect(d.weekday).toBe(1); }); test("DateTime.fromFormat() accepts weekYear/weekNumber/weekday", () => { const d = DateTime.fromFormat("2004 17 2", "kkkk WW E"); expect(d.weekYear).toBe(2004); expect(d.weekNumber).toBe(17); expect(d.weekday).toBe(2); }); test("DateTime.fromFormat() allows regex content", () => { const d = DateTime.fromFormat("Monday", "EEEE"), now = DateTime.now(); expect(d.weekYear).toBe(now.weekYear); expect(d.weekNumber).toBe(now.weekNumber); expect(d.weekday).toBe(1); }); test("DateTime.fromFormat() allows literals", () => { const i = DateTime.fromFormat("1982/05/25 hello 09:10:11.445", "yyyy/MM/dd 'hello' HH:mm:ss.SSS"); expect(i.year).toBe(1982); expect(i.month).toBe(5); expect(i.day).toBe(25); expect(i.hour).toBe(9); expect(i.minute).toBe(10); expect(i.second).toBe(11); expect(i.millisecond).toBe(445); }); test("DateTime.fromFormat() returns invalid when unparsed", () => { expect(DateTime.fromFormat("Splurk", "EEEE").isValid).toBe(false); }); test("DateTime.fromFormat() returns invalid when quarter value is not valid", () => { expect(DateTime.fromFormat("2019Qaa", "yyyy'Q'qq").isValid).toBe(false); expect(DateTime.fromFormat("2019Q00", "yyyy'Q'qq").isValid).toBe(false); expect(DateTime.fromFormat("2019Q0", "yyyy'Q'q").isValid).toBe(false); expect(DateTime.fromFormat("2019Q1", "yyyy'Q'q").isValid).toBe(true); expect(DateTime.fromFormat("2019Q5", "yyyy'Q'q").isValid).toBe(false); }); test("DateTime.fromFormat() returns invalid for out-of-range values", () => { const rejects = (s, fmt, opts = {}) => expect(DateTime.fromFormat(s, fmt, opts).isValid).toBeFalsy(); rejects("8, 05/25/1982", "E, MM/dd/yyyy", { locale: "fr" }); rejects("Tuesday, 05/25/1982", "EEEE, MM/dd/yyyy", { locale: "fr" }); rejects("Giberish, 05/25/1982", "EEEE, MM/dd/yyyy"); rejects("14/25/1982", "MM/dd/yyyy"); rejects("05/46/1982", "MM/dd/yyyy"); }); test("DateTime.fromFormat() accepts a zone argument", () => { const d = DateTime.fromFormat("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS", { zone: "Asia/Tokyo", }); expect(d.zoneName).toBe("Asia/Tokyo"); expect(d.offset).toBe(9 * 60); expect(d.year).toBe(1982); expect(d.month).toBe(5); expect(d.day).toBe(25); expect(d.hour).toBe(9); expect(d.minute).toBe(10); expect(d.second).toBe(11); expect(d.millisecond).toBe(445); }); test("DateTime.fromFormat() parses IANA zones", () => { let d = DateTime.fromFormat( "1982/05/25 09:10:11.445 Asia/Tokyo", "yyyy/MM/dd HH:mm:ss.SSS z" ).toUTC(); expect(d.isValid).toBe(true); expect(d.offset).toBe(0); expect(d.hour).toBe(0); expect(d.minute).toBe(10); d = DateTime.fromFormat("1982/05/25 09:10:11.445 UTC", "yyyy/MM/dd HH:mm:ss.SSS z").toUTC(); expect(d.isValid).toBe(true); expect(d.offset).toBe(0); expect(d.hour).toBe(9); expect(d.minute).toBe(10); }); test("DateTime.fromFormat() with setZone parses IANA zones and sets it", () => { const d = DateTime.fromFormat("1982/05/25 09:10:11.445 Asia/Tokyo", "yyyy/MM/dd HH:mm:ss.SSS z", { setZone: true, }); expect(d.zoneName).toBe("Asia/Tokyo"); expect(d.offset).toBe(9 * 60); expect(d.hour).toBe(9); expect(d.minute).toBe(10); }); test("DateTime.fromFormat() parses fixed offsets", () => { const formats = [ ["Z", "-4"], ["ZZ", "-4:00"], ["ZZZ", "-0400"], ]; for (const i in formats) { if (Object.prototype.hasOwnProperty.call(formats, i)) { const [format, example] = formats[i], dt = DateTime.fromFormat( `1982/05/25 09:10:11.445 ${example}`, `yyyy/MM/dd HH:mm:ss.SSS ${format}` ); expect(dt.toUTC().hour).toBe(13); expect(dt.toUTC().minute).toBe(10); } } }); test("DateTime.fromFormat() with setZone parses fixed offsets and sets it", () => { const formats = [ ["Z", "-4"], ["ZZ", "-4:00"], ["ZZZ", "-0400"], ]; for (const i in formats) { if (Object.prototype.hasOwnProperty.call(formats, i)) { const [format, example] = formats[i], dt = DateTime.fromFormat( `1982/05/25 09:10:11.445 ${example}`, `yyyy/MM/dd HH:mm:ss.SSS ${format}`, { setZone: true } ); expect(dt.offset).toBe(-4 * 60); expect(dt.toUTC().hour).toBe(13); expect(dt.toUTC().minute).toBe(10); } } }); test("DateTime.fromFormat() prefers IANA zone id", () => { const i = DateTime.fromFormat( "2021-11-12T09:07:13.000+08:00[Australia/Perth]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[z]", { setZone: true } ); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(11); expect(i.day).toBe(12); expect(i.hour).toBe(9); expect(i.minute).toBe(7); expect(i.second).toBe(13); expect(i.millisecond).toBe(0); expect(i.offset).toBe(480); //+08:00 expect(i.zoneName).toBe("Australia/Perth"); }); test("DateTime.fromFormat() ignores numerical offsets when they conflict with the zone", () => { // +11:00 is not a valid offset for the Australia/Perth time zone const i = DateTime.fromFormat( "2021-11-12T09:07:13.000+11:00[Australia/Perth]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[z]", { setZone: true } ); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(11); expect(i.day).toBe(12); expect(i.hour).toBe(9); expect(i.minute).toBe(7); expect(i.second).toBe(13); expect(i.millisecond).toBe(0); expect(i.offset).toBe(480); //+08:00 expect(i.zoneName).toBe("Australia/Perth"); }); test("DateTime.fromFormat() ignores numerical offsets when they are are wrong right now", () => { // DST is not in effect at this timestamp, so +10:00 is the correct offset const i = DateTime.fromFormat( "2021-10-03T01:30:00.000+11:00[Australia/Sydney]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[z]", { setZone: true } ); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(10); expect(i.day).toBe(3); expect(i.hour).toBe(1); expect(i.minute).toBe(30); expect(i.second).toBe(0); expect(i.millisecond).toBe(0); expect(i.offset).toBe(600); //+10:00 expect(i.zoneName).toBe("Australia/Sydney"); }); test("DateTime.fromFormat() maintains offset that belongs to time zone during overlap", () => { // On this day, 02:30 exists for both offsets, due to DST ending. let i = DateTime.fromFormat( "2021-04-04T02:30:00.000+11:00[Australia/Sydney]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[z]", { setZone: true } ); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(4); expect(i.day).toBe(4); expect(i.hour).toBe(2); expect(i.minute).toBe(30); expect(i.second).toBe(0); expect(i.millisecond).toBe(0); expect(i.offset).toBe(660); //+11:00 expect(i.zoneName).toBe("Australia/Sydney"); i = DateTime.fromFormat( "2021-04-04T02:30:00.000+10:00[Australia/Sydney]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[z]", { setZone: true } ); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(4); expect(i.day).toBe(4); expect(i.hour).toBe(2); expect(i.minute).toBe(30); expect(i.second).toBe(0); expect(i.millisecond).toBe(0); expect(i.offset).toBe(600); //+10:00 expect(i.zoneName).toBe("Australia/Sydney"); }); test("DateTime.format() uses local zone when setZone is false and offset in input", () => { const i = DateTime.fromFormat("2021-11-12T09:07:13.000+08:00", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ", { setZone: false, }); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(11); expect(i.day).toBe(11); expect(i.hour).toBe(20); expect(i.minute).toBe(7); expect(i.second).toBe(13); expect(i.millisecond).toBe(0); expect(i.offset).toBe(-300); expect(i.zoneName).toBe("America/New_York"); }); test("DateTime.format() uses local zone when setZone is false and zone id in input", () => { const i = DateTime.fromFormat( "2021-11-12T09:07:13.000+08:00[Australia/Perth]", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ[z]", { setZone: false } ); expect(i.isValid).toBe(true); expect(i.year).toBe(2021); expect(i.month).toBe(11); expect(i.day).toBe(11); expect(i.hour).toBe(20); expect(i.minute).toBe(7); expect(i.second).toBe(13); expect(i.millisecond).toBe(0); expect(i.offset).toBe(-300); expect(i.zoneName).toBe("America/New_York"); }); test("DateTime.fromFormat() parses localized macro tokens", () => { const formatGroups = [ { formats: ["D", "DD", "DDD", "DDDD"], expectEqual: { year: true, month: true, day: true, }, }, { formats: ["t", "T"], expectEqual: { hour: true, minute: true, }, }, { formats: ["tt", "TT"], expectEqual: { hour: true, minute: true, second: true, }, }, { formats: ["F", "FF"], expectEqual: { year: true, month: true, day: true, hour: true, minute: true, second: true, }, }, // Parsing time zone names like `EDT` or `Eastern Daylight Time` is not supported { formats: ["ttt", "tttt", "TTT", "TTTT", "FFF", "FFFF"], expectInvalid: true, }, ]; const sampleDateTime = DateTime.fromMillis(1555555555555); for (const { formats, expectEqual, expectInvalid } of formatGroups) { for (const locale of [null, "en-gb", "de"]) { for (const format of formats) { const formatted = sampleDateTime.toFormat(format, { locale }); const parsed = DateTime.fromFormat(formatted, format, { locale }); if (expectInvalid) { expect(parsed.isValid).toBe(false); } else { expect(parsed.isValid).toBe(true); for (const key of Object.keys(expectEqual)) { expect(parsed[key]).toBe(sampleDateTime[key]); } } } } } }); test("DateTime.fromFormat() allows non-breaking white-space to be substituted inside macro-tokens", () => { expect(DateTime.fromFormat("5:54 PM", "t", { locale: "en-US" }).isValid).toBe(true); expect(DateTime.fromFormat("5:54 PM", "t", { locale: "en-US" }).isValid).toBe(true); expect(DateTime.fromFormat("5:54\nPM", "t", { locale: "en-US" }).isValid).toBe(false); }); test("DateTime.fromFormat() throws if you don't provide a format", () => { expect(() => DateTime.fromFormat("yo")).toThrowError(); }); test("DateTime.fromFormat validates weekdays", () => { let dt = DateTime.fromFormat("Wed 2017-11-29 02:00", "EEE yyyy-MM-dd HH:mm"); expect(dt.isValid).toBe(true); dt = DateTime.fromFormat("Thu 2017-11-29 02:00", "EEE yyyy-MM-dd HH:mm"); expect(dt.isValid).toBe(false); dt = DateTime.fromFormat("Wed 2017-11-29 02:00 +12:00", "EEE yyyy-MM-dd HH:mm ZZ"); expect(dt.isValid).toBe(true); dt = DateTime.fromFormat("Wed 2017-11-29 02:00 +12:00", "EEE yyyy-MM-dd HH:mm ZZ", { setZone: true, }); expect(dt.isValid).toBe(true); dt = DateTime.fromFormat("Tue 2017-11-29 02:00 +12:00", "EEE yyyy-MM-dd HH:mm ZZ", { setZone: true, }); expect(dt.isValid).toBe(false); }); test("DateTime.fromFormat containing special regex token", () => { const ianaFormat = "yyyy-MM-dd'T'HH-mm[z]"; const dt = DateTime.fromFormat("2019-01-14T11-30[Indian/Maldives]", ianaFormat, { setZone: true, }); expect(dt.isValid).toBe(true); expect(dt.zoneName).toBe("Indian/Maldives"); expect( DateTime.fromFormat("2019-01-14T11-30[[Indian/Maldives]]", "yyyy-MM-dd'T'HH-mm[[z]]").isValid ).toBe(true); expect( DateTime.fromFormat("2019-01-14T11-30tIndian/Maldivest", "yyyy-MM-dd'T'HH-mm't'z't'").isValid ).toBe(true); expect( DateTime.fromFormat("2019-01-14T11-30\tIndian/Maldives\t", "yyyy-MM-dd'T'HH-mm't'z't'").isValid ).toBe(false); }); // #1362 test("DateTime.fromFormat only an offset", () => { const dt = DateTime.fromFormat("+0100", "ZZZ", { setZone: true }); expect(dt.isValid).toBe(true); expect(dt.offset).toBe(60); }); //------ // .fromFormatExplain //------- function keyCount(o) { return Object.keys(o).length; } test("DateTime.fromFormatExplain() explains success", () => { const ex = DateTime.fromFormatExplain("May 25, 1982 09:10:12.445", "MMMM dd, yyyy HH:mm:ss.SSS"); expect(ex.rawMatches).toBeInstanceOf(Array); expect(ex.matches).toBeInstanceOf(Object); expect(keyCount(ex.matches)).toBe(7); expect(ex.result).toBeInstanceOf(Object); expect(keyCount(ex.result)).toBe(7); }); test("DateTime.fromFormatExplain() explains a bad match", () => { const ex = DateTime.fromFormatExplain("May 25, 1982 09:10:12.445", "MMMM dd, yyyy mmmm"); expect(ex.rawMatches).toBeNull(); expect(ex.matches).toBeInstanceOf(Object); expect(keyCount(ex.matches)).toBe(0); expect(ex.result).toBeInstanceOf(Object); expect(keyCount(ex.result)).toBe(0); }); test("DateTime.fromFormatExplain() parses zone correctly", () => { const ex = DateTime.fromFormatExplain( "America/New_York 1-April-2019 04:10:48 PM Mon", "z d-MMMM-yyyy hh:mm:ss a EEE" ); expect(ex.rawMatches).toBeInstanceOf(Array); expect(ex.matches).toBeInstanceOf(Object); expect(keyCount(ex.matches)).toBe(9); expect(ex.result).toBeInstanceOf(Object); expect(keyCount(ex.result)).toBe(7); expect(ex.matches).toEqual({ E: 1, M: 4, a: 1, d: 1, h: 16, m: 10, s: 48, y: 2019, z: "America/New_York", }); }); test("DateTime.fromFormatExplain() parses localized string with numberingSystem correctly", () => { const cldr = cldrMajorVersion(); const ex1 = DateTime.fromFormatExplain( cldr && cldr < 46 ? "೦೩-ಏಪ್ರಿಲ್-೨೦೧೯ ೧೨:೨೬:೦೭ ಅಪರಾಹ್ನ Asia/Calcutta" : "೦೩-ಏಪ್ರಿಲ್-೨೦೧೯ ೧೨:೨೬:೦೭ PM Asia/Calcutta", "dd-MMMM-yyyy hh:mm:ss a z", { locale: "kn", numberingSystem: "knda" } ); expect(ex1.rawMatches).toBeInstanceOf(Array); expect(ex1.matches).toBeInstanceOf(Object); expect(keyCount(ex1.matches)).toBe(8); expect(ex1.result).toBeInstanceOf(Object); expect(keyCount(ex1.result)).toBe(6); expect(ex1.matches).toEqual({ M: 4, a: 1, d: 3, h: 12, m: 26, s: 7, y: 2019, z: "Asia/Calcutta", }); const ex2 = DateTime.fromFormatExplain( "〇三-四-二〇一九 一二:三四:四九 下午 Asia/Shanghai", "dd-MMMM-yyyy hh:mm:ss a z", { locale: "zh", numberingSystem: "hanidec" } ); expect(ex2.rawMatches).toBeInstanceOf(Array); expect(ex2.matches).toBeInstanceOf(Object); expect(keyCount(ex2.matches)).toBe(8); expect(ex2.result).toBeInstanceOf(Object); expect(keyCount(ex2.result)).toBe(6); expect(ex2.matches).toEqual({ M: 4, a: 1, d: 3, h: 12, m: 34, s: 49, y: 2019, z: "Asia/Shanghai", }); const ex3 = DateTime.fromFormatExplain("٠٣-أبريل-٢٠١٩ ٠٣:٤٦:٠١ م", "dd-MMMM-yyyy hh:mm:ss a", { locale: "ar", numberingSystem: "arab", }); expect(ex3.rawMatches).toBeInstanceOf(Array); expect(ex3.matches).toBeInstanceOf(Object); expect(keyCount(ex3.matches)).toBe(7); expect(ex3.result).toBeInstanceOf(Object); expect(keyCount(ex3.result)).toBe(6); expect(ex3.matches).toEqual({ M: 4, a: 1, d: 3, h: 15, m: 46, s: 1, y: 2019, }); const ex4 = DateTime.fromFormatExplain("۰۳-أبريل-۲۰۱۹ ۰۳:۴۷:۲۱ م", "dd-MMMM-yyyy hh:mm:ss a", { locale: "ar", numberingSystem: "arabext", }); expect(ex4.rawMatches).toBeInstanceOf(Array); expect(ex4.matches).toBeInstanceOf(Object); expect(keyCount(ex4.matches)).toBe(7); expect(ex4.result).toBeInstanceOf(Object); expect(keyCount(ex4.result)).toBe(6); const ex5 = DateTime.fromFormatExplain("᭐᭓-April-᭒᭐᭑᭙ ᭐᭒:᭔᭔:᭐᭗ PM", "dd-MMMM-yyyy hh:mm:ss a", { locale: "id", numberingSystem: "bali", }); expect(ex5.rawMatches).toBeInstanceOf(Array); expect(ex5.matches).toBeInstanceOf(Object); expect(keyCount(ex5.matches)).toBe(7); expect(ex5.result).toBeInstanceOf(Object); expect(keyCount(ex5.result)).toBe(6); const ex6 = DateTime.fromFormatExplain("০৩ এপ্রিল ২০১৯ ১২.৫৭", "dd MMMM yyyy hh.mm", { locale: "bn", numberingSystem: "beng", }); expect(ex6.rawMatches).toBeInstanceOf(Array); expect(ex6.matches).toBeInstanceOf(Object); expect(keyCount(ex6.matches)).toBe(5); expect(ex6.result).toBeInstanceOf(Object); expect(keyCount(ex6.result)).toBe(5); expect(ex6.matches).toEqual({ M: 4, d: 3, h: 12, m: 57, y: 2019, }); const ex7 = DateTime.fromFormatExplain( "03-April-2019 02:47:04 PM", "dd-MMMM-yyyy hh:mm:ss a", { locale: "en-US", numberingSystem: "fullwide", } ); expect(ex7.rawMatches).toBeInstanceOf(Array); expect(ex7.matches).toBeInstanceOf(Object); expect(keyCount(ex7.matches)).toBe(7); expect(ex7.result).toBeInstanceOf(Object); expect(keyCount(ex7.result)).toBe(6); const ex8 = DateTime.fromFormatExplain("०३-April-२०१९ ०२:५३:१९ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "deva", }); expect(ex8.rawMatches).toBeInstanceOf(Array); expect(ex8.matches).toBeInstanceOf(Object); expect(keyCount(ex8.matches)).toBe(7); expect(ex8.result).toBeInstanceOf(Object); expect(keyCount(ex8.result)).toBe(6); const ex9 = DateTime.fromFormatExplain("૦૩-એપ્રિલ-૨૦૧૯ ૦૨:૫૫:૨૧ PM", "dd-MMMM-yyyy hh:mm:ss a", { locale: "gu", numberingSystem: "gujr", }); expect(ex9.rawMatches).toBeInstanceOf(Array); expect(ex9.matches).toBeInstanceOf(Object); expect(keyCount(ex9.matches)).toBe(7); expect(ex9.result).toBeInstanceOf(Object); expect(keyCount(ex9.result)).toBe(6); const ex10 = DateTime.fromFormatExplain("០៣-April-២០១៩ ០៣:៤៩:២០ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "khmr", }); expect(ex10.rawMatches).toBeInstanceOf(Array); expect(ex10.matches).toBeInstanceOf(Object); expect(keyCount(ex10.matches)).toBe(7); expect(ex10.result).toBeInstanceOf(Object); expect(keyCount(ex10.result)).toBe(6); const ex11 = DateTime.fromFormatExplain("໐໓-April-໒໐໑໙ ໐໓:໕໒:໑໑ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "laoo", }); expect(ex11.rawMatches).toBeInstanceOf(Array); expect(ex11.matches).toBeInstanceOf(Object); expect(keyCount(ex11.matches)).toBe(7); expect(ex11.result).toBeInstanceOf(Object); expect(keyCount(ex11.result)).toBe(6); const ex12 = DateTime.fromFormatExplain("᥆᥉-April-᥈᥆᥇᥏ ᥆᥉:᥋᥉:᥇᥎ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "limb", }); expect(ex12.rawMatches).toBeInstanceOf(Array); expect(ex12.matches).toBeInstanceOf(Object); expect(keyCount(ex12.matches)).toBe(7); expect(ex12.result).toBeInstanceOf(Object); expect(keyCount(ex12.result)).toBe(6); const ex13 = DateTime.fromFormatExplain("൦൩-ഏപ്രിൽ-൨൦൧൯ ൦൩:൫൪:൦൮ PM", "dd-MMMM-yyyy hh:mm:ss a", { locale: "ml", numberingSystem: "mlym", }); expect(ex13.rawMatches).toBeInstanceOf(Array); expect(ex13.matches).toBeInstanceOf(Object); expect(keyCount(ex13.matches)).toBe(7); expect(ex13.result).toBeInstanceOf(Object); expect(keyCount(ex13.result)).toBe(6); const ex14 = DateTime.fromFormatExplain("᠐᠓-April-᠒᠐᠑᠙ ᠐᠓:᠕᠖:᠑᠙ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "mong", }); expect(ex14.rawMatches).toBeInstanceOf(Array); expect(ex14.matches).toBeInstanceOf(Object); expect(keyCount(ex14.matches)).toBe(7); expect(ex14.result).toBeInstanceOf(Object); expect(keyCount(ex14.result)).toBe(6); const ex15 = DateTime.fromFormatExplain("୦୩-April-୨୦୧୯ ୦୩:୫୮:୪୩ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "orya", }); expect(ex15.rawMatches).toBeInstanceOf(Array); expect(ex15.matches).toBeInstanceOf(Object); expect(keyCount(ex15.matches)).toBe(7); expect(ex15.result).toBeInstanceOf(Object); expect(keyCount(ex15.result)).toBe(6); const ex16 = DateTime.fromFormatExplain( cldr && cldr < 45 ? "௦௩-ஏப்ரல்-௨௦௧௯ ௦௪:௦௦:௪௧ பிற்பகல்" : "௦௩-ஏப்ரல்-௨௦௧௯ ௦௪:௦௦:௪௧ PM", "dd-MMMM-yyyy hh:mm:ss a", { locale: "ta", numberingSystem: "tamldec", } ); expect(ex16.rawMatches).toBeInstanceOf(Array); expect(ex16.matches).toBeInstanceOf(Object); expect(keyCount(ex16.matches)).toBe(7); expect(ex16.result).toBeInstanceOf(Object); expect(keyCount(ex16.result)).toBe(6); const ex17 = DateTime.fromFormatExplain( "౦౩-ఏప్రిల్-౨౦౧౯ ౦౪:౦౧:౩౩ PM", "dd-MMMM-yyyy hh:mm:ss a", { locale: "te", numberingSystem: "telu", } ); expect(ex17.rawMatches).toBeInstanceOf(Array); expect(ex17.matches).toBeInstanceOf(Object); expect(keyCount(ex17.matches)).toBe(7); expect(ex17.result).toBeInstanceOf(Object); expect(keyCount(ex17.result)).toBe(6); const ex18 = DateTime.fromFormatExplain( "๐๓-เมษายน-๒๐๑๙ ๐๔:๐๒:๒๔ หลังเที่ยง", "dd-MMMM-yyyy hh:mm:ss a", { locale: "th", numberingSystem: "thai", } ); expect(ex18.rawMatches).toBeInstanceOf(Array); expect(ex18.matches).toBeInstanceOf(Object); expect(keyCount(ex18.matches)).toBe(7); expect(ex18.result).toBeInstanceOf(Object); expect(keyCount(ex18.result)).toBe(6); const ex19 = DateTime.fromFormatExplain("༠༣-April-༢༠༡༩ ༠༤:༠༣:༢༥ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "tibt", }); expect(ex19.rawMatches).toBeInstanceOf(Array); expect(ex19.matches).toBeInstanceOf(Object); expect(keyCount(ex19.matches)).toBe(7); expect(ex19.result).toBeInstanceOf(Object); expect(keyCount(ex19.result)).toBe(6); const ex20 = DateTime.fromFormatExplain("၀၃-April-၂၀၁၉ ၀၄:၁၀:၀၁ PM", "dd-MMMM-yyyy hh:mm:ss a", { numberingSystem: "mymr", }); expect(ex20.rawMatches).toBeInstanceOf(Array); expect(ex20.matches).toBeInstanceOf(Object); expect(keyCount(ex20.matches)).toBe(7); expect(ex20.result).toBeInstanceOf(Object); expect(keyCount(ex20.result)).toBe(6); }); test("DateTime.fromFormatExplain() takes the same options as fromFormat", () => { const ex = DateTime.fromFormatExplain("Janv. 25 1982", "LLL dd yyyy", { locale: "fr" }); expect(keyCount(ex.result)).toBe(3); }); //------ // .fromStringExplain //------- test("DateTime.fromStringExplain is an alias for DateTime.fromFormatExplain", () => { const ff = DateTime.fromStringExplain("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS"), fs = DateTime.fromFormatExplain("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS"); expect(ff).toEqual(fs); }); //------ // .fromString //------- test("DateTime.fromString is an alias for DateTime.fromFormat", () => { const ff = DateTime.fromString("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS"), fs = DateTime.fromFormat("1982/05/25 09:10:11.445", "yyyy/MM/dd HH:mm:ss.SSS"); expect(ff).toEqual(fs); }); //------ // .parseFormatForOpts //------- test("DateTime.parseFormatForOpts returns a parsing format", () => { const format = DateTime.parseFormatForOpts(DateTime.DATETIME_FULL); expect(format).toEqual("MMMM d, yyyyy at h:m a ZZZ"); }); test("DateTime.parseFormatForOpts returns a parsing format", () => { const format = DateTime.parseFormatForOpts(""); expect(format).toBeNull(); }); test("DateTime.parseFormatForOpts respects the hour cycle", () => { const enFormat = DateTime.parseFormatForOpts(DateTime.TIME_SIMPLE, { locale: "en-US" }); expect(enFormat).toEqual("h:m a"); const deFormat = DateTime.parseFormatForOpts(DateTime.TIME_SIMPLE, { locale: "de-DE" }); expect(deFormat).toEqual("H:m"); }); test("DateTime.parseFormatForOpts respects the hour cycle when forced by the options", () => { const format = DateTime.parseFormatForOpts(DateTime.TIME_24_SIMPLE, { locale: "en-US" }); expect(format).toEqual("H:m"); }); //------ // .expandFormat //------- // test("DateTime.expandFormat works with the default locale", () => { const format = DateTime.expandFormat("D"); expect(format).toBe("M/d/yyyyy"); }); test("DateTime.expandFormat works with other locales", () => { const format = DateTime.expandFormat("D", { locale: "en-gb" }); expect(format).toBe("d/M/yyyyy"); }); test("DateTime.expandFormat respects the hour cycle", () => { const enFormat = DateTime.expandFormat("t", { locale: "en-US" }); expect(enFormat).toBe("h:m a"); const deFormat = DateTime.expandFormat("t", { locale: "de-DE" }); expect(deFormat).toBe("H:m"); }); test("DateTime.expandFormat respects the hour cycle when forced by the macro token", () => { const format = DateTime.expandFormat("T", { locale: "en-US" }); expect(format).toBe("H:m"); }); //------ // .fromFormatParser //------- test("DateTime.fromFormatParser behaves equivalently to DateTime.fromFormat", () => { const dateTimeStr = "1982/05/25 09:10:11.445"; const format = "yyyy/MM/dd HH:mm:ss.SSS"; const formatParser = DateTime.buildFormatParser(format); const ff1 = DateTime.fromFormat(dateTimeStr, format), ffP1 = DateTime.fromFormatParser(dateTimeStr, formatParser); expect(ffP1).toEqual(ff1); expect(ffP1.isValid).toBe(true); }); test("DateTime.fromFormatParser throws error when used with a different locale than it was created with", () => { const format = "yyyy/MM/dd HH:mm:ss.SSS"; const formatParser = DateTime.buildFormatParser(format, { locale: "es-ES" }); expect(() => DateTime.fromFormatParser("1982/05/25 09:10:11.445", formatParser, { locale: "es-MX" }) ).toThrowError( "fromFormatParser called with a locale of Locale(es-MX, null, null), but the format parser was created for Locale(es-ES, null, null)" ); }); moment-luxon-93c85a3/test/datetime/transform.test.js000066400000000000000000000032461477254173100226370ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; const dtMaker = () => DateTime.fromObject( { year: 1982, month: 5, day: 25, hour: 9, minute: 23, second: 54, millisecond: 123, }, { zone: "utc", } ), dt = dtMaker(); //------ // #toMillis() //------ test("DateTime#toMillis() returns milliseconds for valid DateTimes", () => { const js = dt.toJSDate(); expect(dt.toMillis()).toBe(js.getTime()); }); test("DateTime#toMillis() returns NaN for invalid DateTimes", () => { const invalid = DateTime.invalid("reason"); expect(invalid.toMillis()).toBe(NaN); }); //------ // #toSeconds() //------ test("DateTime#toSeconds() returns seconds for valid DateTimes", () => { const js = dt.toJSDate(); expect(dt.toSeconds()).toBe(js.getTime() / 1000); }); test("DateTime#toSeconds() returns NaN for invalid DateTimes", () => { const invalid = DateTime.invalid("reason"); expect(invalid.toSeconds()).toBe(NaN); }); //------ // #valueOf() //------ test("DateTime#valueOf() just does toMillis()", () => { expect(dt.valueOf()).toBe(dt.toMillis()); const invalid = DateTime.invalid("reason"); expect(invalid.valueOf()).toBe(invalid.toMillis()); }); //------ // #toJSDate() //------ test("DateTime#toJSDate() returns a native Date equivalent", () => { const js = dt.toJSDate(); expect(js).toBeInstanceOf(Date); expect(js.getTime()).toBe(dt.toMillis()); }); //------ // #toBSON() //------ test("DateTime#toBSON() return a BSON serializable equivalent", () => { const js = dt.toBSON(); expect(js).toBeInstanceOf(Date); expect(js.getTime()).toBe(dt.toMillis()); }); moment-luxon-93c85a3/test/datetime/typecheck.test.js000066400000000000000000000014061477254173100225770ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; //------ // #isDateTime() //------ test("DateTime#isDateTime return true for valid DateTime", () => { const dt = DateTime.now(); expect(DateTime.isDateTime(dt)).toBe(true); }); test("DateTime#isDateTime return true for invalid DateTime", () => { const dt = DateTime.invalid("because"); expect(DateTime.isDateTime(dt)).toBe(true); }); test("DateTime#isDateTime return false for primitives", () => { expect(DateTime.isDateTime({})).toBe(false); expect(DateTime.isDateTime({ hours: 60 })).toBe(false); expect(DateTime.isDateTime(1)).toBe(false); expect(DateTime.isDateTime("")).toBe(false); expect(DateTime.isDateTime(null)).toBe(false); expect(DateTime.isDateTime()).toBe(false); }); moment-luxon-93c85a3/test/datetime/zone.test.js000066400000000000000000000271021477254173100215740ustar00rootroot00000000000000/* global test expect */ import { DateTime, Settings, IANAZone } from "../../src/luxon"; var Helpers = require("../helpers"); const millis = 391147200000, // 1982-05-25T04:00:00.000Z dt = () => DateTime.fromMillis(millis); //------ // defaults //------ test("setZone defaults to local", () => { expect(dt().isOffsetFixed).toBe(false); }); //------ // #toUTC() //------ test("DateTime#utc() puts the dt in UTC 'mode'", () => { const zoned = dt().toUTC(); expect(zoned.valueOf()).toBe(millis); expect(zoned.hour).toBe(4); expect(zoned.zoneName).toBe("UTC"); expect(zoned.isOffsetFixed).toBe(true); expect(zoned.isInDST).toBe(false); }); test("DateTime#utc(offset) sets dt in UTC+offset 'mode'", () => { const zoned = dt().toUTC(5 * 60); expect(zoned.valueOf()).toBe(millis); expect(zoned.hour).toBe(9); expect(zoned.zoneName).toBe("UTC+5"); expect(zoned.isOffsetFixed).toBe(true); expect(zoned.isInDST).toBe(false); }); test("DateTime#utc maintains invalidity", () => { expect(DateTime.invalid("because").toUTC().isValid).toBe(false); }); //------ // #toLocal() //------ test("DateTime#toLocal() sets the calendar back to local", () => { const relocaled = dt().toUTC().toLocal(), expected = new Date(millis).getHours(); expect(relocaled.isOffsetFixed).toBe(false); expect(relocaled.valueOf()).toBe(millis); expect(relocaled.hour).toBe(expected); }); test("DateTime#toLocal() accepts the default locale", () => { Helpers.withDefaultZone("Asia/Tokyo", () => { const tokyoLocal = DateTime.local(); Helpers.withDefaultZone("UTC", () => expect(tokyoLocal.toLocal().zoneName).toBe("UTC")); }); }); //------ // #setZone() //------ test("DateTime#setZone setZone sets the TZ to the specified zone", () => { const zoned = dt().setZone("America/Los_Angeles"); expect(zoned.zoneName).toBe("America/Los_Angeles"); expect(zoned.isOffsetFixed).toBe(false); expect(zoned.valueOf()).toBe(millis); expect(zoned.day).toBe(24); expect(zoned.hour).toBe(21); // pacific daylight time expect(zoned.isInDST).toBe(true); }); test('DateTime#setZone accepts "system"', () => { const zoned = DateTime.utc().setZone("system"); expect(zoned.offset).toBe(DateTime.local().offset); }); test('DateTime#setZone accepts "local"', () => { const zoned = DateTime.utc().setZone("local"); expect(zoned.offset).toBe(DateTime.local().offset); }); test('DateTime#setZone accepts "system" and uses the system zone', () => { const systemZone = Settings.defaultZone.name; expect(DateTime.utc().setZone("system").zoneName).toBe(systemZone); }); test('DateTime#setZone accepts "default" and uses the default zone', () => { Helpers.withDefaultZone("Europe/Paris", () => { expect(DateTime.utc().setZone("default").zoneName).toBe("Europe/Paris"); }); }); test('DateTime#setZone accepts "utc"', () => { const zoned = DateTime.local().setZone("utc"); expect(zoned.offset).toBe(0); expect(zoned.offsetNameShort).toBe("UTC"); expect(zoned.offsetNameLong).toBe("UTC"); }); test('DateTime#setZone accepts "gmt"', () => { const zoned = DateTime.local().setZone("gmt"); expect(zoned.offset).toBe(0); expect(zoned.offsetNameShort).toBe("UTC"); expect(zoned.offsetNameLong).toBe("UTC"); }); test('DateTime#setZone accepts "utc+3"', () => { const zoned = DateTime.local().setZone("utc+3"); expect(zoned.zone.name).toBe("UTC+3"); expect(zoned.offset).toBe(3 * 60); expect(zoned.offsetNameShort).toBe("UTC+3"); expect(zoned.offsetNameLong).toBe("UTC+3"); }); test('DateTime#setZone accepts "utc-3"', () => { const zoned = DateTime.local().setZone("utc-3"); expect(zoned.zone.name).toBe("UTC-3"); expect(zoned.offset).toBe(-3 * 60); expect(zoned.offsetNameShort).toBe("UTC-3"); expect(zoned.offsetNameLong).toBe("UTC-3"); }); test('DateTime#setZone accepts "utc-3:30"', () => { const zoned = DateTime.local().setZone("utc-3:30"); expect(zoned.zone.name).toBe("UTC-3:30"); expect(zoned.offset).toBe(-3 * 60 - 30); expect(zoned.offsetNameShort).toBe("UTC-3:30"); expect(zoned.offsetNameLong).toBe("UTC-3:30"); }); test("DateTime#setZone does not accept dumb things", () => { Helpers.withDefaultZone("system", () => { const zoned = DateTime.local().setZone("utc-yo"); // this is questionable; should this be invalid instead? expect(zoned.zone.type).toBe("system"); }); }); test("DateTime#setZone accepts IANA zone names", () => { const zoned = dt().setZone("Europe/Paris"); expect(zoned.zoneName).toBe("Europe/Paris"); // not convinced this is universal. Could also be 'CEDT' expect(zoned.offsetNameShort).toBe("GMT+2"); expect(zoned.offsetNameLong).toBe("Central European Summer Time"); expect(zoned.valueOf()).toBe(millis); expect(zoned.hour).toBe(6); // cedt is +2 }); test.each([ ["PST8PDT", -7], // my date is in daylight time ["EST5EDT", -4], ["GMT+0", 0], ["GMT0", 0], ])("DateTime#setZone accepts whacky zone %p", (iana, offset) => { const zoned = dt().setZone(iana); expect(zoned.isValid).toBe(true); expect(zoned.zoneName).toBe(iana); expect(zoned.offset).toBe(offset * 60); }); test("DateTime#setZone accepts a keepLocalTime option", () => { const zoned = dt().toUTC().setZone("America/Los_Angeles", { keepLocalTime: true }); expect(zoned.zoneName).toBe("America/Los_Angeles"); expect(zoned.year).toBe(1982); expect(zoned.month).toBe(5); expect(zoned.day).toBe(25); expect(zoned.hour).toBe(4); expect(zoned.isOffsetFixed).toBe(false); const zonedMore = zoned.setZone("America/New_York", { keepLocalTime: true, }); expect(zonedMore.zoneName).toBe("America/New_York"); expect(zonedMore.year).toBe(1982); expect(zonedMore.month).toBe(5); expect(zonedMore.day).toBe(25); expect(zonedMore.hour).toBe(4); expect(zonedMore.isOffsetFixed).toBe(false); }); test("DateTime#setZone with keepLocalTime can span wacky offsets", () => { const d = DateTime.fromISO("0001-01-01", { zone: "UTC" }); const d2 = d.setZone("America/Curacao", { keepLocalTime: true }); expect(d2.year).toBe(1); expect(d2.month).toBe(1); expect(d2.day).toBe(1); expect(d2.hour).toBe(0); }); test("DateTime#setZone with keepLocalTime handles zones with very different offsets than the current one", () => { const local = DateTime.local(2016, 10, 30, 2, 59); const zoned = local.setZone("Europe/Athens", { keepLocalTime: true }); expect(zoned.hour).toBe(2); }); test("DateTime#setZone rejects jibberish", () => { const zoned = dt().setZone("blorp"); expect(zoned.isValid).toBe(false); expect(zoned.invalidReason).toBe("unsupported zone"); }); // #650 test("DateTime#setZone works for dates before 1970 with milliseconds", () => { const offset = DateTime.fromJSDate(new Date("1967-01-01T00:00:00.001Z")).setZone( "America/New_York" ).offset; expect(offset).toBe(-300); }); // # 1179 test("DateTime#setZone handles negative years", () => { const dt = DateTime.fromMillis(-84753824400000).setZone("Europe/Rome"); expect(dt.year).toBe(-716); expect(dt.offset < 60).toBe(true); }); //------ // #isInDST() //------ test("DateTime#isInDST() returns false for pre-DST times", () => { const zoned = dt().setZone("America/Los_Angeles"); expect(zoned.set({ month: 1 }).isInDST).toBe(false); }); test("DateTime#isInDST() returns true for during-DST times", () => { const zoned = dt().setZone("America/Los_Angeles"); expect(zoned.set({ month: 5 }).isInDST).toBe(true); }); test("DateTime#isInDST() returns false for post-DST times", () => { const zoned = dt().setZone("America/Los_Angeles"); expect(zoned.set({ month: 12 }).isInDST).toBe(false); }); test("DateTime#isInDST() returns true for 1974 whole year in USA- from January 6th to October 27th", () => { const zoned = dt().setZone("America/Los_Angeles"); expect(zoned.set({ year: 1974, month: 1, day: 6 }).isInDST).toBe(true); expect(zoned.set({ year: 1974, month: 10, day: 27 }).isInDST).toBe(false); }); //------ // #getPossibleOffsets() //------ test("DateTime#getPossibleOffsets() returns the same DateTime for fixed zones", () => { const fixedZoned = dt().setZone("+02:00"); const possibleOffsets = fixedZoned.getPossibleOffsets(); expect(possibleOffsets).toHaveLength(1); expect(possibleOffsets[0]).toBe(fixedZoned); }); test("DateTime#getPossibleOffsets() returns the same DateTime when not at an ambiguous local time", () => { const zoned = DateTime.fromISO("2023-01-01T15:00", { zone: "Europe/Berlin" }); const possibleOffsets = zoned.getPossibleOffsets(); expect(possibleOffsets).toHaveLength(1); expect(possibleOffsets[0]).toBe(zoned); }); test("DateTime#getPossibleOffsets() returns the possible DateTimes when at an ambiguous local time", () => { const zoned = DateTime.fromISO("2023-10-29T02:30:00+01:00", { zone: "Europe/Berlin" }); const possibleOffsets = zoned.getPossibleOffsets(); expect(possibleOffsets).toHaveLength(2); expect(possibleOffsets[0].toISO()).toBe("2023-10-29T02:30:00.000+02:00"); expect(possibleOffsets[1].toISO()).toBe("2023-10-29T02:30:00.000+01:00"); }); //------ // #invalid //------ // these functions got tested in the individual zones, but let's do invalid DateTimes test("DateTime#offset returns NaN for invalid times", () => { const zoned = DateTime.invalid("because"); expect(zoned.isInDST).toBeFalsy(); }); test("DateTime#offsetNameLong returns null for invalid times", () => { const zoned = DateTime.invalid("because"); expect(zoned.offsetNameLong).toBe(null); }); test("DateTime#offsetNameShort returns null for invalid times", () => { const zoned = DateTime.invalid("because"); expect(zoned.offsetNameShort).toBe(null); }); //------ // Etc/GMT zones //------ test.each([ ["Etc/GMT+8", -8], ["Etc/GMT-5", 5], ["Etc/GMT", 0], ["Etc/GMT-0", 0], ["Etc/GMT", 0], ])("Etc/GMTx zones now work natively", (zone, expectedOffset) => { let zoned = dt().setZone(zone); expect(zoned.isValid).toBe(true); expect(zoned.offset).toEqual(expectedOffset * 60); }); //------ // local zone //------ test("The local zone does local stuff", () => { expect(DateTime.local(2016, 8, 6).offsetNameLong).toBe("Eastern Daylight Time"); expect(DateTime.local(2016, 8, 6).offsetNameShort).toBe("EDT"); }); //------ // default zone //------ test("Setting the default zone results in a different creation zone", () => { Helpers.withDefaultZone("Asia/Tokyo", () => { expect(DateTime.local().zoneName).toBe("Asia/Tokyo"); expect(DateTime.fromObject({}).zoneName).toBe("Asia/Tokyo"); }); }); test("Setting the default zone to 'system' gives you back the system zone", () => { const systemZone = Settings.defaultZone.name; Helpers.withDefaultZone("Asia/Tokyo", () => { Settings.defaultZone = "system"; expect(DateTime.local().zoneName).toBe(systemZone); }); }); //------ // invalid //------ test("invalid DateTimes have no zone", () => { expect(DateTime.invalid("because").zoneName).toBe(null); }); test("can parse zones with special JS keywords as invalid", () => { for (const kw of ["constructor", "__proto__"]) { const dt = DateTime.fromISO(`2020-01-01T11:22:33+01:00[${kw}]`); expect(dt.invalidReason).toBe("unsupported zone"); expect(dt.invalidExplanation).toBe(`the zone "${kw}" is not supported`); } }); test("Special JS keywords produce invalid Zone", () => { for (const kw of ["constructor", "__proto__"]) { const zone = IANAZone.create(kw); expect(zone.isValid).toBe(false); } }); test("Invalid Zones named after special JS keywords produce NaN offset", () => { for (const kw of ["constructor", "__proto__"]) { const zone = IANAZone.create(kw); expect(zone.offset(1742926058000)).toBe(NaN); } }); test("Invalid zones produce NaN offset", () => { expect(IANAZone.create("INVALID").offset(1742926058000)).toBe(NaN); }); moment-luxon-93c85a3/test/duration/000077500000000000000000000000001477254173100173345ustar00rootroot00000000000000moment-luxon-93c85a3/test/duration/accuracy.test.js000066400000000000000000000017331477254173100224460ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; const convert = (amt, from, to, accuracy) => Duration.fromObject({ [from]: amt }, { conversionAccuracy: accuracy }).as(to); test("There are slightly more than 365 days in a year", () => { expect(convert(1, "years", "days", "casual")).toBeCloseTo(365, 4); expect(convert(1, "years", "days", "longterm")).toBeCloseTo(365.2425, 4); expect(convert(365, "days", "years", "casual")).toBeCloseTo(1, 4); expect(convert(365.2425, "days", "years", "longterm")).toBeCloseTo(1, 4); }); test("There are slightly more than 30 days in a month", () => { expect(convert(1, "month", "days", "casual")).toBeCloseTo(30, 4); expect(convert(1, "month", "days", "longterm")).toBeCloseTo(30.4369, 4); }); test("There are slightly more than 91 days in a quarter", () => { expect(convert(1, "quarter", "days", "casual")).toBeCloseTo(91, 4); expect(convert(1, "quarter", "days", "longterm")).toBeCloseTo(91.3106, 4); }); moment-luxon-93c85a3/test/duration/create.test.js000066400000000000000000000100661477254173100221160ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; //------ // .fromObject() //------- test("Duration.fromObject sets all the values", () => { const dur = Duration.fromObject({ years: 1, months: 2, days: 3, hours: 4, minutes: 5, seconds: 6, milliseconds: 7, }); expect(dur.years).toBe(1); expect(dur.months).toBe(2); expect(dur.days).toBe(3); expect(dur.hours).toBe(4); expect(dur.minutes).toBe(5); expect(dur.seconds).toBe(6); expect(dur.milliseconds).toBe(7); }); test("Duration.fromObject sets all the fractional values", () => { const dur = Duration.fromObject({ years: 1, months: 2, days: 3, hours: 4.5, }); expect(dur.years).toBe(1); expect(dur.months).toBe(2); expect(dur.days).toBe(3); expect(dur.hours).toBe(4.5); expect(dur.minutes).toBe(0); expect(dur.seconds).toBe(0); expect(dur.milliseconds).toBe(0); }); test("Duration.fromObject sets all the values from the object having string type values", () => { const dur = Duration.fromObject({ years: "1", months: "2", days: "3", hours: "4", minutes: "5", seconds: "6", milliseconds: "7", }); expect(dur.years).toBe(1); expect(dur.months).toBe(2); expect(dur.days).toBe(3); expect(dur.hours).toBe(4); expect(dur.minutes).toBe(5); expect(dur.seconds).toBe(6); expect(dur.milliseconds).toBe(7); }); test("Duration.fromObject accepts a conversionAccuracy", () => { const dur = Duration.fromObject({ days: 1 }, { conversionAccuracy: "longterm" }); expect(dur.conversionAccuracy).toBe("longterm"); }); test("Duration.fromObject throws if the argument is not an object", () => { expect(() => Duration.fromObject()).toThrow(); expect(() => Duration.fromObject(null)).toThrow(); expect(() => Duration.fromObject("foo")).toThrow(); }); test("Duration.fromObject({}) constructs zero duration", () => { const dur = Duration.fromObject({}); expect(dur.years).toBe(0); expect(dur.months).toBe(0); expect(dur.days).toBe(0); expect(dur.hours).toBe(0); expect(dur.minutes).toBe(0); expect(dur.seconds).toBe(0); expect(dur.milliseconds).toBe(0); }); test("Duration.fromObject throws if the initial object has invalid keys", () => { expect(() => Duration.fromObject({ foo: 0 })).toThrow(); expect(() => Duration.fromObject({ years: 1, foo: 0 })).toThrow(); }); test("Duration.fromObject throws if the initial object has invalid values", () => { expect(() => Duration.fromObject({ years: {} })).toThrow(); expect(() => Duration.fromObject({ months: "some" })).toThrow(); expect(() => Duration.fromObject({ days: NaN })).toThrow(); expect(() => Duration.fromObject({ hours: true })).toThrow(); expect(() => Duration.fromObject({ minutes: false })).toThrow(); expect(() => Duration.fromObject({ seconds: "" })).toThrow(); }); test("Duration.fromObject is valid if providing options only", () => { const dur = Duration.fromObject({}, { conversionAccuracy: "longterm" }); expect(dur.years).toBe(0); expect(dur.months).toBe(0); expect(dur.days).toBe(0); expect(dur.hours).toBe(0); expect(dur.minutes).toBe(0); expect(dur.seconds).toBe(0); expect(dur.milliseconds).toBe(0); expect(dur.isValid).toBe(true); }); //------ // .fromDurationLike() //------- it("Duration.fromDurationLike returns a Duration from millis", () => { const dur = Duration.fromDurationLike(1000); expect(dur).toBeInstanceOf(Duration); expect(dur).toMatchInlineSnapshot(`"PT1S"`); }); it("Duration.fromDurationLike returns a Duration from object", () => { const dur = Duration.fromDurationLike({ hours: 1 }); expect(dur).toBeInstanceOf(Duration); expect(dur.toObject()).toStrictEqual({ hours: 1 }); }); it("Duration.fromDurationLike returns passed Duration", () => { const durFromObject = Duration.fromObject({ hours: 1 }); const dur = Duration.fromDurationLike(durFromObject); expect(dur).toStrictEqual(durFromObject); }); it("Duration.fromDurationLike returns passed Duration", () => { expect(() => Duration.fromDurationLike("foo")).toThrow(); expect(() => Duration.fromDurationLike(null)).toThrow(); }); moment-luxon-93c85a3/test/duration/customMatrix.test.js000066400000000000000000000022551477254173100233530ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; import { casualMatrix } from "../../src/duration"; const businessMatrix = { ...casualMatrix, months: { weeks: 4, days: 22, hours: 22 * 7, minutes: 22 * 7 * 60, seconds: 22 * 7 * 60 * 60, milliseconds: 22 * 7 * 60 * 60 * 1000, }, weeks: { days: 5, hours: 5 * 7, minutes: 5 * 7 * 60, seconds: 5 * 7 * 60 * 60, milliseconds: 5 * 7 * 60 * 60 * 1000, }, days: { hours: 7, minutes: 7 * 60, seconds: 7 * 60 * 60, milliseconds: 7 * 60 * 60 * 1000, }, }; const convert = (amt, from, to) => Duration.fromObject({ [from]: amt }, { matrix: businessMatrix }).as(to); test("One day is made of 7 hours", () => { expect(convert(1, "days", "hours")).toBeCloseTo(7, 4); expect(convert(7, "hours", "days")).toBeCloseTo(1, 4); }); test("One and a half week is made of 7 days 3 hours and 30 minutes", () => { const dur = Duration.fromObject({ weeks: 1.5 }, { matrix: businessMatrix }).shiftTo( "days", "hours", "minutes" ); expect(dur.days).toBeCloseTo(7, 4); expect(dur.hours).toBeCloseTo(3, 4); expect(dur.minutes).toBeCloseTo(30, 4); }); moment-luxon-93c85a3/test/duration/equality.test.js000066400000000000000000000054251477254173100225130ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; test("equals self", () => { const l = Duration.fromObject({ years: 5, days: 6 }); expect(l.equals(l)).toBe(true); }); test("equals identically constructed", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5, days: 6 }); expect(l1.equals(l2)).toBe(true); }); test("equals identically constructed with fractional values", () => { const l1 = Duration.fromObject({ years: 5.5, days: 6 }), l2 = Duration.fromObject({ years: 5.5, days: 6 }); expect(l1.equals(l2)).toBe(true); }); test("equals identically constructed but one has string type values", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: "5", days: "6" }); expect(l1.equals(l2)).toBe(true); }); test("equals identically constructed but one has fractional string type values", () => { const l1 = Duration.fromObject({ years: 5.5, days: 6 }), l2 = Duration.fromObject({ years: "5.5", days: "6" }); expect(l1.equals(l2)).toBe(true); }); // #809 test("equals with extra zero units", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5, days: 6, minutes: 0, seconds: -0 }); expect(l1.equals(l2)).toBe(true); expect(l2.equals(l1)).toBe(true); }); test("does not equal an invalid duration", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.invalid("because"); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different locale", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5, days: 6 }).reconfigure({ locale: "fr" }); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different numbering system", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5, days: 6 }).reconfigure({ numberingSystem: "beng" }); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different set of units", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5, months: 6 }); expect(l1.equals(l2)).toBe(false); }); test("does not equal a subset of units", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5 }); expect(l1.equals(l2)).toBe(false); }); test("does not equal a superset of units", () => { const l1 = Duration.fromObject({ years: 5 }), l2 = Duration.fromObject({ years: 5, days: 6 }); expect(l1.equals(l2)).toBe(false); }); test("does not equal a different unit values", () => { const l1 = Duration.fromObject({ years: 5, days: 6 }), l2 = Duration.fromObject({ years: 5, days: 7 }); expect(l1.equals(l2)).toBe(false); }); moment-luxon-93c85a3/test/duration/format.test.js000066400000000000000000000255121477254173100221450ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; const dur = () => Duration.fromObject({ years: 1, months: 2, weeks: 1, days: 3, hours: 4, minutes: 5, seconds: 6, milliseconds: 7, }); //------ // #toISO() //------ test("Duration#toISO fills out every field", () => { expect(dur().toISO()).toBe("P1Y2M1W3DT4H5M6.007S"); }); test("Duration#toISO fills out every field with fractional", () => { const dur = Duration.fromObject({ years: 1.1, months: 2.2, weeks: 1.1, days: 3.3, hours: 4.4, minutes: 5.5, seconds: 6.6, milliseconds: 7, }); expect(dur.toISO()).toBe("P1.1Y2.2M1.1W3.3DT4.4H5.5M6.607S"); }); test("Duration#toISO creates a minimal string", () => { expect(Duration.fromObject({ years: 3, seconds: 45 }).toISO()).toBe("P3YT45S"); expect(Duration.fromObject({ months: 4, seconds: 45 }).toISO()).toBe("P4MT45S"); expect(Duration.fromObject({ months: 5 }).toISO()).toBe("P5M"); expect(Duration.fromObject({ minutes: 5 }).toISO()).toBe("PT5M"); }); test("Duration#toISO handles negative durations", () => { expect(Duration.fromObject({ years: -3, seconds: -45 }).toISO()).toBe("P-3YT-45S"); }); test("Duration#toISO handles mixed negative/positive durations", () => { expect(Duration.fromObject({ years: 3, seconds: -45 }).toISO()).toBe("P3YT-45S"); expect(Duration.fromObject({ years: 0, seconds: -45 }).toISO()).toBe("PT-45S"); expect(Duration.fromObject({ years: -5, seconds: 34 }).toISO()).toBe("P-5YT34S"); }); test("Duration#toISO handles zero durations", () => { expect(Duration.fromMillis(0).toISO()).toBe("PT0S"); }); test("Duration#toISO returns null for invalid durations", () => { expect(Duration.invalid("because").toISO()).toBe(null); }); test("Duration#toISO handles milliseconds duration", () => { expect(Duration.fromObject({ milliseconds: 7 }).toISO()).toBe("PT0.007S"); }); test("Duration#toISO handles seconds/milliseconds duration", () => { expect(Duration.fromObject({ seconds: 17, milliseconds: 548 }).toISO()).toBe("PT17.548S"); }); test("Duration#toISO handles negative seconds/milliseconds duration", () => { expect(Duration.fromObject({ seconds: -17, milliseconds: -548 }).toISO()).toBe("PT-17.548S"); }); test("Duration#toISO handles mixed negative/positive numbers in seconds/milliseconds durations", () => { expect(Duration.fromObject({ seconds: 17, milliseconds: -548 }).toISO()).toBe("PT16.452S"); expect(Duration.fromObject({ seconds: -17, milliseconds: 548 }).toISO()).toBe("PT-16.452S"); }); //------ // #toISOTime() //------ const hhmmssSSS = Duration.fromObject({ hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }); const hhSSS = Duration.fromObject({ hours: 11, milliseconds: 444 }); const hhss = Duration.fromObject({ hours: 11, seconds: 33 }); const hh = Duration.fromObject({ hours: 11 }); test("Duration#toISOTime creates a correct extended string", () => { expect(hhmmssSSS.toISOTime()).toBe("11:22:33.444"); }); test("Duration#toISOTime suppresses milliseconds correctly", () => { expect(hhSSS.toISOTime({ suppressMilliseconds: true })).toBe("11:00:00.444"); expect(hhss.toISOTime({ suppressMilliseconds: true })).toBe("11:00:33"); expect(hh.toISOTime({ suppressMilliseconds: true })).toBe("11:00:00"); }); test("Duration#toISOTime suppresses seconds correctly", () => { expect(hhSSS.toISOTime({ suppressSeconds: true })).toBe("11:00:00.444"); expect(hhss.toISOTime({ suppressSeconds: true })).toBe("11:00:33.000"); expect(hh.toISOTime({ suppressSeconds: true })).toBe("11:00"); }); test("Duration#toISOTime includes the prefix correctly", () => { expect(hh.toISOTime({ includePrefix: true })).toBe("T11:00:00.000"); }); test("Duration#toISOTime creates a correct basic string", () => { expect(hhmmssSSS.toISOTime({ format: "basic" })).toBe("112233.444"); expect(hh.toISOTime({ format: "basic", suppressMilliseconds: true })).toBe("110000"); expect(hh.toISOTime({ format: "basic", suppressSeconds: true })).toBe("1100"); }); test("Duration#toISOTime returns null if the value is outside the range of one day", () => { expect(Duration.fromObject({ hours: 24 }).toISOTime()).toBe(null); expect(Duration.fromObject({ milliseconds: -1 }).toISOTime()).toBe(null); }); test("Duration#toISOTime is not influenced by the locale", () => { expect(Duration.fromObject({ hours: 3, minutes: 10 }, { locale: "ar-QA" }).toISOTime()).toBe( "03:10:00.000" ); }); //------ // #toMillis() //------ test("Duration#toMillis returns the value in milliseconds", () => { expect(Duration.fromMillis(1000).toMillis()).toBe(1000); expect(dur().valueOf()).toBe(dur().toMillis()); }); //------ // #toJSON() //------ test("Duration#toJSON returns the ISO representation", () => { expect(dur().toJSON()).toBe(dur().toISO()); }); //------ // #toString() //------ test("Duration#toString returns the ISO representation", () => { expect(dur().toString()).toBe(dur().toISO()); }); //------ // #toFormat() //------ test("Duration#toFormat('S') returns milliseconds", () => { expect(dur().toFormat("S")).toBe("37598706007"); const lil = Duration.fromMillis(5); expect(lil.toFormat("S")).toBe("5"); expect(lil.toFormat("SS")).toBe("05"); expect(lil.toFormat("SSSSS")).toBe("00005"); }); test("Duration#toFormat('s') returns seconds", () => { expect(dur().toFormat("s")).toBe("37598706"); expect(dur().toFormat("s", { floor: false })).toBe("37598706.007"); expect(dur().toFormat("s.SSS")).toBe("37598706.007"); const lil = Duration.fromObject({ seconds: 6 }); expect(lil.toFormat("s")).toBe("6"); expect(lil.toFormat("ss")).toBe("06"); expect(lil.toFormat("sss")).toBe("006"); expect(lil.toFormat("ssss")).toBe("0006"); }); test("Duration#toFormat('m') returns minutes", () => { expect(dur().toFormat("m")).toBe("626645"); expect(dur().toFormat("m", { floor: false })).toBe("626645.1"); expect(dur().toFormat("m:ss")).toBe("626645:06"); expect(dur().toFormat("m:ss.SSS")).toBe("626645:06.007"); const lil = Duration.fromObject({ minutes: 6 }); expect(lil.toFormat("m")).toBe("6"); expect(lil.toFormat("mm")).toBe("06"); expect(lil.toFormat("mmm")).toBe("006"); expect(lil.toFormat("mmmm")).toBe("0006"); }); test("Duration#toFormat('h') returns hours", () => { expect(dur().toFormat("h")).toBe("10444"); expect(dur().toFormat("h", { floor: false })).toBe("10444.085"); expect(dur().toFormat("h:ss")).toBe("10444:306"); expect(dur().toFormat("h:mm:ss.SSS")).toBe("10444:05:06.007"); const lil = Duration.fromObject({ hours: 6 }); expect(lil.toFormat("h")).toBe("6"); expect(lil.toFormat("hh")).toBe("06"); expect(lil.toFormat("hhh")).toBe("006"); expect(lil.toFormat("hhhh")).toBe("0006"); }); test("Duration#toFormat('d') returns days", () => { expect(dur().toFormat("d")).toBe("435"); expect(dur().toFormat("d", { floor: false })).toBe("435.17"); expect(dur().toFormat("d:h:ss")).toBe("435:4:306"); expect(dur().toFormat("d:h:mm:ss.SSS")).toBe("435:4:05:06.007"); const lil = Duration.fromObject({ days: 6 }); expect(lil.toFormat("d")).toBe("6"); expect(lil.toFormat("dd")).toBe("06"); expect(lil.toFormat("ddd")).toBe("006"); expect(lil.toFormat("dddd")).toBe("0006"); }); test("Duration#toFormat('w') returns weeks", () => { expect(dur().toFormat("w")).toBe("61"); expect(dur().toFormat("w", { floor: false })).toBe("61.453"); expect(dur().toFormat("w:s")).toBe("61:273906"); expect(dur().toFormat("w:dd:h:mm:ss.SSS")).toBe("61:03:4:05:06.007"); const lil = Duration.fromObject({ weeks: 6 }); expect(lil.toFormat("w")).toBe("6"); expect(lil.toFormat("ww")).toBe("06"); expect(lil.toFormat("www")).toBe("006"); expect(lil.toFormat("wwww")).toBe("0006"); }); test("Duration#toFormat('M') returns months", () => { expect(dur().toFormat("M")).toBe("14"); expect(dur().toFormat("M", { floor: false })).toBe("14.356"); expect(dur().toFormat("M:s")).toBe("14:878706"); expect(dur().toFormat("M:dd:h:mm:ss.SSS")).toBe("14:10:4:05:06.007"); const lil = Duration.fromObject({ months: 6 }); expect(lil.toFormat("M")).toBe("6"); expect(lil.toFormat("MM")).toBe("06"); expect(lil.toFormat("MMM")).toBe("006"); expect(lil.toFormat("MMMM")).toBe("0006"); }); test("Duration#toFormat('y') returns years", () => { expect(dur().toFormat("y")).toBe("1"); expect(dur().toFormat("y", { floor: false })).toBe("1.195"); expect(dur().toFormat("y:m")).toBe("1:101045"); expect(dur().toFormat("y:M:dd:h:mm:ss.SSS")).toBe("1:2:10:4:05:06.007"); const lil = Duration.fromObject({ years: 5 }); expect(lil.toFormat("y")).toBe("5"); expect(lil.toFormat("yy")).toBe("05"); expect(lil.toFormat("yyyyy")).toBe("00005"); }); test("Duration#toFormat accepts the deprecated 'round' option", () => { expect(dur().toFormat("s", { round: false })).toBe("37598706.007"); expect(dur().toFormat("m", { round: false })).toBe("626645.1"); expect(dur().toFormat("h", { round: false })).toBe("10444.085"); expect(dur().toFormat("d", { round: false })).toBe("435.17"); expect(dur().toFormat("M", { round: false })).toBe("14.356"); expect(dur().toFormat("y", { round: false })).toBe("1.195"); }); test("Duration#toFormat leaves in zeros", () => { const tiny = Duration.fromObject({ seconds: 5 }); expect(tiny.toFormat("hh:mm:ss")).toBe("00:00:05"); expect(tiny.toFormat("hh:mm:ss.SSS")).toBe("00:00:05.000"); }); test("Duration#toFormat rounds down", () => { const tiny = Duration.fromObject({ seconds: 5.7 }); expect(tiny.toFormat("s")).toBe("5"); const unpromoted = Duration.fromObject({ seconds: 59.7 }); expect(unpromoted.toFormat("mm:ss")).toBe("00:59"); }); test("Duration#toFormat localizes the numbers", () => { expect(dur().reconfigure({ locale: "bn" }).toFormat("yy:MM:dd:h:mm:ss.SSS")).toBe( "০১:০২:১০:৪:০৫:০৬.০০৭" ); }); test("Duration#toFormat returns a lame string for invalid durations", () => { expect(Duration.invalid("because").toFormat("yy")).toBe("Invalid Duration"); }); //------ // #humanize() //------ test("Duration#toHuman formats out a list", () => { expect(dur().toHuman()).toEqual( "1 year, 2 months, 1 week, 3 days, 4 hours, 5 minutes, 6 seconds, 7 milliseconds" ); }); test("Duration#toHuman only shows the units you have", () => { expect(Duration.fromObject({ years: 3, hours: 4 }).toHuman()).toEqual("3 years, 4 hours"); }); test("Duration#toHuman accepts a listStyle", () => { expect(dur().toHuman({ listStyle: "long" })).toEqual( "1 year, 2 months, 1 week, 3 days, 4 hours, 5 minutes, 6 seconds, and 7 milliseconds" ); }); test("Duration#toHuman accepts number format opts", () => { expect(dur().toHuman({ unitDisplay: "short" })).toEqual( "1 yr, 2 mths, 1 wk, 3 days, 4 hr, 5 min, 6 sec, 7 ms" ); }); test("Duration#toHuman works in differt languages", () => { expect(dur().reconfigure({ locale: "fr" }).toHuman()).toEqual( "1 an, 2 mois, 1 semaine, 3 jours, 4 heures, 5 minutes, 6 secondes, 7 millisecondes" ); }); moment-luxon-93c85a3/test/duration/getters.test.js000066400000000000000000000035361477254173100223340ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; const dur = Duration.fromObject({ years: 1, quarters: 2, months: 2, days: 3, hours: 4, minutes: 5, seconds: 6, milliseconds: 7, weeks: 8, }), inv = Duration.invalid("because i say so"); //------ // years/months/days/hours/minutes/seconds/milliseconds //------ test("Duration#years returns the years", () => { expect(dur.years).toBe(1); expect(inv.years).toBeFalsy(); }); test("Duration#quarters returns the quarters", () => { expect(dur.quarters).toBe(2); expect(inv.quarters).toBeFalsy(); }); test("Duration#months returns the (1-indexed) months", () => { expect(dur.months).toBe(2); expect(inv.months).toBeFalsy(); }); test("Duration#days returns the days", () => { expect(dur.days).toBe(3); expect(inv.days).toBeFalsy(); }); test("Duration#hours returns the hours", () => { expect(dur.hours).toBe(4); expect(inv.hours).toBeFalsy(); }); test("Duration#hours returns the fractional hours", () => { const localDur = Duration.fromObject({ years: 1, quarters: 2, months: 2, days: 3, hours: 4.5, minutes: 5, seconds: 6, milliseconds: 7, weeks: 8, }), localInv = Duration.invalid("because i say so"); expect(localDur.hours).toBe(4.5); expect(localInv.hours).toBeFalsy(); }); test("Duration#minutes returns the minutes", () => { expect(dur.minutes).toBe(5); expect(inv.minutes).toBeFalsy(); }); test("Duration#seconds returns the seconds", () => { expect(dur.seconds).toBe(6); expect(inv.seconds).toBeFalsy(); }); test("Duration#milliseconds returns the milliseconds", () => { expect(dur.milliseconds).toBe(7); expect(inv.milliseconds).toBeFalsy(); }); test("Duration#weeks returns the weeks", () => { expect(dur.weeks).toBe(8); expect(inv.weeks).toBeFalsy(); }); moment-luxon-93c85a3/test/duration/info.test.js000066400000000000000000000007251477254173100216070ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; const dur = Duration.fromObject({ years: 1, months: 2, days: 3.3, }); //------ // #toObject //------- test("Duration#toObject returns the object", () => { expect(dur.toObject()).toEqual({ years: 1, months: 2, days: 3.3, }); }); test("Duration#toObject returns an empty object for invalid durations", () => { expect(Duration.invalid("because").toObject()).toEqual({}); }); moment-luxon-93c85a3/test/duration/invalid.test.js000066400000000000000000000033471477254173100223050ustar00rootroot00000000000000/* global test expect */ import { Duration, DateTime, Settings } from "../../src/luxon"; test("Explicitly invalid durations are invalid", () => { const dur = Duration.invalid("just because", "seriously, just because"); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("just because"); expect(dur.invalidExplanation).toBe("seriously, just because"); }); test("throwOnInvalid throws", () => { try { Settings.throwOnInvalid = true; expect(() => Duration.invalid("because")).toThrow(); } finally { Settings.throwOnInvalid = false; } }); test("Duration.invalid throws if you don't provide a reason", () => { expect(() => Duration.invalid()).toThrow(); }); test("Diffing invalid DateTimes creates invalid Durations", () => { const invalidDT = DateTime.invalid("so?"); expect(invalidDT.diff(DateTime.now()).isValid).toBe(false); expect(DateTime.now().diff(invalidDT).isValid).toBe(false); }); test("Duration.invalid produces invalid Intervals", () => { expect(Duration.invalid("because").isValid).toBe(false); }); test("Duration.toMillis produces NaN on invalid Durations", () => { expect(Duration.invalid("because").toMillis()).toBe(NaN); }); test("Duration.as produces NaN on invalid Durations", () => { expect(Duration.invalid("because").as("seconds")).toBe(NaN); }); test("Duration.toHuman produces null on invalid Durations", () => { expect(Duration.invalid("because").toHuman()).toBe("Invalid Duration"); }); test("Duration.toISO produces null on invalid Durations", () => { expect(Duration.invalid("because").toISO()).toBeNull(); }); test("Duration.toFormat produces Invalid Duration on invalid Durations", () => { expect(Duration.invalid("because").toFormat("s")).toBe("Invalid Duration"); }); moment-luxon-93c85a3/test/duration/math.test.js000066400000000000000000000142521477254173100216050ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; //------ // #plus() //------ test("Duration#plus add straightforward durations", () => { const first = Duration.fromObject({ hours: 4, minutes: 12, seconds: 2 }), second = Duration.fromObject({ hours: 1, seconds: 6, milliseconds: 14 }), result = first.plus(second); expect(result.hours).toBe(5); expect(result.minutes).toBe(12); expect(result.seconds).toBe(8); expect(result.milliseconds).toBe(14); }); test("Duration#plus add fractional durations", () => { const first = Duration.fromObject({ hours: 4.2, minutes: 12, seconds: 2 }), second = Duration.fromObject({ hours: 1, seconds: 6.8, milliseconds: 14 }), result = first.plus(second); expect(result.hours).toBeCloseTo(5.2, 8); expect(result.minutes).toBe(12); expect(result.seconds).toBeCloseTo(8.8, 8); expect(result.milliseconds).toBe(14); }); test("Duration#plus noops empty druations", () => { const first = Duration.fromObject({ hours: 4, minutes: 12, seconds: 2 }), second = Duration.fromObject({}), result = first.plus(second); expect(result.hours).toBe(4); expect(result.minutes).toBe(12); expect(result.seconds).toBe(2); }); test("Duration#plus adds negatives", () => { const first = Duration.fromObject({ hours: 4, minutes: -12, seconds: -2 }), second = Duration.fromObject({ hours: -5, seconds: 6, milliseconds: 14 }), result = first.plus(second); expect(result.hours).toBe(-1); expect(result.minutes).toBe(-12); expect(result.seconds).toBe(4); expect(result.milliseconds).toBe(14); }); test("Duration#plus adds single values", () => { const first = Duration.fromObject({ hours: 4, minutes: 12, seconds: 2 }), result = first.plus({ minutes: 5 }); expect(result.hours).toBe(4); expect(result.minutes).toBe(17); expect(result.seconds).toBe(2); }); test("Duration#plus adds number as milliseconds", () => { const first = Duration.fromObject({ minutes: 11, seconds: 22 }), result = first.plus(333); expect(result.minutes).toBe(11); expect(result.seconds).toBe(22); expect(result.milliseconds).toBe(333); }); test("Duration#plus maintains invalidity", () => { const dur = Duration.invalid("because").plus({ minutes: 5 }); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); test("Duration#plus results in the superset of units", () => { let dur = Duration.fromObject({ hours: 1, minutes: 0 }).plus({ seconds: 3, milliseconds: 0 }); expect(dur.toObject()).toEqual({ hours: 1, minutes: 0, seconds: 3, milliseconds: 0 }); dur = Duration.fromObject({ hours: 1, minutes: 0 }).plus({}); expect(dur.toObject()).toEqual({ hours: 1, minutes: 0 }); }); test("Duration#plus throws with invalid parameter", () => { expect(() => Duration.fromObject({}).plus("123")).toThrow(); }); //------ // #minus() //------ test("Duration#minus subtracts durations", () => { const first = Duration.fromObject({ hours: 4, minutes: 12, seconds: 2 }), second = Duration.fromObject({ hours: 1, seconds: 6, milliseconds: 14 }), result = first.minus(second); expect(result.hours).toBe(3); expect(result.minutes).toBe(12); expect(result.seconds).toBe(-4); expect(result.milliseconds).toBe(-14); }); test("Duration#minus subtracts fractional durations", () => { const first = Duration.fromObject({ hours: 4.2, minutes: 12, seconds: 2 }), second = Duration.fromObject({ hours: 1, seconds: 6, milliseconds: 14 }), result = first.minus(second); expect(result.hours).toBeCloseTo(3.2, 8); expect(result.minutes).toBe(12); expect(result.seconds).toBe(-4); expect(result.milliseconds).toBe(-14); }); test("Duration#minus subtracts single values", () => { const first = Duration.fromObject({ hours: 4, minutes: 12, seconds: 2 }), result = first.minus({ minutes: 5 }); expect(result.hours).toBe(4); expect(result.minutes).toBe(7); expect(result.seconds).toBe(2); }); test("Duration#minus maintains invalidity", () => { const dur = Duration.invalid("because").minus({ minutes: 5 }); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); //------ // #negate() //------ test("Duration#negate flips all the signs", () => { const dur = Duration.fromObject({ hours: 4, minutes: -12, seconds: 2 }), result = dur.negate(); expect(result.hours).toBe(-4); expect(result.minutes).toBe(12); expect(result.seconds).toBe(-2); }); test("Duration#negate preserves invalidity", () => { const dur = Duration.invalid("because"), result = dur.negate(); expect(result.isValid).toBe(false); expect(result.invalidReason).toBe("because"); }); test("Duration#negate doesn't mutate", () => { const orig = Duration.fromObject({ hours: 8 }); orig.negate(); expect(orig.hours).toBe(8); }); test("Duration#negate preserves conversionAccuracy", () => { const dur = Duration.fromObject( { hours: 4, minutes: -12, seconds: 2, }, { conversionAccuracy: "longterm", } ), result = dur.negate(); expect(result.conversionAccuracy).toBe("longterm"); }); //------ // #mapUnits //------ test("Duration#units can multiply durations", () => { const dur = Duration.fromObject({ hours: 1, minutes: 2, seconds: -3, milliseconds: -4 }), result = dur.mapUnits((x) => x * 5); expect(result.hours).toBe(5); expect(result.minutes).toBe(10); expect(result.seconds).toBe(-15); expect(result.milliseconds).toBe(-20); }); test("Duration#units can take the unit into account", () => { const dur = Duration.fromObject({ hours: 1, minutes: 2, seconds: -3, milliseconds: -4 }), result = dur.mapUnits((x, u) => x * (u === "milliseconds" ? 2 : 5)); expect(result.hours).toBe(5); expect(result.minutes).toBe(10); expect(result.seconds).toBe(-15); expect(result.milliseconds).toBe(-8); }); test("Duration#mapUnits maintains invalidity", () => { const dur = Duration.invalid("because").mapUnits((x) => x * 5); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); test("Duration#mapUnits requires that fn return a number", () => { const dur = Duration.fromObject({ hours: 1, minutes: 2, seconds: -3, milliseconds: -4 }); expect(() => dur.mapUnits(() => "hello?")).toThrow(); }); moment-luxon-93c85a3/test/duration/parse.test.js000066400000000000000000000100031477254173100217540ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; //------ // #fromISO() //------ const check = (s, ob) => { expect(Duration.fromISO(s).toObject()).toEqual(ob); }; test("Duration.fromISO can parse a variety of ISO formats", () => { check("P5Y3M", { years: 5, months: 3 }); check("PT54M32S", { minutes: 54, seconds: 32 }); check("P3DT54M32S", { days: 3, minutes: 54, seconds: 32 }); check("P1YT34000S", { years: 1, seconds: 34000 }); check("P1W1DT13H23M34S", { weeks: 1, days: 1, hours: 13, minutes: 23, seconds: 34 }); check("P2W", { weeks: 2 }); check("PT10000000000000000000.999S", { seconds: 10000000000000000000, milliseconds: 999 }); }); test("Duration.fromISO can parse mixed or negative durations", () => { check("P-5Y-3M", { years: -5, months: -3 }); check("PT-54M32S", { minutes: -54, seconds: 32 }); check("P-3DT54M-32S", { days: -3, minutes: 54, seconds: -32 }); check("P1YT-34000S", { years: 1, seconds: -34000 }); check("P-1W1DT13H23M34S", { weeks: -1, days: 1, hours: 13, minutes: 23, seconds: 34 }); check("P-2W", { weeks: -2 }); check("-P1D", { days: -1 }); check("-P5Y3M", { years: -5, months: -3 }); check("-P-5Y-3M", { years: 5, months: 3 }); check("-P-1W1DT13H-23M34S", { weeks: 1, days: -1, hours: -13, minutes: 23, seconds: -34 }); check("PT-1.5S", { seconds: -1, milliseconds: -500 }); check("PT-0.5S", { seconds: 0, milliseconds: -500 }); check("PT1.5S", { seconds: 1, milliseconds: 500 }); check("PT0.5S", { seconds: 0, milliseconds: 500 }); }); test("Duration.fromISO can parse fractions of seconds", () => { expect(Duration.fromISO("PT54M32.5S").toObject()).toEqual({ minutes: 54, seconds: 32, milliseconds: 500, }); expect(Duration.fromISO("PT54M32.53S").toObject()).toEqual({ minutes: 54, seconds: 32, milliseconds: 530, }); expect(Duration.fromISO("PT54M32.534S").toObject()).toEqual({ minutes: 54, seconds: 32, milliseconds: 534, }); expect(Duration.fromISO("PT54M32.5348S").toObject()).toEqual({ minutes: 54, seconds: 32, milliseconds: 534, }); expect(Duration.fromISO("PT54M32.034S").toObject()).toEqual({ minutes: 54, seconds: 32, milliseconds: 34, }); }); test("Duration.fromISO can parse fractions", () => { expect(Duration.fromISO("P1.5Y").toObject()).toEqual({ years: 1.5, }); expect(Duration.fromISO("P1.5M").toObject()).toEqual({ months: 1.5, }); expect(Duration.fromISO("P1.5W").toObject()).toEqual({ weeks: 1.5, }); expect(Duration.fromISO("P1.5D").toObject()).toEqual({ days: 1.5, }); expect(Duration.fromISO("PT9.5H").toObject()).toEqual({ hours: 9.5, }); }); const rejects = (s) => { expect(Duration.fromISO(s).isValid).toBe(false); }; test("Duration.fromISO rejects junk", () => { rejects("poop"); rejects("PTglorb"); rejects("P5Y34S"); rejects("5Y"); rejects("P34S"); rejects("P34K"); rejects("P5D2W"); }); //------ // #fromISOTime() //------ const checkTime = (s, ob) => { expect(Duration.fromISOTime(s).toObject()).toEqual(ob); }; test("Duration.fromISOTime can parse a variety of extended ISO time formats", () => { checkTime("11:22:33.444", { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }); checkTime("11:22:33", { hours: 11, minutes: 22, seconds: 33 }); checkTime("11:22", { hours: 11, minutes: 22, seconds: 0 }); checkTime("T11:22", { hours: 11, minutes: 22, seconds: 0 }); }); test("Duration.fromISOTime can parse a variety of basic ISO time formats", () => { checkTime("112233.444", { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }); checkTime("112233", { hours: 11, minutes: 22, seconds: 33 }); checkTime("1122", { hours: 11, minutes: 22, seconds: 0 }); checkTime("11", { hours: 11, minutes: 0, seconds: 0 }); checkTime("T1122", { hours: 11, minutes: 22, seconds: 0 }); }); const rejectsTime = (s) => { expect(Duration.fromISOTime(s).isValid).toBe(false); }; test("Duration.fromISOTime rejects junk", () => { rejectsTime("poop"); rejectsTime("Tglorb"); rejectsTime("-00:00"); }); moment-luxon-93c85a3/test/duration/proto.test.js000066400000000000000000000005071477254173100220150ustar00rootroot00000000000000import { Duration } from "../../src/luxon"; test("Duration prototype properties should not throw when addressed", () => { const d = Duration.fromObject({ hours: 1 }); expect(() => Object.getOwnPropertyNames(Object.getPrototypeOf(d)).forEach( (name) => Object.getPrototypeOf(d)[name] ) ).not.toThrow(); }); moment-luxon-93c85a3/test/duration/reconfigure.test.js000066400000000000000000000024401477254173100231600ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; const dur = Duration.fromObject( { years: 1, months: 2, days: 3, }, { locale: "fr", numberingSystem: "beng", conversionAccuracy: "longterm", } ); //------ // #reconfigure() //------ test("Duration#reconfigure() sets the locale", () => { const recon = dur.reconfigure({ locale: "it" }); expect(recon.locale).toBe("it"); expect(recon.numberingSystem).toBe("beng"); expect(recon.conversionAccuracy).toBe("longterm"); }); test("Duration#reconfigure() sets the numberingSystem", () => { const recon = dur.reconfigure({ numberingSystem: "thai" }); expect(recon.locale).toBe("fr"); expect(recon.numberingSystem).toBe("thai"); expect(recon.conversionAccuracy).toBe("longterm"); }); test("Duration#reconfigure() sets the conversion accuracy", () => { const recon = dur.reconfigure({ conversionAccuracy: "casual" }); expect(recon.locale).toBe("fr"); expect(recon.numberingSystem).toBe("beng"); expect(recon.conversionAccuracy).toBe("casual"); }); test("Duration#reconfigure() with no arguments does nothing", () => { const recon = dur.reconfigure(); expect(recon.locale).toBe("fr"); expect(recon.numberingSystem).toBe("beng"); expect(recon.conversionAccuracy).toBe("longterm"); }); moment-luxon-93c85a3/test/duration/set.test.js000066400000000000000000000021611477254173100214430ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; //------ // years/months/days/hours/minutes/seconds/milliseconds //------- const dur = () => Duration.fromObject({ years: 1, months: 1, days: 1, hours: 1, minutes: 1, seconds: 1, milliseconds: 1, }); test("Duration#set() sets the values", () => { expect(dur().set({ years: 2 }).years).toBe(2); expect(dur().set({ months: 2 }).months).toBe(2); expect(dur().set({ days: 2 }).days).toBe(2); expect(dur().set({ hours: 4 }).hours).toBe(4); expect(dur().set({ hours: 4.5 }).hours).toBe(4.5); expect(dur().set({ minutes: 16 }).minutes).toBe(16); expect(dur().set({ seconds: 45 }).seconds).toBe(45); expect(dur().set({ milliseconds: 86 }).milliseconds).toBe(86); }); test("Duration#set() throws for metadata", () => { expect(() => dur.set({ locale: "be" })).toThrow(); expect(() => dur.set({ numberingSystem: "thai" })).toThrow(); expect(() => dur.set({ invalid: 42 })).toThrow(); }); test("Duration#set maintains invalidity", () => { expect(Duration.invalid("because").set({ hours: 200 }).isValid).toBe(false); }); moment-luxon-93c85a3/test/duration/typecheck.test.js000066400000000000000000000015331477254173100226310ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; //------ // #isDuration //------- test("Duration#isDuration return true for valid duration", () => { const dur = Duration.fromObject({ hours: 1, minutes: 4.5 }); expect(Duration.isDuration(dur)).toBe(true); }); test("Duration#isDuration return true for invalid duration", () => { const dur = Duration.invalid("because"); expect(Duration.isDuration(dur)).toBe(true); }); test("Duration#isDuration return false for primitives", () => { expect(Duration.isDuration({})).toBe(false); expect(Duration.isDuration({ hours: 60 })).toBe(false); expect(Duration.isDuration(1)).toBe(false); expect(Duration.isDuration(1.1)).toBe(false); expect(Duration.isDuration("")).toBe(false); expect(Duration.isDuration(null)).toBe(false); expect(Duration.isDuration()).toBe(false); }); moment-luxon-93c85a3/test/duration/units.test.js000066400000000000000000000252211477254173100220140ustar00rootroot00000000000000/* global test expect */ import { Duration } from "../../src/luxon"; //------ // #shiftTo() //------- test("Duration#shiftTo rolls milliseconds up hours and minutes", () => { const dur = Duration.fromMillis(5760000); expect(dur.shiftTo("hours").hours).toBe(1.6); const mod = dur.shiftTo("hours", "minutes"); expect(mod.toObject()).toEqual({ hours: 1, minutes: 36 }); }); test("Duration#shiftTo boils hours down milliseconds", () => { const dur = Duration.fromObject({ hours: 1 }).shiftTo("milliseconds"); expect(dur.milliseconds).toBe(3600000); }); test("Duration boils hours down shiftTo minutes and milliseconds", () => { const dur = Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo("minutes", "milliseconds"); expect(dur.toObject()).toEqual({ minutes: 60, milliseconds: 30000 }); }); test("Duration#shiftTo boils down and then rolls up", () => { const dur = Duration.fromObject({ years: 2, hours: 5000 }).shiftTo("months", "days", "minutes"); expect(dur.toObject()).toEqual({ months: 30, days: 28, minutes: 8 * 60 }); }); test("Duration#shiftTo throws on invalid units", () => { expect(() => { Duration.fromObject({ years: 2, hours: 5000 }).shiftTo("months", "glorp"); }).toThrow(); }); test("Duration#shiftTo tacks decimals onto the end", () => { const dur = Duration.fromObject({ minutes: 73 }).shiftTo("hours"); expect(dur.isValid).toBe(true); expect(dur.hours).toBeCloseTo(1.2167, 4); }); test("Duration#shiftTo deconstructs decimal inputs", () => { const dur = Duration.fromObject({ hours: 2.3 }).shiftTo("hours", "minutes"); expect(dur.isValid).toBe(true); expect(dur.hours).toBe(2); expect(dur.minutes).toBeCloseTo(18, 8); }); test("Duration#shiftTo deconstructs in cascade and tacks decimal onto the end", () => { const dur = Duration.fromObject({ hours: 1.17 }).shiftTo("hours", "minutes", "seconds"); expect(dur.isValid).toBe(true); expect(dur.hours).toBe(1); expect(dur.minutes).toBe(10); expect(dur.seconds).toBeCloseTo(12, 8); }); test("Duration#shiftTo maintains invalidity", () => { const dur = Duration.invalid("because").shiftTo("years"); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); test("Duration#shiftTo without any units no-ops", () => { const dur = Duration.fromObject({ years: 3 }).shiftTo(); expect(dur.isValid).toBe(true); expect(dur.toObject()).toEqual({ years: 3 }); }); test("Duration#shiftTo accumulates when rolling up", () => { expect( Duration.fromObject({ minutes: 59, seconds: 183 }) .shiftTo("hours", "minutes", "seconds") .toObject() ).toEqual({ hours: 1, minutes: 2, seconds: 3 }); }); test("Duration#shiftTo keeps unnecessary higher-order negative units 0", () => { expect( Duration.fromObject({ milliseconds: -100 }).shiftTo("hours", "minutes", "seconds").toObject() ).toEqual({ hours: 0, minutes: 0, seconds: -0.1 }); }); test("Duration#shiftTo does not normalize values", () => { // Normalizing would convert to { quarters: 4, months: 1, days: 10 } // which would be converted back to 404 days instead expect( Duration.fromObject({ quarters: 0, months: 0, days: 400 }).shiftTo("days").toObject() ).toEqual({ days: 400 }); }); test("Duration#shiftTo boils hours down to hours and minutes", () => { const dur = Duration.fromObject({ hour: 2.4 }); expect(dur.shiftTo("hours", "minutes").toObject()).toEqual({ hours: 2, minutes: 24, }); }); test("Duration#shiftTo handles mixed units", () => { const dur = Duration.fromObject({ weeks: -1, days: 14 }); expect(dur.shiftTo("years", "months", "weeks").toObject()).toEqual({ years: 0, months: 0, weeks: 1, }); }); test("Duration#shiftTo does not produce unnecessary fractions in higher order units", () => { const duration = Duration.fromObject( { years: 2.5, weeks: -1 }, { conversionAccuracy: "longterm" } ); const shifted = duration.shiftTo("years", "weeks", "minutes").toObject(); expect(shifted.years).toBe(2); expect(shifted.weeks).toBe(25); expect(shifted.minutes).toBeCloseTo(894.6, 5); }); //------ // #shiftToAll() //------- test("Duration#shiftToAll shifts to all available units", () => { const dur = Duration.fromMillis(5760000).shiftToAll(); expect(dur.toObject()).toEqual({ years: 0, months: 0, weeks: 0, days: 0, hours: 1, minutes: 36, seconds: 0, milliseconds: 0, }); }); test("Duration#shiftToAll does not produce unnecessary fractions in higher order units", () => { const duration = Duration.fromObject( { years: 2.5, weeks: -1, seconds: 0 }, { conversionAccuracy: "longterm" } ); const toAll = duration.shiftToAll().toObject(); expect(toAll.years).toBe(2); expect(toAll.months).toBe(5); expect(toAll.weeks).toBe(3); expect(toAll.days).toBe(2); expect(toAll.hours).toBe(10); expect(toAll.minutes).toBe(29); expect(toAll.seconds).toBe(6); expect(toAll.milliseconds).toBeCloseTo(0, 5); }); test("Duration#shiftToAll maintains invalidity", () => { const dur = Duration.invalid("because").shiftToAll(); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); //------ // #normalize() //------- test("Duration#normalize rebalances negative units", () => { const dur = Duration.fromObject({ years: 2, days: -2 }).normalize(); expect(dur.toObject()).toEqual({ years: 1, days: 363 }); }); test("Duration#normalize de-overflows", () => { const dur = Duration.fromObject({ years: 2, days: 5000 }).normalize(); expect(dur.years).toBe(15); expect(dur.days).toBe(255); expect(dur.toObject()).toEqual({ years: 15, days: 255 }); }); test("Duration#normalize handles fully negative durations", () => { const dur = Duration.fromObject({ years: -2, days: -5000 }).normalize(); expect(dur.toObject()).toEqual({ years: -15, days: -255 }); }); test("Duration#normalize handles the full grid partially negative durations", () => { const sets = [ [ { months: 1, days: 32 }, { months: 2, days: 2 }, ], [ { months: 1, days: 28 }, { months: 1, days: 28 }, ], [ { months: 1, days: -32 }, { months: 0, days: -2 }, ], [ { months: 1, days: -28 }, { months: 0, days: 2 }, ], [ { months: -1, days: 32 }, { months: 0, days: 2 }, ], [ { months: -1, days: 28 }, { months: 0, days: -2 }, ], [ { months: -1, days: -32 }, { months: -2, days: -2 }, ], [ { months: -1, days: -28 }, { months: -1, days: -28 }, ], [ { months: 0, days: 32 }, { months: 1, days: 2 }, ], [ { months: 0, days: 28 }, { months: 0, days: 28 }, ], [ { months: 0, days: -32 }, { months: -1, days: -2 }, ], [ { months: 0, days: -28 }, { months: 0, days: -28 }, ], [ { hours: 96, minutes: 0, seconds: -10 }, { hours: 95, minutes: 59, seconds: 50 }, ], ]; sets.forEach(([from, to]) => { expect(Duration.fromObject(from).normalize().toObject()).toEqual(to); }); }); test("Duration#normalize maintains invalidity", () => { const dur = Duration.invalid("because").normalize(); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); test("Duration#normalize can convert all unit pairs", () => { const units = [ "years", "quarters", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", ]; for (let i = 0; i < units.length; i++) { for (let j = i + 1; j < units.length; j++) { const duration = Duration.fromObject({ [units[i]]: 1, [units[j]]: 2 }); const normalizedDuration = duration.normalize().toObject(); expect(normalizedDuration[units[i]]).not.toBe(NaN); expect(normalizedDuration[units[j]]).not.toBe(NaN); const accurateDuration = duration.reconfigure({ conversionAccuracy: "longterm" }); const normalizedAccurateDuration = accurateDuration.normalize().toObject(); expect(normalizedAccurateDuration[units[i]]).not.toBe(NaN); expect(normalizedAccurateDuration[units[j]]).not.toBe(NaN); } } }); test("Duration#normalize moves fractions to lower-order units", () => { expect(Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject()).toEqual({ years: 2, days: 182, hours: 12, }); expect(Duration.fromObject({ years: -2.5, days: 0, hours: 0 }).normalize().toObject()).toEqual({ years: -2, days: -182, hours: -12, }); expect(Duration.fromObject({ years: 2.5, days: 12, hours: 0 }).normalize().toObject()).toEqual({ years: 2, days: 194, hours: 12, }); expect(Duration.fromObject({ years: 2.5, days: 12.25, hours: 0 }).normalize().toObject()).toEqual( { years: 2, days: 194, hours: 18 } ); }); test("Duration#normalize does not produce fractions in higher order units when rolling up negative lower order unit values", () => { const normalized = Duration.fromObject( { years: 100, months: 0, weeks: -1, days: 0 }, { conversionAccuracy: "longterm" } ) .normalize() .toObject(); expect(normalized.years).toBe(99); expect(normalized.months).toBe(11); expect(normalized.weeks).toBe(3); expect(normalized.days).toBeCloseTo(2.436875, 7); }); //------ // #rescale() //------- test("Duration#rescale normalizes, shifts to all units and remove units with a value of 0", () => { const sets = [ [{ milliseconds: 90000 }, { minutes: 1, seconds: 30 }], [ { minutes: 70, milliseconds: 12100 }, { hours: 1, minutes: 10, seconds: 12, milliseconds: 100 }, ], [{ months: 2, days: -30 }, { months: 1 }], ]; sets.forEach(([from, to]) => { expect(Duration.fromObject(from).rescale().toObject()).toEqual(to); }); }); test("Duration#rescale maintains invalidity", () => { const dur = Duration.invalid("because").rescale(); expect(dur.isValid).toBe(false); expect(dur.invalidReason).toBe("because"); }); //------ // #as() //------- test("Duration#as shifts to one unit and returns it", () => { const dur = Duration.fromMillis(5760000); expect(dur.as("hours")).toBe(1.6); }); test("Duration#as returns null for invalid durations", () => { expect(Duration.invalid("because").as("hours")).toBeFalsy(); }); //------ // #valueOf() //------- test("Duration#valueOf value of zero duration", () => { const dur = Duration.fromObject({}); expect(dur.valueOf()).toBe(0); }); test("Duration#valueOf returns as millisecond value (lower order units)", () => { const dur = Duration.fromObject({ hours: 1, minutes: 36, seconds: 0 }); expect(dur.valueOf()).toBe(5760000); }); test("Duration#valueOf value of the duration with lower and higher order units", () => { const dur = Duration.fromObject({ days: 2, seconds: 1 }); expect(dur.valueOf()).toBe(172801000); }); moment-luxon-93c85a3/test/helpers.js000066400000000000000000000035401477254173100175110ustar00rootroot00000000000000/* global test */ import { DateTime, Settings } from "../src/luxon"; exports.withoutRTF = function (name, f) { const fullName = `With no RelativeTimeFormat support, ${name}`; test(fullName, () => { const rtf = Intl.RelativeTimeFormat; try { Intl.RelativeTimeFormat = undefined; Settings.resetCaches(); f(); } finally { Intl.RelativeTimeFormat = rtf; } }); }; exports.withoutLocaleWeekInfo = function (name, f) { const fullName = `With no Intl.Locale.weekInfo support, ${name}`; test(fullName, () => { const l = Intl.Locale; try { Intl.Locale = undefined; Settings.resetCaches(); f(); } finally { Intl.Locale = l; } }); }; exports.withNow = function (name, dt, f) { test(name, () => { const oldNow = Settings.now; try { Settings.now = () => dt.valueOf(); f(); } finally { Settings.now = oldNow; } }); }; // not a tester! exports.withDefaultZone = function (zone, f) { try { Settings.defaultZone = zone; f(); } finally { Settings.defaultZone = null; } }; exports.withDefaultLocale = function (locale, f) { try { Settings.defaultLocale = locale; f(); } finally { Settings.defaultLocale = null; } }; exports.setUnset = function (prop) { return (value, f) => { const existing = Settings[prop]; try { Settings[prop] = value; f(); } finally { Settings[prop] = existing; } }; }; exports.atHour = function (hour) { return DateTime.fromObject({ year: 2017, month: 5, day: 25 }).startOf("day").set({ hour }); }; exports.cldrMajorVersion = function () { try { const cldr = process?.versions?.cldr; if (cldr) { const match = cldr.match(/^(\d+)\./); if (match) { return parseInt(match[1]); } } return null; } catch { return null; } }; moment-luxon-93c85a3/test/impl/000077500000000000000000000000001477254173100164505ustar00rootroot00000000000000moment-luxon-93c85a3/test/impl/english.test.js000066400000000000000000000133731477254173100214240ustar00rootroot00000000000000/* global test expect */ import * as Formats from "../../src/impl/formats"; import { formatRelativeTime, formatString, weekdays, eras } from "../../src/impl/english"; test("today", () => { expect(formatRelativeTime("days", 0, "auto")).toBe("today"); expect(formatRelativeTime("days", 0, "always")).toBe("in 0 days"); }); test("tomorrow", () => { expect(formatRelativeTime("days", 1, "auto")).toBe("tomorrow"); expect(formatRelativeTime("days", 1, "always")).toBe("in 1 day"); }); test("yesterday", () => { expect(formatRelativeTime("days", -1, "auto")).toBe("yesterday"); expect(formatRelativeTime("days", -1, "always")).toBe("1 day ago"); }); test("in 0.5 days", () => { expect(formatRelativeTime("days", 1.5, "auto")).toBe("in 1.5 days"); expect(formatRelativeTime("days", 1.5, "always")).toBe("in 1.5 days"); }); test("0.5 days ago", () => { expect(formatRelativeTime("days", -1.5, "auto")).toBe("1.5 days ago"); expect(formatRelativeTime("days", -1.5, "always")).toBe("1.5 days ago"); }); test("2 days ago", () => { expect(formatRelativeTime("days", -2, "auto")).toBe("2 days ago"); expect(formatRelativeTime("days", -2, "always")).toBe("2 days ago"); }); test("this month", () => { expect(formatRelativeTime("months", 0, "auto")).toBe("this month"); expect(formatRelativeTime("months", 0, "always")).toBe("in 0 months"); expect(formatRelativeTime("months", -0, "always")).toBe("0 months ago"); expect(formatRelativeTime("months", 0, "always", true)).toBe("in 0 mo."); expect(formatRelativeTime("months", -0, "always", true)).toBe("0 mo. ago"); }); test("next month", () => { expect(formatRelativeTime("months", 1, "auto")).toBe("next month"); expect(formatRelativeTime("months", 1, "auto", true)).toBe("next month"); expect(formatRelativeTime("months", 1, "always")).toBe("in 1 month"); expect(formatRelativeTime("months", 1, "always", true)).toBe("in 1 mo."); }); test("last month", () => { expect(formatRelativeTime("months", -1, "auto")).toBe("last month"); expect(formatRelativeTime("months", -1, "auto", true)).toBe("last month"); expect(formatRelativeTime("months", -1, "always")).toBe("1 month ago"); expect(formatRelativeTime("months", -1, "always", true)).toBe("1 mo. ago"); }); test("in 3 months", () => { expect(formatRelativeTime("months", 3, "auto")).toBe("in 3 months"); expect(formatRelativeTime("months", 3, "auto", true)).toBe("in 3 mo."); expect(formatRelativeTime("months", 3, "always")).toBe("in 3 months"); expect(formatRelativeTime("months", 3, "always", true)).toBe("in 3 mo."); }); test("in 1 hour", () => { expect(formatRelativeTime("hours", 1, "auto")).toBe("in 1 hour"); expect(formatRelativeTime("hours", 1, "always")).toBe("in 1 hour"); }); test("in 1 hour", () => { expect(formatRelativeTime("hours", 1, "auto")).toBe("in 1 hour"); expect(formatRelativeTime("hours", 1, "auto", true)).toBe("in 1 hr."); expect(formatRelativeTime("hours", 1, "always")).toBe("in 1 hour"); expect(formatRelativeTime("hours", 1, "always", true)).toBe("in 1 hr."); }); test("1 hour ago", () => { expect(formatRelativeTime("hours", -1, "auto")).toBe("1 hour ago"); expect(formatRelativeTime("hours", -1, "auto", true)).toBe("1 hr. ago"); expect(formatRelativeTime("hours", -1, "always")).toBe("1 hour ago"); expect(formatRelativeTime("hours", -1, "always", true)).toBe("1 hr. ago"); }); test("formatString", () => { expect(formatString(Formats.DATE_SHORT)).toBe("M/d/yyyy"); expect(formatString(Formats.DATE_MED)).toBe("LLL d, yyyy"); expect(formatString(Formats.DATE_MED_WITH_WEEKDAY)).toBe("EEE, LLL d, yyyy"); expect(formatString(Formats.DATE_FULL)).toBe("LLLL d, yyyy"); expect(formatString(Formats.DATE_HUGE)).toBe("EEEE, LLLL d, yyyy"); expect(formatString(Formats.TIME_SIMPLE)).toBe("h:mm a"); expect(formatString(Formats.TIME_WITH_SECONDS)).toBe("h:mm:ss a"); expect(formatString(Formats.TIME_WITH_SHORT_OFFSET)).toBe("h:mm a"); expect(formatString(Formats.TIME_WITH_LONG_OFFSET)).toBe("h:mm a"); expect(formatString(Formats.TIME_24_SIMPLE)).toBe("HH:mm"); expect(formatString(Formats.TIME_24_WITH_SECONDS)).toBe("HH:mm:ss"); expect(formatString(Formats.TIME_24_WITH_SHORT_OFFSET)).toBe("HH:mm"); expect(formatString(Formats.TIME_24_WITH_LONG_OFFSET)).toBe("HH:mm"); expect(formatString(Formats.DATETIME_SHORT)).toBe("M/d/yyyy, h:mm a"); expect(formatString(Formats.DATETIME_MED)).toBe("LLL d, yyyy, h:mm a"); expect(formatString(Formats.DATETIME_FULL)).toBe("LLLL d, yyyy, h:mm a"); expect(formatString(Formats.DATETIME_HUGE)).toBe("EEEE, LLLL d, yyyy, h:mm a"); expect(formatString(Formats.DATETIME_SHORT_WITH_SECONDS)).toBe("M/d/yyyy, h:mm:ss a"); expect(formatString(Formats.DATETIME_MED_WITH_SECONDS)).toBe("LLL d, yyyy, h:mm:ss a"); expect(formatString(Formats.DATETIME_MED_WITH_WEEKDAY)).toBe("EEE, d LLL yyyy, h:mm a"); expect(formatString(Formats.DATETIME_FULL_WITH_SECONDS)).toBe("LLLL d, yyyy, h:mm:ss a"); expect(formatString(Formats.DATETIME_HUGE_WITH_SECONDS)).toBe("EEEE, LLLL d, yyyy, h:mm:ss a"); expect(formatString("Default")).toBe("EEEE, LLLL d, yyyy, h:mm a"); }); test("weekdays", () => { expect(weekdays("narrow")).toStrictEqual(["M", "T", "W", "T", "F", "S", "S"]); expect(weekdays("short")).toStrictEqual(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]); expect(weekdays("long")).toStrictEqual([ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]); expect(weekdays("numeric")).toStrictEqual(["1", "2", "3", "4", "5", "6", "7"]); expect(weekdays(null)).toStrictEqual(null); }); test("eras", () => { expect(eras("narrow")).toStrictEqual(["B", "A"]); expect(eras("short")).toStrictEqual(["BC", "AD"]); expect(eras("long")).toStrictEqual(["Before Christ", "Anno Domini"]); expect(eras("default")).toStrictEqual(null); }); moment-luxon-93c85a3/test/info/000077500000000000000000000000001477254173100164425ustar00rootroot00000000000000moment-luxon-93c85a3/test/info/features.test.js000066400000000000000000000010161477254173100215720ustar00rootroot00000000000000/* global test expect */ import { Info } from "../../src/luxon"; const Helpers = require("../helpers"); test("Info.features shows this environment supports all the features", () => { expect(Info.features().relative).toBe(true); expect(Info.features().localeWeek).toBe(true); }); Helpers.withoutRTF("Info.features shows no support", () => { expect(Info.features().relative).toBe(false); }); Helpers.withoutLocaleWeekInfo("Info.features shows no support", () => { expect(Info.features().localeWeek).toBe(false); }); moment-luxon-93c85a3/test/info/listers.test.js000066400000000000000000000164041477254173100214500ustar00rootroot00000000000000/* global test expect */ import { Info } from "../../src/luxon"; import Helpers from "../helpers"; const withDefaultLocale = Helpers.withDefaultLocale; //------ // .months() //------ test("Info.months lists all the months", () => { expect(Info.months("long")).toEqual([ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]); expect(Info.months("short", { locale: "en" })).toEqual([ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]); expect(Info.months("narrow", { locale: "en" })).toEqual([ "J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D", ]); expect(Info.months("numeric", { locale: "en" })).toEqual([ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", ]); expect(Info.months("2-digit", { locale: "en" })).toEqual([ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", ]); }); test("Info.months respects the numbering system", () => { expect(Info.months("numeric", { locale: "en", numberingSystem: "beng" })).toEqual([ "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "১০", "১১", "১২", ]); }); test("Info.months respects the calendar", () => { expect(Info.months("long", { locale: "en", outputCalendar: "islamic" })).toEqual([ "Muharram", "Safar", "Rabiʻ I", "Rabiʻ II", "Jumada I", "Jumada II", "Rajab", "Shaʻban", "Ramadan", "Shawwal", "Dhuʻl-Qiʻdah", "Dhuʻl-Hijjah", ]); }); test("Info.months respects the locale", () => { expect(Info.months("numeric", { locale: "bn" })).toEqual([ "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯", "১০", "১১", "১২", ]); // these should arguably be 1月, 2月, etc, but this at least documents how it works expect(Info.months("short", { locale: "ja-JP" })).toEqual([ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", ]); expect(Info.monthsFormat("long", { locale: "ru" })).toEqual([ "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря", ]); }); test("Info.months defaults to long names", () => { expect(Info.months()).toEqual([ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]); }); //------ // .monthsFormat() //------ test("Info.monthsFormat lists all the months", () => { expect(Info.monthsFormat("long", { locale: "en" })).toEqual([ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]); // this passes, but is wrong. These are the same as the standalone values expect(Info.monthsFormat("long", { locale: "ru" })).toEqual([ "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря", ]); expect(Info.monthsFormat("short", { locale: "en" })).toEqual([ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]); expect(Info.monthsFormat("numeric", { locale: "en" })).toEqual([ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", ]); }); test("Info.monthsFormat defaults to long names", () => { expect(Info.monthsFormat()).toEqual([ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ]); }); //------ // .weekdays() //------ test("Info.weekdays lists all the weekdays", () => { expect(Info.weekdays("long", { locale: "en" })).toEqual([ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]); expect(Info.weekdays("short", { locale: "en" })).toEqual([ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", ]); expect(Info.weekdays("narrow", { locale: "en" })).toEqual(["M", "T", "W", "T", "F", "S", "S"]); expect(Info.weekdays("long", { locale: "ru" })).toEqual([ "понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье", ]); }); test("Info.weekdays defaults to long names", () => { expect(Info.weekdays()).toEqual([ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]); }); //------ // .weekdaysFormat() //------ test("Info.weekdaysFormat lists all the weekdays", () => { expect(Info.weekdaysFormat("long", { locale: "en" })).toEqual([ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]); expect(Info.weekdaysFormat("short", { locale: "en" })).toEqual([ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun", ]); }); test("Info.weekdaysFormat defaults to long names", () => { expect(Info.weekdaysFormat()).toEqual([ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ]); }); //------ // .meridiems() //------ test("Info.meridiems lists the meridiems", () => { expect(Info.meridiems({ locale: "en" })).toEqual(["AM", "PM"]); expect(Info.meridiems({ locale: "my" })).toEqual(["နံနက်", "ညနေ"]); }); test("Info.meridiems defaults to the current locale", () => { expect(Info.meridiems()).toEqual(["AM", "PM"]); }); //------ // .eras() //------ test("Info.eras lists both eras", () => { expect(Info.eras()).toEqual(["BC", "AD"]); expect(Info.eras("short")).toEqual(["BC", "AD"]); expect(Info.eras("long")).toEqual(["Before Christ", "Anno Domini"]); expect(Info.eras("short", { locale: "fr" })).toEqual(["av. J.-C.", "ap. J.-C."]); expect(Info.eras("long", { locale: "fr" })).toEqual(["avant Jésus-Christ", "après Jésus-Christ"]); }); //------ // general //------ test("Info English lists are not mutable", () => { withDefaultLocale("en-US", () => { const cachingMethods = [ ["weekdays", "short"], ["weekdays", "long"], ["weekdays", "narrow"], ["weekdays", "numeric"], ["months", "short"], ["months", "long"], ["months", "narrow"], ["months", "numeric"], ["months", "2-digit"], ["eras", "narrow"], ["eras", "short"], ["eras", "long"], ]; for (const [method, arg] of cachingMethods) { const fn = Info[method]; const original = [...fn(arg)]; fn(arg).pop(); const expected = fn(arg); expect(expected).toEqual(original); } }); }); moment-luxon-93c85a3/test/info/localeWeek.test.js000066400000000000000000000037601477254173100220370ustar00rootroot00000000000000/* global test expect */ import { Info } from "../../src/luxon"; const Helpers = require("../helpers"); test("Info.getStartOfWeek reports the correct start of the week", () => { expect(Info.getStartOfWeek({ locale: "en-US" })).toBe(7); expect(Info.getStartOfWeek({ locale: "de-DE" })).toBe(1); }); Helpers.withoutLocaleWeekInfo("Info.getStartOfWeek reports Monday as the start of the week", () => { expect(Info.getStartOfWeek({ locale: "en-US" })).toBe(1); expect(Info.getStartOfWeek({ locale: "de-DE" })).toBe(1); }); test("Info.getMinimumDaysInFirstWeek reports the correct value", () => { expect(Info.getMinimumDaysInFirstWeek({ locale: "en-US" })).toBe(1); expect(Info.getMinimumDaysInFirstWeek({ locale: "de-DE" })).toBe(4); }); Helpers.withoutLocaleWeekInfo("Info.getMinimumDaysInFirstWeek reports 4", () => { expect(Info.getMinimumDaysInFirstWeek({ locale: "en-US" })).toBe(4); expect(Info.getMinimumDaysInFirstWeek({ locale: "de-DE" })).toBe(4); }); test("Info.getWeekendWeekdays reports the correct value", () => { expect(Info.getWeekendWeekdays({ locale: "en-US" })).toStrictEqual([6, 7]); expect(Info.getWeekendWeekdays({ locale: "he" })).toStrictEqual([5, 6]); }); Helpers.withoutLocaleWeekInfo("Info.getWeekendWeekdays reports [6, 7]", () => { expect(Info.getWeekendWeekdays({ locale: "en-US" })).toStrictEqual([6, 7]); expect(Info.getWeekendWeekdays({ locale: "he" })).toStrictEqual([6, 7]); }); test("Info.getStartOfWeek honors the default locale", () => { Helpers.withDefaultLocale("en-US", () => { expect(Info.getStartOfWeek()).toBe(7); expect(Info.getMinimumDaysInFirstWeek()).toBe(1); expect(Info.getWeekendWeekdays()).toStrictEqual([6, 7]); }); Helpers.withDefaultLocale("de-DE", () => { expect(Info.getStartOfWeek()).toBe(1); }); Helpers.withDefaultLocale("he", () => { expect(Info.getWeekendWeekdays()).toStrictEqual([5, 6]); }); Helpers.withDefaultLocale("he", () => { expect(Info.getWeekendWeekdays()).toStrictEqual([5, 6]); }); }); moment-luxon-93c85a3/test/info/zones.test.js000066400000000000000000000071101477254173100211130ustar00rootroot00000000000000/* global test expect */ import { Info, FixedOffsetZone, IANAZone, InvalidZone, SystemZone, Settings, } from "../../src/luxon"; const Helpers = require("../helpers"); //------ // .hasDST() //------ test("Info.hasDST returns true for America/New_York", () => { expect(Info.hasDST("America/New_York")).toBe(true); }); test("Info.hasDST returns false for America/Aruba", () => { expect(Info.hasDST("America/Aruba")).toBe(false); }); test("Info.hasDST returns false for America/Cancun", () => { expect(Info.hasDST("America/Cancun")).toBe(false); }); test("Info.hasDST returns true for Europe/Andora", () => { expect(Info.hasDST("Europe/Andora")).toBe(true); }); test("Info.hasDST defaults to the global zone", () => { Helpers.withDefaultZone("America/Cancun", () => { expect(Info.hasDST()).toBe(false); }); }); //------ // .isValidIANAZone() //------ test("Info.isValidIANAZone returns true for valid zones", () => { expect(Info.isValidIANAZone("America/Cancun")).toBe(true); }); test("Info.isValidIANAZone returns true for single-section zones", () => { expect(Info.isValidIANAZone("UTC")).toBe(true); }); test("Info.isValidIANAZone returns false for junk", () => { expect(Info.isValidIANAZone("blorp")).toBe(false); }); test("Info.isValidIANAZone returns false for well-specified but invalid zones", () => { expect(Info.isValidIANAZone("America/Blork")).toBe(false); }); test("Info.isValidIANAZone returns true for valid zones like America/Indiana/Indianapolis", () => { expect(Info.isValidIANAZone("America/Indiana/Indianapolis")).toBe(true); }); test("Info.isValidIANAZone returns false for well-specified but invalid zones like America/Indiana/Blork", () => { expect(Info.isValidIANAZone("America/Indiana/Blork")).toBe(false); }); //------ // .normalizeZone() //------ test("Info.normalizeZone returns Zone objects unchanged", () => { const fixedOffsetZone = FixedOffsetZone.instance(5); expect(Info.normalizeZone(fixedOffsetZone)).toBe(fixedOffsetZone); const ianaZone = new IANAZone("Europe/Paris"); expect(Info.normalizeZone(ianaZone)).toBe(ianaZone); const invalidZone = new InvalidZone("bumblebee"); expect(Info.normalizeZone(invalidZone)).toBe(invalidZone); const systemZone = SystemZone.instance; expect(Info.normalizeZone(systemZone)).toBe(systemZone); }); test.each([ ["Local", SystemZone.instance], ["System", SystemZone.instance], ["UTC", FixedOffsetZone.utcInstance], ["GMT", FixedOffsetZone.utcInstance], ["Etc/GMT+5", new IANAZone("Etc/GMT+5")], ["Etc/GMT-10", new IANAZone("Etc/GMT-10")], ["Europe/Paris", new IANAZone("Europe/Paris")], [0, FixedOffsetZone.utcInstance], [3, FixedOffsetZone.instance(3)], [-11, FixedOffsetZone.instance(-11)], ])("Info.normalizeZone converts valid input %p into valid Zone instance", (input, expected) => { expect(Info.normalizeZone(input)).toEqual(expected); }); test("Info.normalizeZone converts unknown name to invalid Zone", () => { expect(Info.normalizeZone("bumblebee").isValid).toBe(false); }); test("Info.normalizeZone converts null and undefined to default Zone", () => { expect(Info.normalizeZone(null)).toBe(Settings.defaultZone); expect(Info.normalizeZone(undefined)).toBe(Settings.defaultZone); }); // Local zone no longer refers to default one but behaves as system // As per Docker Container, zone is America/New_York test("Info.normalizeZone converts local to system Zone", () => { expect(Info.normalizeZone("local")).toBe(Settings.defaultZone); Helpers.withDefaultZone("America/New_York", () => { expect(Info.normalizeZone("local").name).toBe("America/New_York"); }); }); moment-luxon-93c85a3/test/interval/000077500000000000000000000000001477254173100173335ustar00rootroot00000000000000moment-luxon-93c85a3/test/interval/create.test.js000066400000000000000000000075231477254173100221210ustar00rootroot00000000000000/* global test expect */ import { DateTime, Interval, Duration, Settings } from "../../src/luxon"; import Helpers from "../helpers"; const withThrowOnInvalid = Helpers.setUnset("throwOnInvalid"); //------ // .fromObject() //------- test("Interval.fromDateTimes creates an interval from datetimes", () => { const start = DateTime.fromObject({ year: 2016, month: 5, day: 25 }), end = DateTime.fromObject({ year: 2016, month: 5, day: 27 }), int = Interval.fromDateTimes(start, end); expect(int.start).toBe(start); expect(int.end).toBe(end); }); test("Interval.fromDateTimes creates an interval from objects", () => { const start = { year: 2016, month: 5, day: 25 }, end = { year: 2016, month: 5, day: 27 }, int = Interval.fromDateTimes(start, end); expect(int.start).toEqual(DateTime.fromObject(start)); expect(int.end).toEqual(DateTime.fromObject(end)); }); test("Interval.fromDateTimes creates an interval from Dates", () => { const start = DateTime.fromObject({ year: 2016, month: 5, day: 25, }).toJSDate(), end = DateTime.fromObject({ year: 2016, month: 5, day: 27 }).toJSDate(), int = Interval.fromDateTimes(start, end); expect(int.start.toJSDate()).toEqual(start); expect(int.end.toJSDate()).toEqual(end); }); test("Interval.fromDateTimes results in an invalid Interval if the endpoints are invalid", () => { const validDate = DateTime.fromObject({ year: 2016, month: 5, day: 25 }), invalidDate = DateTime.invalid("because"); expect(Interval.fromDateTimes(validDate, invalidDate).invalidReason).toBe( "missing or invalid end" ); expect(Interval.fromDateTimes(invalidDate, validDate).invalidReason).toBe( "missing or invalid start" ); expect(Interval.fromDateTimes(validDate.plus({ days: 1 }), validDate).invalidReason).toBe( "end before start" ); }); test("Interval.fromDateTimes throws with invalid input", () => { expect(() => Interval.fromDateTimes(DateTime.now(), true)).toThrow(); }); test("Interval.fromDateTimes throws with start date coming after end date", () => { const start = DateTime.fromObject({ year: 2016, month: 5, day: 25, }).toJSDate(), end = DateTime.fromObject({ year: 2016, month: 5, day: 27 }).toJSDate(); withThrowOnInvalid(true, () => { expect(() => Interval.fromDateTimes(end, start)).toThrow(); }); }); //------ // .after() //------- test("Interval.after takes a duration", () => { const start = DateTime.fromObject({ year: 2016, month: 5, day: 25 }), int = Interval.after(start, Duration.fromObject({ days: 3 })); expect(int.start).toBe(start); expect(int.end.day).toBe(28); }); test("Interval.after an object", () => { const start = DateTime.fromObject({ year: 2016, month: 5, day: 25 }), int = Interval.after(start, { days: 3 }); expect(int.start).toBe(start); expect(int.end.day).toBe(28); }); //------ // .before() //------- test("Interval.before takes a duration", () => { const end = DateTime.fromObject({ year: 2016, month: 5, day: 25 }), int = Interval.before(end, Duration.fromObject({ days: 3 })); expect(int.start.day).toBe(22); expect(int.end).toBe(end); }); test("Interval.before takes a number and unit", () => { const end = DateTime.fromObject({ year: 2016, month: 5, day: 25 }), int = Interval.before(end, { days: 3 }); expect(int.start.day).toBe(22); expect(int.end).toBe(end); }); //------ // .invalid() //------- test("Interval.invalid produces invalid Intervals", () => { expect(Interval.invalid("because").isValid).toBe(false); }); test("Interval.invalid throws if throwOnInvalid is set", () => { try { Settings.throwOnInvalid = true; expect(() => Interval.invalid("because")).toThrow(); } finally { Settings.throwOnInvalid = false; } }); test("Interval.invalid throws if no reason is specified", () => { expect(() => Interval.invalid()).toThrow(); }); moment-luxon-93c85a3/test/interval/format.test.js000066400000000000000000000177271477254173100221550ustar00rootroot00000000000000/* global test expect */ import { Interval, DateTime } from "../../src/luxon"; const fromISOs = (s, e) => DateTime.fromISO(s, { setZone: true }).until(DateTime.fromISO(e, { setZone: true })), interval = fromISOs("1982-05-25T09:00Z", "1983-10-14T13:30Z"), invalid = Interval.invalid("because"); //------ // .toString() //------ test("Interval#toString returns a simple range format", () => expect(interval.toString()).toBe("[1982-05-25T09:00:00.000Z – 1983-10-14T13:30:00.000Z)")); test("Interval#toString returns an unfriendly string for invalid intervals", () => expect(invalid.toString()).toBe("Invalid Interval")); //------ // .toLocaleString() //------ test("Interval#toLocaleString defaults to the DATE_SHORT format", () => expect(interval.toLocaleString()).toBe("5/25/1982 – 10/14/1983")); test("Interval#toLocaleString returns an unfriendly string for invalid intervals", () => expect(invalid.toLocaleString()).toBe("Invalid Interval")); test("Interval#toLocaleString lets the locale set the numbering system", () => { expect( Interval.after(interval.start.reconfigure({ locale: "ja-JP" }), { hour: 2 }).toLocaleString({ hour: "numeric", }) ).toBe("9時~11時"); }); test("Interval#toLocaleString accepts locale settings from the start DateTime", () => { expect( Interval.fromDateTimes( interval.start.reconfigure({ locale: "be" }), interval.end ).toLocaleString() ).toBe("25.5.1982 – 14.10.1983"); }); test("Interval#toLocaleString accepts numbering system settings from the start DateTime", () => { expect( Interval.fromDateTimes( interval.start.reconfigure({ numberingSystem: "beng" }), interval.end ).toLocaleString() ).toBe("৫/২৫/১৯৮২ – ১০/১৪/১৯৮৩"); }); test("Interval#toLocaleString accepts ouptput calendar settings from the start DateTime", () => { expect( Interval.fromDateTimes( interval.start.reconfigure({ outputCalendar: "islamic" }), interval.end ).toLocaleString() ).toBe("8/2/1402 – 1/8/1404 AH"); }); test("Interval#toLocaleString accepts options to the formatter", () => { expect(interval.toLocaleString({ weekday: "short" })).toBe("Tue – Fri"); }); test("Interval#toLocaleString can override the start DateTime's locale", () => { expect( Interval.fromDateTimes( interval.start.reconfigure({ locale: "be" }), interval.end ).toLocaleString({}, { locale: "fr" }) ).toBe("25/05/1982 – 14/10/1983"); }); test("Interval#toLocaleString can override the start DateTime's numbering system", () => { expect( Interval.fromDateTimes( interval.start.reconfigure({ numberingSystem: "beng" }), interval.end ).toLocaleString({ numberingSystem: "mong" }) ).toBe("᠕/᠒᠕/᠑᠙᠘᠒ – ᠑᠐/᠑᠔/᠑᠙᠘᠓"); }); test("Interval#toLocaleString can override the start DateTime's output calendar", () => { expect( Interval.fromDateTimes( interval.start.reconfigure({ outputCalendar: "islamic" }), interval.end ).toLocaleString({}, { outputCalendar: "coptic" }) ).toBe("9/17/1698 – 2/3/1700 ERA1"); }); test("Interval#toLocaleString shows things in the right IANA zone", () => { expect( Interval.fromDateTimes( interval.start.setZone("Australia/Melbourne"), interval.end ).toLocaleString(DateTime.DATETIME_SHORT) ).toBe("5/25/1982, 7:00 PM – 10/14/1983, 11:30 PM"); }); test("Interval#toLocaleString shows things in the right fixed-offset zone", () => { expect( Interval.fromDateTimes(interval.start.setZone("UTC-8"), interval.end).toLocaleString( DateTime.DATETIME_SHORT ) ).toBe("5/25/1982, 1:00 AM – 10/14/1983, 5:30 AM"); }); test("Interval#toLocaleString shows things in the right fixed-offset zone when showing the zone", () => { expect( Interval.fromDateTimes(interval.start.setZone("UTC-8"), interval.end).toLocaleString( DateTime.DATETIME_FULL ) ).toBe("May 25, 1982 at 1:00 AM GMT-8 – October 14, 1983 at 5:30 AM GMT-8"); }); test("Interval#toLocaleString shows things with UTC if fixed-offset with 0 offset is used", () => { expect( Interval.fromDateTimes(interval.start.setZone("UTC"), interval.end).toLocaleString( DateTime.DATETIME_FULL ) ).toBe("May 25, 1982 at 9:00 AM UTC – October 14, 1983 at 1:30 PM UTC"); }); test("Interval#toLocaleString does the best it can with unsupported fixed-offset zone when showing the zone", () => { expect( Interval.fromDateTimes(interval.start.setZone("UTC+4:30"), interval.end).toLocaleString( DateTime.DATETIME_FULL ) ).toBe("May 25, 1982 at 9:00 AM UTC – October 14, 1983 at 1:30 PM UTC"); }); test("Interval#toLocaleString uses locale-appropriate time formats", () => { expect( Interval.after(interval.start.reconfigure({ locale: "en-US" }), { hour: 2 }).toLocaleString( DateTime.TIME_SIMPLE ) ).toBe("9:00 – 11:00 AM"); expect( Interval.after(interval.start.reconfigure({ locale: "en-US" }), { hour: 2 }).toLocaleString( DateTime.TIME_24_SIMPLE ) ).toBe("09:00 – 11:00"); // France has 24-hour by default expect( Interval.after(interval.start.reconfigure({ locale: "fr" }), { hour: 2 }).toLocaleString( DateTime.TIME_SIMPLE ) ).toBe("09:00 – 11:00"); expect( Interval.after(interval.start.reconfigure({ locale: "fr" }), { hour: 2 }).toLocaleString( DateTime.TIME_24_SIMPLE ) ).toBe("09:00 – 11:00"); // Spain does't prefix with "0" and doesn't use spaces expect( Interval.after(interval.start.reconfigure({ locale: "es" }), { hour: 2 }).toLocaleString( DateTime.TIME_SIMPLE ) ).toBe("9:00–11:00"); expect( Interval.after(interval.start.reconfigure({ locale: "es" }), { hour: 2 }).toLocaleString( DateTime.TIME_24_SIMPLE ) ).toBe("9:00–11:00"); }); test("Interval#toLocaleString sets the separator between days for same-month dates", () => { expect(Interval.after(interval.start, { day: 2 }).toLocaleString(DateTime.DATE_MED)).toBe( "May 25 – 27, 1982" ); }); //------ // .toISO() //------ test("Interval#toISO returns a simple ISO format", () => expect(interval.toISO()).toBe("1982-05-25T09:00:00.000Z/1983-10-14T13:30:00.000Z")); test("Interval#toISO accepts ISO options", () => expect(interval.toISO({ suppressSeconds: true })).toBe("1982-05-25T09:00Z/1983-10-14T13:30Z")); test("Interval#toISO returns an unfriendly string for invalid intervals", () => expect(invalid.toISO()).toBe("Invalid Interval")); //------ // .toISODate() //------ test("Interval#toISODate returns a simple ISO date interval format", () => expect(interval.toISODate()).toBe("1982-05-25/1983-10-14")); test("Interval#toISODate returns an unfriendly string for invalid intervals", () => expect(invalid.toISODate()).toBe("Invalid Interval")); //------ // .toISOTime() //------ test("Interval#toISOTime returns a simple ISO time interval format", () => expect(interval.toISOTime()).toBe("09:00:00.000Z/13:30:00.000Z")); test("Interval#toISOTime returns an unfriendly string for invalid intervals", () => expect(invalid.toISOTime()).toBe("Invalid Interval")); test("Interval#toISOTime accepts ISO options", () => { expect(interval.toISOTime({ suppressSeconds: true })).toBe("09:00Z/13:30Z"); expect(interval.toISOTime({ suppressMilliseconds: true })).toBe("09:00:00Z/13:30:00Z"); }); //------ // .toFormat() //------ test("Interval#toFormat accepts date formats", () => { expect(interval.toFormat("EEE, LLL dd, yyyy")).toBe("Tue, May 25, 1982 – Fri, Oct 14, 1983"); expect(interval.toFormat("HH:mm")).toBe("09:00 – 13:30"); }); test("Interval#toFormat accepts date formats", () => { expect(interval.toFormat("EEE, LLL dd, yyyy", { separator: " until " })).toBe( "Tue, May 25, 1982 until Fri, Oct 14, 1983" ); }); test("Interval#toFormat returns an unfriendly string for invalid intervals", () => { expect(invalid.toFormat("EEE, LLL dd, yyyy")).toBe("Invalid Interval"); }); moment-luxon-93c85a3/test/interval/getters.test.js000066400000000000000000000012031477254173100223200ustar00rootroot00000000000000/* global test expect */ import { Interval } from "../../src/luxon"; const Helpers = require("../helpers"); const todayFrom = (h1, h2) => Interval.fromDateTimes(Helpers.atHour(h1), Helpers.atHour(h2)), invalid = Interval.invalid("because"); test("Interval.start gets the start", () => { expect(todayFrom(3, 5).start.hour).toBe(3); }); test("Interval.start returns null for invalid intervals", () => { expect(invalid.start).toBe(null); }); test("Interval.end gets the end", () => { expect(todayFrom(3, 5).end.hour).toBe(5); }); test("Interval.end returns null for invalid intervals", () => { expect(invalid.end).toBe(null); }); moment-luxon-93c85a3/test/interval/info.test.js000066400000000000000000000224571477254173100216140ustar00rootroot00000000000000/* global test expect */ import { DateTime, Interval } from "../../src/luxon"; const Helpers = require("../helpers"); const fromISOs = (s, e) => DateTime.fromISO(s).until(DateTime.fromISO(e)); //------ // #length() //------- test("Interval#length defaults to milliseconds", () => { const n = DateTime.now(), d = n.until(n.plus({ minutes: 1 })); expect(d.length()).toBe(60 * 1000); }); test("Interval#length('days') returns 1 for yesterday", () => { expect(Helpers.atHour(13).minus({ days: 1 }).until(Helpers.atHour(13)).length("days")).toBe(1); }); test("Interval#length('months') returns the right number of months", () => { expect(Math.floor(fromISOs("1996-02-17", "2012-08-14").length("months"))).toBe(197); }); test("Interval#length('years') returns the right number of years", () => { expect(Math.floor(fromISOs("1996-02-17", "2012-08-14").length("years"))).toBe(16); }); test("Interval#length() returns NaN for invalid intervals", () => { const i = Interval.invalid("because"); expect(i.length("years")).toBeFalsy(); }); //------ // #count() //------- test("Interval#count('days') returns 1 inside a day", () => { const i = DateTime.fromISO("2016-05-25T03:00").until(DateTime.fromISO("2016-05-25T14:00")); expect(i.count("days")).toBe(1); }); test("Interval#count('days') returns 2 if the interval crosses midnight", () => { const i = DateTime.fromISO("2016-05-25T03:00").until(DateTime.fromISO("2016-05-26T14:00")); expect(i.count("days")).toBe(2); }); test("Interval#count('years') returns 1 inside a year", () => { const i = DateTime.fromISO("2016-05-25").until(DateTime.fromISO("2016-05-26")); expect(i.count("years")).toBe(1); }); test("Interval#count('years') returns 2 if the interval crosses the new year", () => { const i = DateTime.fromISO("2016-05-25").until(DateTime.fromISO("2017-05-26")); expect(i.count("years")).toBe(2); }); test("Interval#count() does not count the endpoint of the interval", () => { const i = DateTime.fromISO("2022-10-01").until(DateTime.fromISO("2022-10-03")); expect(i.count("days")).toBe(2); }); test("Interval#count() uses milliseconds by default", () => { const i = DateTime.fromISO("2016-05-25T03:00").until(DateTime.fromISO("2016-05-25T14:00")); expect(i.count()).toBe(39600000); }); test("Interval#count() returns NaN for invalid intervals", () => { const i = Interval.invalid("because"); expect(i.count("years")).toBeFalsy(); }); //------ // #toDuration() //------- test("Interval#toDuration creates a duration in those units", () => { const int = Interval.fromDateTimes(Helpers.atHour(9), Helpers.atHour(13)); expect(int.toDuration().toObject()).toEqual({ milliseconds: 4 * 3600 * 1000 }); expect(int.toDuration("milliseconds").toObject()).toEqual({ milliseconds: 4 * 3600 * 1000 }); expect(int.toDuration("seconds").toObject()).toEqual({ seconds: 4 * 3600 }); expect(int.toDuration("minutes").toObject()).toEqual({ minutes: 4 * 60 }); expect(int.toDuration("hours").toObject()).toEqual({ hours: 4 }); expect(int.toDuration("days").toObject()).toEqual({ days: 1 / 6 }); expect(int.toDuration("weeks").toObject()).toEqual({ weeks: 1 / (6 * 7) }); }); test("Interval#toDuration accepts multiple units", () => { const int = Interval.fromDateTimes( Helpers.atHour(9).plus({ minutes: 3 }), Helpers.atHour(13).plus({ minutes: 47 }) ); expect(int.toDuration(["hours", "minutes"]).toObject()).toEqual({ hours: 4, minutes: 44 }); }); test("Interval#toDuration accepts duration options", () => { const int = Interval.fromDateTimes(Helpers.atHour(9), Helpers.atHour(13)), dur = int.toDuration(["hours"], { conversionAccuracy: "longterm" }); expect(dur.conversionAccuracy).toBe("longterm"); }); test("Interval#toDuration returns an invalid duration for invalid intervals", () => { const int = Interval.invalid("because"), dur = int.toDuration(["hours"]); expect(dur.isValid).toBeFalsy(); }); //------ // #contains() //------- test("Interval#contains returns true for DateTimes in the interval", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T07:00"); expect(i.contains(DateTime.fromISO("1982-05-25T06:30"))).toBe(true); }); test("Interval#contains returns false for DateTimes after the interval", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T07:00"); expect(i.contains(DateTime.fromISO("1982-05-25T08:30"))).toBe(false); }); test("Interval#contains returns false for DateTimes before the interval", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T07:00"); expect(i.contains(DateTime.fromISO("1982-05-25T05:30"))).toBe(false); }); test("Interval#contains returns true for the start endpoint", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T07:00"); expect(i.contains(DateTime.fromISO("1982-05-25T06:00"))).toBe(true); }); test("Interval#contains returns false for the end endpoint", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T07:00"); expect(i.contains(DateTime.fromISO("1982-05-25T07:00"))).toBe(false); }); test("Interval#contains returns false for invalid intervals", () => { const i = Interval.invalid("because"); expect(i.contains(DateTime.fromISO("1982-05-25T07:00"))).toBe(false); }); //------ // #isEmpty() //------- test("Interval#isEmpty returns true for empty intervals", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T06:00"); expect(i.isEmpty()).toBe(true); }); test("Interval#isEmpty returns false for non-empty intervals", () => { const i = fromISOs("1982-05-25T06:00", "1982-05-25T08:00"); expect(i.isEmpty()).toBe(false); }); //------ // #isBefore() //------ test("Interval#isBefore returns true for intervals fully before the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.minus({ days: 2 }), n.minus({ days: 1 })); expect(i.isBefore(n)).toBe(true); }); test("Interval#isBefore returns false for intervals containing the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.minus({ days: 2 }), n.plus({ days: 2 })); expect(i.isBefore(n)).toBe(false); }); test("Interval#isBefore returns false for intervals fully after the input ", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.plus({ days: 2 }), n.plus({ days: 3 })); expect(i.isBefore(n)).toBe(false); }); test("Interval#isBefore returns true for intervals ending at the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.minus({ days: 1 }), n); expect(i.isBefore(n)).toBe(true); }); test("Interval#isBefore returns false for intervals just inside the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.minus({ days: 1 }), n); expect(i.isBefore(n.minus(1))).toBe(false); }); test("Interval#isBefore returns false for invalid intervals", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.invalid("because"); expect(i.isBefore(n)).toBe(false); }); //------ // #isAfter() //------- test("Interval#isAfter returns true for intervals fully after the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.plus({ days: 1 }), n.plus({ days: 2 })); expect(i.isAfter(n)).toBe(true); }); test("Interval#isAfter returns false for intervals containing the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.minus({ day: 2 }), n.plus({ days: 2 })); expect(i.isAfter(n)).toBe(false); }); test("Interval#isAfter returns false for fully before the input ", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n.minus({ day: 2 }), n.minus(1, "day")); expect(i.isAfter(n)).toBe(false); }); test("Interval#isAfter returns false for intervals beginning at the input", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n, n.plus({ days: 1 })); expect(i.isAfter(n)).toBe(false); }); test("Interval#isAfter returns false for invalid intervals", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.invalid("because"); expect(i.isAfter(n)).toBe(false); }); //------ // #hasSame() //------- test("Interval#hasSame('day') returns true for durations on the same day", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n, n.plus({ hours: 5 })); expect(i.hasSame("day")).toBe(true); }); test("Interval#hasSame('day') returns true for durations that last until the next day", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n, n.plus({ hours: 20 })); expect(i.hasSame("day")).toBe(false); }); test("Interval#hasSame('day') returns true for durations durations ending at midnight", () => { const n = DateTime.fromISO("1982-05-25T06:00"), i = Interval.fromDateTimes(n, n.plus({ days: 1 }).startOf("day")); expect(i.hasSame("day")).toBe(true); }); test("Interval#hasSame returns false for invalid intervals", () => { const i = Interval.invalid("because"); expect(i.hasSame("day")).toBe(false); }); test.each([ ["1982-05-25T00:00:00"], ["1982-05-25T00:00:02"], ["1982-05-25T12:00:00"], ["1982-05-25T23:59:58"], ["1982-05-25T23:59:59"], ])("Interval#hasSame returns true for empty intervals", (dt) => { const n = DateTime.fromISO(dt), i = Interval.fromDateTimes(n, n); expect(i.hasSame("day")).toBe(true); }); moment-luxon-93c85a3/test/interval/localeWeek.test.js000066400000000000000000000016101477254173100227200ustar00rootroot00000000000000/* global test expect */ import { DateTime, Interval } from "../../src/luxon"; //------ // .count() with useLocaleWeeks //------ test("count(weeks) with useLocaleWeeks adheres to the locale", () => { const start = DateTime.fromISO("2023-06-04T13:00:00Z", { setZone: true, locale: "en-US" }); const end = DateTime.fromISO("2023-06-23T13:00:00Z", { setZone: true, locale: "en-US" }); const interval = Interval.fromDateTimes(start, end); expect(interval.count("weeks", { useLocaleWeeks: true })).toBe(3); }); test("count(weeks) with useLocaleWeeks uses the start locale", () => { const start = DateTime.fromISO("2023-06-04T13:00:00Z", { setZone: true, locale: "de-DE" }); const end = DateTime.fromISO("2023-06-23T13:00:00Z", { setZone: true, locale: "en-US" }); const interval = Interval.fromDateTimes(start, end); expect(interval.count("weeks", { useLocaleWeeks: true })).toBe(4); }); moment-luxon-93c85a3/test/interval/many.test.js000066400000000000000000000352461477254173100216250ustar00rootroot00000000000000/* global test expect */ import { DateTime, Interval, Duration } from "../../src/luxon"; const Helpers = require("../helpers"); const fromISOs = (s, e) => DateTime.fromISO(s).until(DateTime.fromISO(e)), todayFrom = (h1, h2) => Interval.fromDateTimes(Helpers.atHour(h1), Helpers.atHour(h2)); //------- // #equals() //------- test("Interval#equals returns true iff the times are the same", () => { const s = "2016-10-14", e = "2016-10-15", s2 = "2016-10-13", e2 = "2016-10-16", first = fromISOs(s, e); expect(first.equals(fromISOs(s, e))).toBeTruthy(); expect(first.equals(fromISOs(s2, e))).toBeFalsy(); expect(first.equals(fromISOs(s, e2))).toBeFalsy(); expect(first.equals(fromISOs(s2, e2))).toBeFalsy(); }); test("Interval#equals returns false for invalid intervals", () => { const invalid = Interval.invalid("blarg"), normal = fromISOs("2017-01-01", "2017-01-02"); expect(invalid.equals(invalid)).toBeFalsy(); expect(normal.equals(invalid)).toBeFalsy(); expect(invalid.equals(normal)).toBeFalsy(); expect(normal.equals(normal)).toBeTruthy(); }); //------- // #union() //------- test("Interval#union returns an interval spanning a later interval", () => { expect(todayFrom(5, 8).union(todayFrom(9, 11)).equals(todayFrom(5, 11))).toBeTruthy(); }); test("Interval#union returns an interval spanning a earlier interval", () => { expect(todayFrom(5, 8).union(todayFrom(3, 4)).equals(todayFrom(3, 8))).toBeTruthy(); }); test("Interval#union returns an interval spanning a partially later interval", () => { expect(todayFrom(5, 8).union(todayFrom(7, 10)).equals(todayFrom(5, 10))).toBeTruthy(); }); test("Interval#union returns an interval spanning a partially earlier interval", () => { expect(todayFrom(5, 8).union(todayFrom(4, 6)).equals(todayFrom(4, 8))).toBeTruthy(); }); test("Interval#union returns an interval no-ops when applied to an engulfed interval", () => { expect(todayFrom(5, 8).union(todayFrom(6, 7)).equals(todayFrom(5, 8))).toBeTruthy(); }); test("Interval#union expands to an engulfing interval", () => { expect(todayFrom(5, 8).union(todayFrom(4, 10)).equals(todayFrom(4, 10))).toBeTruthy(); }); test("Interval#union spans adjacent intervals", () => { expect(todayFrom(5, 8).union(todayFrom(8, 10)).equals(todayFrom(5, 10))).toBeTruthy(); }); test("Interval#union returns invalid for invalid intervals", () => { expect(Interval.invalid("any reason").union(todayFrom(8, 10)).isValid).toBeFalsy(); }); //------- // #intersection() //------- // todo - is this what should happen here? Seems annoying. test("Interval#intersection returns null if there's no intersection", () => { expect(todayFrom(5, 8).intersection(todayFrom(3, 4))).toBe(null); }); test("Interval#intersection returns the intersection for overlapping intervals", () => { expect(todayFrom(5, 8).intersection(todayFrom(3, 7)).equals(todayFrom(5, 7))).toBeTruthy(); }); test("Interval#intersection returns null for adjacent intervals", () => { expect(todayFrom(5, 8).intersection(todayFrom(8, 10))).toBeNull(); }); test("Interval#intersection returns invalid for invalid intervals", () => { expect(Interval.invalid("any reason").intersection(todayFrom(8, 10)).isValid).toBeFalsy(); }); //------- // .merge() //------- test("Interval.merge returns the minimal set of intervals", () => { const list = [ todayFrom(5, 8), todayFrom(4, 7), todayFrom(10, 11), todayFrom(11, 12), todayFrom(13, 15), ], results = Interval.merge(list); expect(results.length).toBe(3); expect(results[0] && results[0].equals(todayFrom(4, 8))).toBeTruthy(); expect(results[1] && results[1].equals(todayFrom(10, 12))).toBeTruthy(); expect(results[2] && results[2].equals(todayFrom(13, 15))).toBeTruthy(); }); test("Interval.merge returns empty for an empty input", () => { expect(Interval.merge([])).toEqual([]); }); //------- // .xor() //------- function xor(items, expected) { const r = Interval.xor(items); expect(r.length).toBe(expected.length); for (const i in expected) { if (Object.prototype.hasOwnProperty.call(expected, i)) { expect(r[i] && r[i].equals(expected[i])).toBeTruthy(); } } return r; } test("Interval.xor returns non-overlapping intervals as-is", () => { const ix = [todayFrom(6, 7), todayFrom(8, 9)]; xor(ix, ix); }); test("Interval.xor returns empty for an empty input", () => { xor([], []); }); test("Interval.xor returns empty for a fully overlapping set of intervals", () => { xor([todayFrom(5, 8), todayFrom(5, 8)], []); xor([todayFrom(5, 8), todayFrom(5, 6), todayFrom(6, 8)], []); }); test("Interval.xor returns the non-overlapping parts of intervals", () => { // overlapping xor([todayFrom(5, 8), todayFrom(7, 11)], [todayFrom(5, 7), todayFrom(8, 11)]); // engulfing xor([todayFrom(5, 12), todayFrom(9, 10)], [todayFrom(5, 9), todayFrom(10, 12)]); // adjacent xor([todayFrom(5, 6), todayFrom(6, 8)], [todayFrom(5, 8)]); // three intervals xor( [todayFrom(10, 13), todayFrom(8, 11), todayFrom(12, 14)], [todayFrom(8, 10), todayFrom(11, 12), todayFrom(13, 14)] ); }); test("Interval.xor handles funny adjacency cases", () => { xor( [todayFrom(5, 14), todayFrom(7, 11), todayFrom(11, 12)], [todayFrom(5, 7), todayFrom(12, 14)] ); xor([todayFrom(5, 10), todayFrom(9, 11), todayFrom(9, 12)], [todayFrom(5, 9), todayFrom(11, 12)]); xor([todayFrom(5, 9), todayFrom(9, 11), todayFrom(9, 12), todayFrom(5, 9)], [todayFrom(11, 12)]); }); //------- // #difference() //------- function diff(interval, items, expected) { const r = interval.difference(...items); expect(r.length).toBe(expected.length); for (const i in expected) { if (Object.prototype.hasOwnProperty.call(expected, i)) { expect(r[i] && r[i].equals(expected[i])).toBeTruthy(); } } return r; } test("Interval#difference returns self for non-overlapping intervals", () => { diff(todayFrom(8, 9), [todayFrom, (10, 11)], [todayFrom(8, 9)]); diff(todayFrom(8, 9), [todayFrom, (6, 7)], [todayFrom(8, 9)]); }); test("Interval#difference returns the non-overlapping parts of intervals", () => { diff(todayFrom(8, 10), [todayFrom(9, 11)], [todayFrom(8, 9)]); diff(todayFrom(9, 11), [todayFrom(8, 10)], [todayFrom(10, 11)]); diff(todayFrom(9, 11), [todayFrom(8, 9), todayFrom(9, 10)], [todayFrom(10, 11)]); }); test("Interval#difference returns the empty for fully subtracted intervals", () => { diff(todayFrom(8, 10), [todayFrom(7, 11)], []); diff(todayFrom(8, 10), [todayFrom(8, 9), todayFrom(9, 10)], []); diff(todayFrom(8, 12), [todayFrom(8, 10), todayFrom(9, 11), todayFrom(10, 13)], []); }); test("Interval#difference returns the outside parts when engulfing another interval", () => { diff(todayFrom(8, 12), [todayFrom(9, 11)], [todayFrom(8, 9), todayFrom(11, 12)]); diff( todayFrom(8, 12), [todayFrom(9, 10), todayFrom(10, 11)], [todayFrom(8, 9), todayFrom(11, 12)] ); }); test("Interval#difference allows holes", () => { diff( todayFrom(8, 13), [todayFrom(9, 10), todayFrom(11, 12)], [todayFrom(8, 9), todayFrom(10, 11), todayFrom(12, 13)] ); }); //------- // #engulfs() //------- test("Interval#engulfs", () => { const i = todayFrom(9, 12); expect(i.engulfs(todayFrom(13, 15), "wholly later")).toBeFalsy(); expect(i.engulfs(todayFrom(11, 15), "partially later")).toBeFalsy(); expect(i.engulfs(todayFrom(6, 8), "wholly earlier")).toBeFalsy(); expect(i.engulfs(todayFrom(6, 10), "partially earlier")).toBeFalsy(); expect(i.engulfs(todayFrom(8, 13), "engulfed")).toBeFalsy(); expect(i.engulfs(todayFrom(10, 11), "engulfing")).toBeTruthy(); expect(i.engulfs(todayFrom(9, 12), "equal")).toBeTruthy(); }); test("Interval#engulfs returns false for invalid intervals", () => { expect(Interval.invalid("because").engulfs(todayFrom(9, 12))).toBe(false); expect(todayFrom(9, 12).engulfs(Interval.invalid("because"))).toBe(false); }); //------- // #abutsStart() //------- test("Interval#abutsStart", () => { expect(todayFrom(9, 10).abutsStart(todayFrom(10, 11))).toBeTruthy(); expect(todayFrom(9, 10).abutsStart(todayFrom(11, 12))).toBeFalsy(); expect(todayFrom(9, 10).abutsStart(todayFrom(8, 11))).toBeFalsy(); expect(todayFrom(9, 10).abutsStart(todayFrom(9, 10))).toBeFalsy(); }); test("Interval#abutsStart returns false for invalid intervals", () => { expect(Interval.invalid("because").abutsStart(todayFrom(9, 12))).toBe(false); expect(todayFrom(9, 12).abutsStart(Interval.invalid("because"))).toBe(false); }); //------- // #abutsEnd() //------- test("Interval#abutsEnd", () => { expect(todayFrom(9, 11).abutsEnd(todayFrom(8, 9))).toBeTruthy(); expect(todayFrom(9, 11).abutsEnd(todayFrom(8, 10))).toBeFalsy(); expect(todayFrom(9, 11).abutsEnd(todayFrom(7, 8))).toBeFalsy(); expect(todayFrom(9, 11).abutsEnd(todayFrom(9, 11))).toBeFalsy(); }); test("Interval#abutsEnd returns false for invalid intervals", () => { expect(Interval.invalid("because").abutsEnd(todayFrom(9, 12))).toBe(false); expect(todayFrom(9, 12).abutsEnd(Interval.invalid("because"))).toBe(false); }); //------- // #splitAt() //------- test("Interval#splitAt breaks up the interval", () => { const split = todayFrom(8, 13).splitAt(Helpers.atHour(9), Helpers.atHour(11)); expect(split.length).toBe(3); expect(split[0].equals(todayFrom(8, 9))).toBeTruthy(); expect(split[1].equals(todayFrom(9, 11))).toBeTruthy(); expect(split[2].equals(todayFrom(11, 13))).toBeTruthy(); }); test("Interval#splitAt returns [] for invalid intervals", () => { const split = Interval.invalid("because").splitAt(Helpers.atHour(9), Helpers.atHour(11)); expect(split).toEqual([]); }); test("Interval#splitAt ignores times outside the interval", () => { const allBefore = todayFrom(8, 13).splitAt(Helpers.atHour(7)); expect(allBefore.length).toBe(1); expect(allBefore[0]).toEqual(todayFrom(8, 13)); const allAfter = todayFrom(8, 13).splitAt(Helpers.atHour(14)); expect(allAfter.length).toBe(1); expect(allAfter[0]).toEqual(todayFrom(8, 13)); const oneBeforeOneDuring = todayFrom(8, 13).splitAt(Helpers.atHour(7), Helpers.atHour(11)); expect(oneBeforeOneDuring.length).toBe(2); expect(oneBeforeOneDuring[0]).toEqual(todayFrom(8, 11)); expect(oneBeforeOneDuring[1]).toEqual(todayFrom(11, 13)); const oneAfterOneDuring = todayFrom(8, 13).splitAt(Helpers.atHour(11), Helpers.atHour(15)); expect(oneAfterOneDuring.length).toBe(2); expect(oneAfterOneDuring[0]).toEqual(todayFrom(8, 11)); expect(oneAfterOneDuring[1]).toEqual(todayFrom(11, 13)); }); test("Interval#splitAt handles DST shifts", () => { const zone = "Europe/Berlin"; const dayStart = DateTime.fromISO("2023-10-29T00:00:00+02:00", { zone }); const dayEnd = DateTime.fromISO("2023-10-30T00:00:00+01:00", { zone }); const dstShiftStart = DateTime.fromISO("2023-10-29T02:00:00+02:00", { zone }); const dstShiftEnd = DateTime.fromISO("2023-10-29T02:00:00+01:00", { zone }); const splitByDSTStartAndEnd = Interval.fromDateTimes(dayStart, dayEnd) .splitAt(dstShiftStart, dstShiftEnd) .map((i) => i.toISO()); expect(splitByDSTStartAndEnd).toEqual([ "2023-10-29T00:00:00.000+02:00/2023-10-29T02:00:00.000+02:00", "2023-10-29T02:00:00.000+02:00/2023-10-29T02:00:00.000+01:00", "2023-10-29T02:00:00.000+01:00/2023-10-30T00:00:00.000+01:00", ]); }); //------- // #splitBy() //------- test("Interval#splitBy accepts an object", () => { const split = todayFrom(8, 13).splitBy({ hours: 2 }); expect(split.length).toBe(3); expect(split[0].equals(todayFrom(8, 10))).toBeTruthy(); expect(split[1].equals(todayFrom(10, 12))).toBeTruthy(); expect(split[2].equals(todayFrom(12, 13))).toBeTruthy(); }); test("Interval#splitBy accepts a duration", () => { const split = todayFrom(8, 13).splitBy(Duration.fromObject({ hours: 2 })); expect(split.length).toBe(3); expect(split[0].equals(todayFrom(8, 10))).toBeTruthy(); expect(split[1].equals(todayFrom(10, 12))).toBeTruthy(); expect(split[2].equals(todayFrom(12, 13))).toBeTruthy(); }); test("Interval#splitBy returns [] for invalid intervals", () => { const split = Interval.invalid("because").splitBy({ hours: 2 }); expect(split).toEqual([]); }); test("Interval#split by returns [] for invalid durations", () => { const split = todayFrom(8, 3).splitBy(Duration.invalid("because")); expect(split).toEqual([]); }); test("Interval#split by returns [] for durations of length 0", () => { const split = todayFrom(8, 3).splitBy(Duration.fromObject({})); expect(split).toEqual([]); }); test("Interval#split by works across varying length months", () => { Helpers.withDefaultZone("Europe/London", () => { const start = DateTime.fromISO("2019-12-30T00:00:00.000+00:00"); const end = DateTime.fromISO("2020-05-02T23:30:00.000+00:00"); const interval = Interval.fromDateTimes(start, end); const months = interval.splitBy(Duration.fromISO("P1M")); expect(months.length).toEqual(5); for (let i = 0; i < months.length; i++) { const month = months[i]; const expectedStart = start.plus({ month: i }); const expectedEnd = start.plus({ month: i + 1 }); expect(month.start).toEqual(expectedStart); if (expectedEnd > end) { expect(month.end).toEqual(end); } else { expect(month.end).toEqual(expectedEnd); } } }); }); //------- // #divideEqually() //------- test("Interval#divideEqually should split a 4 hour period into 4 contiguous 1-hour parts", () => { const split = todayFrom(5, 9).divideEqually(4); expect(split.length).toBe(4); expect(split[0].equals(todayFrom(5, 6))).toBeTruthy(); expect(split[3].equals(todayFrom(8, 9))).toBeTruthy(); }); test("Interval#divideEqually should split a 1m30s into 3 30-second parts", () => { const after = (i, m, s) => Interval.after(i, Duration.fromObject({ minutes: m, seconds: s })), split = after(Helpers.atHour(9), 1, 30).divideEqually(3); expect(split.length).toBe(3); expect(split[0].equals(after(Helpers.atHour(9), 0, 30))).toBeTruthy(); expect(split[2].equals(after(Helpers.atHour(9).plus({ minutes: 1 }), 0, 30))).toBeTruthy(); }); test("Interval#divideEqually always gives you the right number of parts", () => { const int = Interval.after(Helpers.atHour(9), { minutes: 7 }), split = int.divideEqually(17); expect(split.length).toBe(17); }); test("Interval#divideEqually returns [] for invalid intervals", () => { const split = Interval.invalid("because").divideEqually(3); expect(split).toEqual([]); }); test("Interval#mapEndpoints returns a new Interval with the mapped endpoints", () => { const zone = "America/Los_Angeles"; const original = Interval.fromDateTimes( DateTime.fromObject({}, { zone }), DateTime.fromObject({}, { zone }).plus({ hours: 1 }) ); const mapped = original.mapEndpoints((d) => d.toUTC()); expect(mapped.s.zoneName).toEqual("UTC"); expect(mapped.e.zoneName).toEqual("UTC"); }); moment-luxon-93c85a3/test/interval/parse.test.js000066400000000000000000000060771477254173100217730ustar00rootroot00000000000000/* global test expect */ import { Interval } from "../../src/luxon"; import Helpers from "../helpers"; const withThrowOnInvalid = Helpers.setUnset("throwOnInvalid"); //------ // .fromISO() //------ test("Interval.fromISO can parse a variety of ISO formats", () => { const check = (s, ob1, ob2) => { const i = Interval.fromISO(s); expect(i.start.toObject()).toEqual(ob1); expect(i.end.toObject()).toEqual(ob2); }; // keeping these brief because I don't want to rehash the existing DT ISO tests check( "2007-03-01T13:00:00/2008-05-11T15:30:00", { year: 2007, month: 3, day: 1, hour: 13, minute: 0, second: 0, millisecond: 0, }, { year: 2008, month: 5, day: 11, hour: 15, minute: 30, second: 0, millisecond: 0, } ); check( "2007-03-01T13:00:00/2016-W21-3", { year: 2007, month: 3, day: 1, hour: 13, minute: 0, second: 0, millisecond: 0, }, { year: 2016, month: 5, day: 25, hour: 0, minute: 0, second: 0, millisecond: 0, } ); check( "2007-03-01T13:00:00/P1Y2M10DT2H30M", { year: 2007, month: 3, day: 1, hour: 13, minute: 0, second: 0, millisecond: 0, }, { year: 2008, month: 5, day: 11, hour: 15, minute: 30, second: 0, millisecond: 0, } ); check( "P1Y2M10DT2H30M/2008-05-11T15:30:00", { year: 2007, month: 3, day: 1, hour: 13, minute: 0, second: 0, millisecond: 0, }, { year: 2008, month: 5, day: 11, hour: 15, minute: 30, second: 0, millisecond: 0, } ); }); test("Interval.fromISO accepts a zone argument", () => { const dateDate = Interval.fromISO("2016-01-01/2016-12-31", { zone: "Europe/Paris" }); expect(dateDate.isValid).toBe(true); expect(dateDate.start.zoneName).toBe("Europe/Paris"); const dateDur = Interval.fromISO("2016-01-01/P1Y", { zone: "Europe/Paris" }); expect(dateDur.isValid).toBe(true); expect(dateDur.start.zoneName).toBe("Europe/Paris"); const durDate = Interval.fromISO("P1Y/2016-01-01", { zone: "Europe/Paris" }); expect(durDate.isValid).toBe(true); expect(durDate.start.zoneName).toBe("Europe/Paris"); }); // #728 test("Interval.fromISO works with Settings.throwOnInvalid", () => { withThrowOnInvalid(true, () => { const dateDur = Interval.fromISO("2020-06-22T17:30:00.000+02:00/PT5H30M"); expect(dateDur.isValid).toBe(true); const durDate = Interval.fromISO("PT5H30M/2020-06-22T17:30:00.000+02:00"); expect(durDate.isValid).toBe(true); }); }); const badInputs = [ null, "", "hello", "foo/bar", "R5/2008-03-01T13:00:00Z/P1Y2M10DT2H30M", // valid ISO 8601 interval with a repeat, but not supported here ]; test.each(badInputs)("Interval.fromISO will return invalid for [%s]", (s) => { const i = Interval.fromISO(s); expect(i.isValid).toBe(false); expect(i.invalidReason).toBe("unparsable"); }); moment-luxon-93c85a3/test/interval/proto.test.js000066400000000000000000000006031477254173100220110ustar00rootroot00000000000000/* global test expect */ import { DateTime } from "../../src/luxon"; test("Interval prototype properties should not throw when addressed", () => { const i = DateTime.fromISO("2018-01-01").until(DateTime.fromISO("2018-01-02")); expect(() => Object.getOwnPropertyNames(Object.getPrototypeOf(i)).forEach( (name) => Object.getPrototypeOf(i)[name] ) ).not.toThrow(); }); moment-luxon-93c85a3/test/interval/setter.test.js000066400000000000000000000011751477254173100221610ustar00rootroot00000000000000/* global test expect */ import { Interval } from "../../src/luxon"; const Helpers = require("../helpers"); const todayFrom = (h1, h2) => Interval.fromDateTimes(Helpers.atHour(h1), Helpers.atHour(h2)); test("Interval.set can set the start", () => { expect(todayFrom(3, 5).set({ start: Helpers.atHour(4) }).start.hour).toBe(4); }); test("Interval.set can set the end", () => { expect(todayFrom(3, 5).set({ end: Helpers.atHour(6) }).end.hour).toBe(6); }); test("Interval.set preserves invalidity", () => { const invalid = Interval.invalid("because"); expect(invalid.set({ start: Helpers.atHour(4) }).isValid).toBe(false); }); moment-luxon-93c85a3/test/interval/typecheck.test.js000066400000000000000000000014021477254173100226230ustar00rootroot00000000000000/* global test expect */ import { Interval, DateTime } from "../../src/luxon"; //------ // #isInterval //------- test("Interval.isInterval return true for valid duration", () => { const int = Interval.fromDateTimes(DateTime.now(), DateTime.now()); expect(Interval.isInterval(int)).toBe(true); }); test("Interval.isInterval return true for invalid duration", () => { const int = Interval.invalid("because"); expect(Interval.isInterval(int)).toBe(true); }); test("Interval.isInterval return false for primitives", () => { expect(Interval.isInterval({})).toBe(false); expect(Interval.isInterval(1)).toBe(false); expect(Interval.isInterval("")).toBe(false); expect(Interval.isInterval(null)).toBe(false); expect(Interval.isInterval()).toBe(false); }); moment-luxon-93c85a3/test/zones/000077500000000000000000000000001477254173100166455ustar00rootroot00000000000000moment-luxon-93c85a3/test/zones/IANA.test.js000066400000000000000000000110021477254173100206630ustar00rootroot00000000000000/* global test expect */ import { FixedOffsetZone, IANAZone } from "../../src/luxon"; test("IANAZone.create returns a singleton per zone name", () => { expect(IANAZone.create("UTC")).toBe(IANAZone.create("UTC")); expect(IANAZone.create("America/New_York")).toBe(IANAZone.create("America/New_York")); expect(IANAZone.create("UTC")).not.toBe(IANAZone.create("America/New_York")); // hold true even for invalid zone names expect(IANAZone.create("blorp")).toBe(IANAZone.create("blorp")); }); test("IANAZone.create should return IANAZone instance", () => { const result = IANAZone.create("America/Cancun"); expect(result).toBeInstanceOf(IANAZone); }); test("IANAZone.isValidSpecifier", () => { expect(IANAZone.isValidSpecifier("America/New_York")).toBe(true); // this used to return true but now returns false, because we just defer to isValidZone expect(IANAZone.isValidSpecifier("Fantasia/Castle")).toBe(false); expect(IANAZone.isValidSpecifier("Sport~~blorp")).toBe(false); expect(IANAZone.isValidSpecifier("Etc/GMT+8")).toBe(true); expect(IANAZone.isValidSpecifier("Etc/GMT-8")).toBe(true); expect(IANAZone.isValidSpecifier("Etc/GMT-0")).toBe(true); expect(IANAZone.isValidSpecifier("Etc/GMT-1")).toBe(true); expect(IANAZone.isValidSpecifier(null)).toBe(false); }); test("IANAZone.isValidZone", () => { expect(IANAZone.isValidZone("America/New_York")).toBe(true); expect(IANAZone.isValidZone("Fantasia/Castle")).toBe(false); expect(IANAZone.isValidZone("Sport~~blorp")).toBe(false); expect(IANAZone.isValidZone("")).toBe(false); expect(IANAZone.isValidZone(undefined)).toBe(false); expect(IANAZone.isValidZone(null)).toBe(false); expect(IANAZone.isValidZone(4)).toBe(false); }); test("IANAZone.type returns a static string", () => { expect(new IANAZone("America/Santiago").type).toBe("iana"); expect(new IANAZone("America/Blorp").type).toBe("iana"); }); test("IANAZone.name returns the zone name passed to the constructor", () => { expect(new IANAZone("America/Santiago").name).toBe("America/Santiago"); expect(new IANAZone("America/Blorp").name).toBe("America/Blorp"); expect(new IANAZone("foo").name).toBe("foo"); }); test("IANAZone is not universal", () => { expect(new IANAZone("America/Santiago").isUniversal).toBe(false); }); test("IANAZone.offsetName with a long format", () => { const zone = new IANAZone("America/Santiago"); const offsetName = zone.offsetName(1552089600, { format: "long", locale: "en-US" }); expect(offsetName).toBe("Chile Summer Time"); }); test("IANAZone.offsetName with a short format", () => { const zone = new IANAZone("America/Santiago"); const offsetName = zone.offsetName(1552089600, { format: "short", locale: "en-US" }); expect(offsetName).toBe("GMT-3"); }); test("IANAZone.formatOffset with a short format", () => { const zone = new IANAZone("America/Santiago"); const offsetName = zone.formatOffset(1552089600, "short"); expect(offsetName).toBe("-03:00"); }); test("IANAZone.formatOffset with a narrow format", () => { const zone = new IANAZone("America/Santiago"); const offsetName = zone.formatOffset(1552089600, "narrow"); expect(offsetName).toBe("-3"); }); test("IANAZone.formatOffset with a techie format", () => { const zone = new IANAZone("America/Santiago"); const offsetName = zone.formatOffset(1552089600, "techie"); expect(offsetName).toBe("-0300"); }); test("IANAZone.formatOffset throws for an invalid format", () => { const zone = new IANAZone("America/Santiago"); expect(() => zone.formatOffset(1552089600, "blorp")).toThrow(); }); test("IANAZone.equals requires both zones to be iana", () => { expect(IANAZone.create("UTC").equals(FixedOffsetZone.utcInstance)).toBe(false); }); test("IANAZone.equals returns false even if the two share offsets", () => { const luxembourg = IANAZone.create("Europe/Luxembourg"); const rome = IANAZone.create("Europe/Rome"); expect(luxembourg.equals(rome)).toBe(false); }); test("IANAZone.isValid returns true for valid zone names", () => { expect(new IANAZone("UTC").isValid).toBe(true); expect(new IANAZone("America/Santiago").isValid).toBe(true); expect(new IANAZone("Europe/Paris").isValid).toBe(true); }); test("IANAZone.isValid returns false for invalid zone names", () => { expect(new IANAZone("").isValid).toBe(false); expect(new IANAZone("foo").isValid).toBe(false); expect(new IANAZone("CEDT").isValid).toBe(false); expect(new IANAZone("GMT+2").isValid).toBe(false); expect(new IANAZone("America/Blorp").isValid).toBe(false); expect(new IANAZone(null).isValid).toBe(false); }); moment-luxon-93c85a3/test/zones/fixedOffset.test.js000066400000000000000000000063731477254173100224400ustar00rootroot00000000000000/* global test expect */ import { FixedOffsetZone, IANAZone } from "../../src/luxon"; test("FixedOffsetZone.utcInstance returns a singleton", () => { expect(FixedOffsetZone.utcInstance).toBe(FixedOffsetZone.utcInstance); }); test("FixedOffsetZone.utcInstance provides valid UTC data", () => { expect(FixedOffsetZone.utcInstance.type).toBe("fixed"); expect(FixedOffsetZone.utcInstance.name).toBe("UTC"); expect(FixedOffsetZone.utcInstance.offsetName()).toBe("UTC"); expect(FixedOffsetZone.utcInstance.formatOffset(0, "short")).toBe("+00:00"); expect(FixedOffsetZone.utcInstance.isUniversal).toBe(true); expect(FixedOffsetZone.utcInstance.offset()).toBe(0); expect(FixedOffsetZone.utcInstance.isValid).toBe(true); }); test("FixedOffsetZone.parseSpecifier returns a valid instance from a UTC offset string", () => { let zone = FixedOffsetZone.parseSpecifier("UTC+6"); expect(zone.isValid).toBe(true); expect(zone.offset()).toBe(360); expect(zone.name).toBe("UTC+6"); zone = FixedOffsetZone.parseSpecifier("UTC+06"); expect(zone.isValid).toBe(true); expect(zone.offset()).toBe(360); expect(zone.name).toBe("UTC+6"); zone = FixedOffsetZone.parseSpecifier("UTC-6:00"); expect(zone.isValid).toBe(true); expect(zone.offset()).toBe(-360); expect(zone.name).toBe("UTC-6"); }); test("FixedOffsetZone.parseSpecifier returns null for invalid data", () => { expect(FixedOffsetZone.parseSpecifier()).toBe(null); expect(FixedOffsetZone.parseSpecifier(null)).toBe(null); expect(FixedOffsetZone.parseSpecifier("")).toBe(null); expect(FixedOffsetZone.parseSpecifier("foo")).toBe(null); expect(FixedOffsetZone.parseSpecifier("UTC+blorp")).toBe(null); }); test("FixedOffsetZone.formatOffset is consistent despite the provided timestamp", () => { // formatOffset accepts a timestamp to maintain the call signature of the abstract Zone class, // but because of the nature of a fixed offset zone instance, the TS is ignored. const zone = FixedOffsetZone.instance(-300); expect(zone.formatOffset(0, "techie")).toBe("-0500"); // March 9th 2019. A day before DST started expect(zone.formatOffset(1552089600, "techie")).toBe("-0500"); // March 11th 2019. A day after DST started expect(zone.formatOffset(1552280400, "techie")).toBe("-0500"); }); test("FixedOffsetZone.formatOffset prints the correct sign before the offset", () => { expect(FixedOffsetZone.instance(-300).formatOffset(0, "short")).toBe("-05:00"); expect(FixedOffsetZone.instance(-30).formatOffset(0, "short")).toBe("-00:30"); // Note the negative zero results in a + sign expect(FixedOffsetZone.instance(-0).formatOffset(0, "short")).toBe("+00:00"); expect(FixedOffsetZone.instance(0).formatOffset(0, "short")).toBe("+00:00"); expect(FixedOffsetZone.instance(30).formatOffset(0, "short")).toBe("+00:30"); expect(FixedOffsetZone.instance(300).formatOffset(0, "short")).toBe("+05:00"); }); test("FixedOffsetZone.equals requires both zones to be fixed", () => { expect(FixedOffsetZone.utcInstance.equals(IANAZone.create("UTC"))).toBe(false); }); test("FixedOffsetZone.equals compares fixed offset values", () => { expect(FixedOffsetZone.utcInstance.equals(FixedOffsetZone.instance(0))).toBe(true); expect(FixedOffsetZone.instance(60).equals(FixedOffsetZone.instance(-60))).toBe(false); }); moment-luxon-93c85a3/test/zones/invalid.test.js000066400000000000000000000011121477254173100216020ustar00rootroot00000000000000/* global test expect */ import { InvalidZone } from "../../src/luxon"; test("InvalidZone", () => { const zone = new InvalidZone("foo"); expect(zone.type).toBe("invalid"); expect(zone.name).toBe("foo"); expect(zone.offsetName()).toBe(null); // the abstract class states this returns a string, yet InvalidZones return null :( expect(zone.formatOffset(0, "short")).toBe(""); expect(zone.isUniversal).toBe(false); expect(zone.offset()).toBe(NaN); expect(zone.isValid).toBe(false); expect(zone.equals(zone)).toBe(false); // always false even if it has the same name }); moment-luxon-93c85a3/test/zones/local.test.js000066400000000000000000000015471477254173100212620ustar00rootroot00000000000000/* global test expect */ import { SystemZone } from "../../src/luxon"; test("SystemZone.instance returns a singleton", () => { expect(SystemZone.instance).toBe(SystemZone.instance); }); test("SystemZone.instance provides valid ...", () => { expect(SystemZone.instance.type).toBe("system"); expect(SystemZone.instance.isUniversal).toBe(false); expect(SystemZone.instance.isValid).toBe(true); expect(SystemZone.instance).toBe(SystemZone.instance); // todo: figure out how to test these without inadvertently testing IANAZone expect(SystemZone.instance.name).toBe("America/New_York"); // this is true for the provided Docker container, what's the right way to test it? // expect(SystemZone.instance.offsetName()).toBe("UTC"); // expect(SystemZone.instance.formatOffset(0, "short")).toBe("+00:00"); // expect(SystemZone.instance.offset()).toBe(0); }); moment-luxon-93c85a3/test/zones/zoneInterface.test.js000066400000000000000000000002461477254173100227570ustar00rootroot00000000000000/* global test expect */ import { Zone } from "../../src/luxon"; test("You can instantiate Zone directly", () => { expect(() => new Zone().isValid).toThrow(); });